Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

150 行
4.7 KiB

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Experimental.Rendering.Universal.Path2D.GUIFramework;
namespace UnityEditor.Experimental.Rendering.Universal.Path2D
{
internal abstract class RectSelector<T> : ISelector<T>
{
public Action<ISelector<T>, bool> onSelectionBegin;
public Action<ISelector<T>> onSelectionChanged;
public Action<ISelector<T>> onSelectionEnd = null;
private GUISystem m_GUISystem;
private Control m_RectSelectorControl;
private GUIAction m_RectSelectAction;
private Vector3 m_RectStart;
private Vector3 m_RectEnd;
private Rect m_GUIRect;
private IDrawer m_Drawer = new Drawer();
public Rect guiRect
{
get { return m_GUIRect; }
}
public RectSelector() : this(new GUISystem(new GUIState())) { }
public RectSelector(GUISystem guiSystem)
{
m_GUISystem = guiSystem;
m_RectSelectorControl = new GenericDefaultControl("RectSelector")
{
position = (guiState) =>
{
return GUIToWorld(guiState, guiState.mousePosition);
},
forward = (guiState) =>
{
if (Camera.current)
return Camera.current.transform.forward;
return Vector3.forward;
},
right = (guiState) =>
{
if (Camera.current)
return Camera.current.transform.right;
return Vector3.right;
},
up = (guiState) =>
{
if (Camera.current)
return Camera.current.transform.up;
return Vector3.up;
}
};
m_RectSelectAction = new SliderAction(m_RectSelectorControl)
{
enableRepaint = (guiState, action) =>
{
var size = m_RectStart - m_RectEnd;
return size != Vector3.zero && guiState.hotControl == action.ID;
},
onClick = (guiState, control) =>
{
m_RectStart = GUIToWorld(guiState, guiState.mousePosition);
m_RectEnd = m_RectStart;
m_GUIRect = CalculateGUIRect();
},
onSliderBegin = (guiState, control, position) =>
{
m_RectEnd = position;
m_GUIRect = CalculateGUIRect();
if (onSelectionBegin != null)
onSelectionBegin(this, guiState.isShiftDown);
},
onSliderChanged = (guiState, control, position) =>
{
m_RectEnd = position;
m_GUIRect = CalculateGUIRect();
if (onSelectionChanged != null)
onSelectionChanged(this);
},
onSliderEnd = (guiState, control, position) =>
{
if (onSelectionEnd != null)
onSelectionEnd(this);
},
onRepaint = (guiState, action) =>
{
m_Drawer.DrawSelectionRect(m_GUIRect);
}
};
m_GUISystem.AddControl(m_RectSelectorControl);
m_GUISystem.AddAction(m_RectSelectAction);
}
private Vector3 GUIToWorld(IGUIState guiState, Vector2 guiPosition)
{
var forward = Vector3.forward;
if (guiState.HasCurrentCamera())
forward = Camera.current.transform.forward;
return guiState.GUIToWorld(guiPosition, forward, Vector3.zero);
}
private Rect CalculateGUIRect()
{
return FromToRect(HandleUtility.WorldToGUIPoint(m_RectStart), HandleUtility.WorldToGUIPoint(m_RectEnd));
}
private Rect FromToRect(Vector2 start, Vector2 end)
{
Rect r = new Rect(start.x, start.y, end.x - start.x, end.y - start.y);
if (r.width < 0)
{
r.x += r.width;
r.width = -r.width;
}
if (r.height < 0)
{
r.y += r.height;
r.height = -r.height;
}
return r;
}
public void OnGUI()
{
m_GUISystem.OnGUI();
}
bool ISelector<T>.Select(T element)
{
return Select(element);
}
protected abstract bool Select(T element);
}
}