Unity 常用常找的东西存放

2016年03月16日 13:48 0 点赞 0 评论 更新于 2025-11-21 13:34

本文章由 cartzhang 编写,转载请注明出处。所有权利保留。 文章链接:http://blog.csdn.net/cartzhang/article/details/50483316 作者:cartzhang

在 Unity 开发过程中,有很多常用的代码片段和知识点需要经常查找,本文将对这些内容进行整理和记录,方便开发者随时查阅。

1. 相机射线

在 Unity 中,我们可以使用相机射线来实现一些交互功能,例如点击物体等。以下是获取相机射线的代码示例:

var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = ray.GetPoint(10.0f);
transform.LookAt(ray.GetPoint(10.0f));

上述代码通过 Camera.main.ScreenPointToRay 方法将鼠标位置转换为一条从相机发出的射线,然后可以使用射线的相关方法获取射线在特定距离上的点。

2. 提高效率

在 Unity 开发中,GetComponent()FindObjectByType()Instantiate() 这些方法的调用开销较大,应尽量少使用。频繁调用这些方法会影响游戏的性能,尤其是在循环中调用时,可能会导致帧率下降。

3. InvokeRepeating 的内部实现

InvokeRepeating 是 Unity 中用于重复调用某个方法的函数,其内部实现过程如下:

{
1. 找到要调用的函数方法名称,并进行存储。
2. 等待指定的调用时间,使用 WaitForSeconds(time) 实现等待。
3. 进入循环,直到用户取消该操作:
- 调用存储的函数方法。
- 等待指定的重复时间,同样使用 WaitForSeconds(repeatRate) 实现等待。
4. 删除记录保存的方法信息。
}

4. Coroutine 和 InvokeRepeating

协同程序(Coroutine)

协同程序不是多线程,但它有自己的堆栈、局部变量和指令指针,并且与其他协同程序共享全局变量等信息。在多处理器环境下,多线程可以同时运行,而协同程序在某一时刻只有一个在运行。

如果有一个复杂的任务,非常消耗帧率,那么可以考虑使用协同程序或 InvokeRepeating。但如果是简单任务,不建议使用协同程序或 InvokeRepeating,因为这并不会提高效率。不过,也不必过于死板,尽管使用它们可能会降低效率,但代码会更简单和实用。

协同程序是处理时间序列的一种很好的方法,它既不是线程也不是异步操作。当脚本未激活或对象未激活时,协同程序不可用,并且协同程序返回时间的 WaitForSeconds 依赖于 Time.timeScale

InvokeRepeating

InvokeRepeating 的具体实现如下:

void (string methodName, float time, float repeatRate)
{
- 查找调用程序集中名为 "methodName" 的方法并存储它。
- 通过 WaitForSeconds(time) 等待 "time" 秒。
- 进入循环,直到用户取消此操作:
- 调用存储的方法。
- 通过 WaitForSeconds(repeatRate) 等待 "repeatTime" 秒。
- 从存储中移除方法信息记录。
}

需要注意的是,使用 InvokeInvokeRepeating 时,调试会比较困难。

5. 常用属性

ContextMenu

在面板功能中增加选项。

ContextMenuItemAttribute

为编辑器添加右键操作,例如 [ContextMenuItem("Reset", "ResetName")]

HeaderAttribute

在变量前面增加说明,例如 [Header("魔法值")]

MultilineAttribute

用于多行文本输入,例如 [MultilineAttribute]

RangeAttribute

限制输入范围。

RequireComponent

表示依赖组件,例如 [RequireComponent(typeof(Rigidbody))]

[Space(10)]

在面板上增加一个空行。

[Tooltip("This year is 2015!")]

鼠标移到对象上时,显示提示信息。

6. MenuItem 设置快捷键

可以使用 MenuItem 为菜单选项设置快捷键,例如 [MenuItem("Tools/New Option %#a")]。菜单快捷键设置可以单独使用,也可以组合使用,具体如下:

  • % – CTRL on Windows / CMD on OSX
  • # – Shift
  • & – Alt
  • LEFT/RIGHT/UP/DOWN – Arrow keys
  • F1…F2 – F keys
  • HOME, END, PGUP, PGDN

7. AddForce 和 velocity 的区别

这实际上是力与速度的区别。当使用 AddForce 施加恒力时,对象会获取加速度,然后加速前进;而直接使用 velocity 时,速度会很平稳,对象的移动为恒定值。

8. 检查哪个按键被按下

以下是一个用于检测哪个按键被按下的代码示例:

public void DetectPressedKeyOrButton()
{
foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
{
Debug.Log("KeyCode down: " + kcode);
}
}
}

若有问题,请随时联系!非常感谢!

作者信息

洞悉

洞悉

共发布了 3994 篇文章