当前位置: 首页 > article >正文

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. YieldInstructionCustomYieldInstruction

这两种类型用于实现自定义的协程行为,尤其是 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. EventGUIStyle

这两个类型主要用于 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);
}

这些类型虽然不常见,但在需要时能极大地提升代码的灵活性和效率,特别是在处理复杂功能或优化工作流时。


http://www.kler.cn/a/459942.html

相关文章:

  • h5页面在安卓手机被软键盘弹起引起的bug
  • ==和===的区别,被坑的一天
  • C# 服务应用研究
  • 家政上门小程序如何创建?家政服务怎么能少了小程序帮手
  • 人脑处理信息的速度与效率:超越计算机的直观判断能力
  • 查询docker overlay2文件夹下的 c7ffc13c49xxx是哪一个容器使用的
  • 聊一聊GPT基本原理
  • word怎么添加链接,点击直接到参考文献
  • ID卡网络读卡器C#小程序开发
  • 视觉语言模型易受攻击?西安交大等提出基于扩散模型的对抗样本生成新方法
  • Kali Linux 文件系统详解
  • Python跨年烟花
  • 机器学习之数据分析及特征工程详细分析过程
  • Object.defineProperty() 完整指南
  • nginx平滑升级|nginx升级|解决漏洞CVE-2024-7347
  • 超越BeautifulSoup:探索Python爬虫的替代解析库
  • 线段树例题题解
  • Linux ACM 驱动程序
  • 【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2
  • Kali Linux系统上配置Git的全局代理
  • CentOS中使用SSH远程登录
  • STM32F103 I2C软件模拟(AT24C02)
  • 如何用Python爬取网站数据:基础教程与实战
  • 【AIGC-ChatGPT职业提示词指令】智能职业规划助手:基于SVG可视化的职业发展指南系统
  • JVM实战—3.JVM垃圾回收的算法和全流程
  • ubuntu18.04使用ndk编译protobuf库