嗯。。把你的SceneView变成2D画布一共需要两步。
第一步是把它变成2D。
第二步是把它变成画布。
通过代码控制SceneView的摄像机进入2D模式。
炒鸡简单,SceneView里提供了一个字段叫做in2DMode,开启它会使SceneView的摄像机变成正交相机并且锁定在Z轴上。
以下代码呈现了这种切换的主要部分:
bool _enabled;
SceneView _sceneView;
private bool _restoreCamera2DMode;
private Vector3 _restoreCamearPosition;
private void SetEnabled(bool value)
{
if (_enabled != value)
{
if (value)
{
_sceneView = SceneView.lastActiveSceneView;
if (_sceneView == null) return;
_restoreCamera2DMode = _sceneView.in2DMode;
_restoreCamearPosition = _sceneView.pivot;
_sceneView.in2DMode = true;
_sceneView.LookAt(new Vector3(0, 0, -10));
_sceneView.Repaint();
}
else
{
_sceneView.in2DMode = _restoreCamera2DMode;
_sceneView.LookAt(_restoreCamearPosition);
}
_enabled = value;
}
}
重载掉SceneView上原生的鼠标输入,让你可以自定制画布相关的逻辑。
首先你最好把所有unity的Tool状态置为空。什么是Tool呢?
看图:
最左边的图标是ViewTool,其余四个图标是Tool。
你需要这样做:
Tools.current = Tool.None;
Tools.viewTool = ViewTool.None;
然后屏蔽掉unity的内置逻辑,用自己的逻辑来代替。
void OnSceneGUI(SceneView scene)
{
Event e = Event.current;
Vector2 mousePosition = e.mousePosition;
// View point to world point translation function in my game.
this._mousePosition = SceneScreenToWorldPoint(mousePosition);
// Block SceneView's built-in behavior
HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
// ------------------------------
// Your Custom OnGUI Logic
// ------------------------------
if (Event.current.type == EventType.MouseDown) Event.current.Use();
if (Event.current.type == EventType.MouseMove) Event.current.Use();
}
private Vector3 SceneScreenToWorldPoint(Vector3 sceneScreenPoint)
{
Camera sceneCamera = _sceneView.camera;
float screenHeight = sceneCamera.orthographicSize * 2f;
float screenWidth = screenHeight * sceneCamera.aspect;
Vector3 worldPos = new Vector3(
(sceneScreenPoint.x / sceneCamera.pixelWidth) * screenWidth - screenWidth * 0.5f,
((-(sceneScreenPoint.y) / sceneCamera.pixelHeight) * screenHeight + screenHeight * 0.5f),
0f);
worldPos += sceneCamera.transform.position;
worldPos.z = 0f;
return worldPos;
}
最后,为了让这一切可以起作用,你需要在切换进画布模式的时候把OnSceneGUI注册给SceneView才行。
SceneView.onSceneGUIDelegate += OnSceneGUI;
现在,你可以尝试在编辑器中做各种2D刷子了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。