Unity 常用常找的东西存放
本文章由 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" 秒。
- 从存储中移除方法信息记录。
}
需要注意的是,使用 Invoke 或 InvokeRepeating 时,调试会比较困难。
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&– AltLEFT/RIGHT/UP/DOWN– Arrow keysF1…F2– F keysHOME, 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);
}
}
}
若有问题,请随时联系!非常感谢!