Unity 开发中可能用到的类型
在 Unity 和 C# 中,有一些相对不常见但非常有用的类型,可以用来实现特殊功能。比如 Flags
属性和其他一些较少用的类型。
1. Flags 枚举(Flags Attribute)
Flags 是一种特殊的枚举,用于表示二进制标志组合,非常适合用作位掩码(Bit Mask)。
使用场景:
- 表示多个布尔值的组合状态。
- 用按位操作(
|
、&
)进行状态管理。
示例:
[System.Flags]
public enum GameState
{
None = 0, // 0000
Playing = 1 << 0, // 0001
Paused = 1 << 1, // 0010
GameOver = 1 << 2, // 0100
Victory = 1 << 3 // 1000
}
public class GameManager : MonoBehaviour
{
public GameState currentState;
void Start()
{
currentState = GameState.Playing | GameState.Paused; // 设置多个状态
Debug.Log(currentState); // 输出 "Playing, Paused"
if ((currentState & GameState.Playing) != 0)
{
Debug.Log("Game is currently playing.");
}
}
}
2. ScriptableObject
ScriptableObject
是 Unity 中一种特殊的类类型,用于保存共享的数据。它的实例存储在独立的资产文件中,常用于配置数据或跨场景共享数据。
示例:
[CreateAssetMenu(fileName = "NewGameData", menuName = "Game Data")]
public class GameData : ScriptableObject
{
public string playerName;
public int highScore;
}
public class GameManager : MonoBehaviour
{
public GameData gameData;
void Start()
{
Debug.Log($"Player Name: {gameData.playerName}, High Score: {gameData.highScore}");
}
}
3. YieldInstruction
和 CustomYieldInstruction
这两种类型用于实现自定义的协程行为,尤其是 CustomYieldInstruction
,可以帮助创建复杂的协程等待逻辑。
示例:
public class WaitForCondition : CustomYieldInstruction
{
private System.Func<bool> condition;
public WaitForCondition(System.Func<bool> condition)
{
this.condition = condition;
}
public override bool keepWaiting => !condition();
}
public class Example : MonoBehaviour
{
private bool isReady = false;
IEnumerator Start()
{
yield return new WaitForCondition(() => isReady);
Debug.Log("Condition met!");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
isReady = true;
}
}
}
4. Event
和 GUIStyle
这两个类型主要用于 Unity 的 IMGUI 系统,在处理低级事件或绘制自定义编辑器工具时非常有用。
示例(处理鼠标事件):
void OnGUI()
{
Event e = Event.current;
if (e.type == EventType.MouseDown)
{
Debug.Log($"Mouse Clicked at: {e.mousePosition}");
}
}
5. WaitForSecondsRealtime
与 WaitForSeconds
类似,但忽略 TimeScale 的影响(即不受暂停或加速影响)。
示例:
IEnumerator Start()
{
Debug.Log("Waiting for 3 seconds (real time)...");
yield return new WaitForSecondsRealtime(3);
Debug.Log("Done!");
}
6. Matrix4x4
一个 4x4 的矩阵,用于高级数学运算,尤其是在自定义的图形变换或着色器中。
示例:
void Start()
{
Matrix4x4 matrix = Matrix4x4.TRS(Vector3.one, Quaternion.identity, Vector3.one);
Debug.Log(matrix);
}
这些类型虽然不常见,但在需要时能极大地提升代码的灵活性和效率,特别是在处理复杂功能或优化工作流时。