学习视频:https://www.bilibili.com/video/BV15W411976h?p=13
Input.GetAxis
塔防项目代码示例
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
float mouse = Input.GetAxis("Mouse ScrollWheel");
“Horizontal”、“Vertical”、"Mouse ScrollWheel"为项目设置,可在Edit > Project Settings > Input进行更改
Vector3
Vector3.up;
表示世界坐标系中 Y 轴正方向上的单位向量
用于编写 Vector3(0, 1, 0) 的简便方法。
Vector3.down;
表示世界坐标系中 Y 轴负方向上的单位向量
用于编写 Vector3(0, -1, 0) 的简便方法。
Vector3.left;
表示世界坐标系中 X 轴负方向上的单位向量
用于编写 Vector3(-1, 0, 0) 的简便方法。
Vector3.right;
表示世界坐标系中 X 轴正方向上的单位向量
用于编写 Vector3(1, 0, 0) 的简便方法。
Vector3.forward;
表示世界坐标系中 Z 轴正方向上的单位向量
用于编写 Vector3(0, 0, 1) 的简便方法。
Vector3.back;
表示世界坐标系中 Z 轴负方向上的单位向量
用于编写 Vector3(0, 0, -1) 的简便方法。
Vector3.magnitude
返回该向量的长度。计算方法:(xx+yy+z*z) 的平方根。
Vector3.sqrMagnitude 返回该向量的平方长度。计算方法:(xx+yy+z*z)
如果只需要比较一些向量的大小, 则可以使用 Vector3.sqrMagnitude 比较它们的平方数(省略开平方操作)
(Vector3 value).normalized
塔防项目代码示例
transform.Translate((positions[index].position - transform.position).normalized * Time.deltaTime * speed);
返回 magnitude 为 1 时的该向量。(只读)
进行标准化时,向量方向保持不变,但其长度为 1.0。
Vector3.Normalize (Vector3 value)
使该向量的 magnitude 为 1。
进行标准化时,向量方向保持不变,但其长度为 1.0。
transform 和 Transform 的区别
transform 是附加到此 GameObject 的 Transform。
Transform 是一个类,用来描述物体的位置,大小,旋转等等信息。
Translate
Translate 根据 translation 的方向和距离移动变换。
塔防项目代码示例
transform.Translate(Vector3.forward * speed * Time.deltaTime);
public void Translate(Vector3 translation);
public void Translate(Vector3 translation, Space relativeTo);
如果 relativeTo 被省略或设置为 Space.Self,则会相对于变换的本地轴来应用该移动。(在场景视图中选择对象时显示的 X、Y 和 Z 轴。) 如果 relativeTo 为 Space.World,则相对于世界坐标系应用该移动。
MonoBehaviour相关
什么时候不继承MonoBehaviour类?
如果你的类不需要引擎提供的初始化、各种物理、渲染或着色器的回调,最好不要继承 MonoBehaviour,因为游戏是需要优化节约资源的。继承后,当引擎接触事件,触发的时候,就会反射调用个各种函数,这是很需要耗费资源的。
不继承会发生什么?
- 不能使用 Invoke 和 Coroutine 了。
- 调试不方便了,不能在 Inspector 和 Debug tab 看到参数。同时如果一个类不继承 Mono,那么这个类的 List 表也无法在 Debug 界面看到。
- 不自动调用 Start,Update 等方法。
谁要继承?
GameObject 还是要继承 MonoBehaviour 的,这样才能 new 实例化一个对象,MonoBehaviour 里面的几十方法比如:
Start(), Awake(), Update(), FixedUpdate(), OnGUI(),这几个方法不管你用哪一个,必须要继承MonoBehaviour
如果有些内容不需要继承,但是有些参数需要显示在Inspector,要怎么做?
[System.Serializable]
可以在检视面板中嵌入带有子属性的类。这种类不需要继承MonoBehaviour,继承MonoBehaviour会浪费计算资源,遇到不需要继承MonoBehaviour,但是又想让这个类的子属性可以在检视面板中检视,就可以用这个
塔防项目代码示例
[System.Serializable]
public class Wave
{
public GameObject enemyPrefab;
public int count;
public float rate;
}
额外参考:Unity3d学习日记:使用[System.Serializable]
[HideInInspector]
使变量不显示在 Inspector 中,但进行序列化。
GetComponent()
从当前游戏对象获取组件T,只在当前游戏对象中获取,没得到的就返回null,不会去子物体中去寻找。
塔防项目代码示例
MapCube mapCube = hit.collider.GetComponent<MapCube>()
col.GetComponent<Enemy>().TakeDamage(damage