1、Vector3.magnitude 长度
返回向量的长度(只读)。
向量的长度是
如果你需要比较一些向量的长度,你可以比较它们长度的平方,使用sqrMagnitude(计算平方很快)。
所以:比较向量的长度时,用下面的sqrMagnitude方法最好!
当在update中检测人物位置距离目标位置时用sqrMagnitude也最好不过了!
类似这样:if ((perpos - targetPosition).sqrMagnitude < 1.0f){ }
2、Vector3.sqrMagnitude 长度平方
返回这个向量的长度的平方(只读)。
向量的长度是用勾股定理计算出来,计算机计算两次方和开根的运算量比加减法要费时的多。所以如果是想比较两个向量的长度,用sqrMagnitude可以快出很多。
3、Vector3.Normalize()/ Vector3.normalized 归一化
相同点:使向量的长度为1,当归一化的,一个向量保持相同的方向,但它的长度为1.0。如果这个向量太小而不能被归一化,一个零向量将会被返回。
不同点:Vector3.Normalize()这个方法将改变当前向量Vector3,即Vector3将变为归一化向量,而normalized是Vector3的一个字段,是用来获取此Vector3的归一化向量的,并不会改变Vector3的值的!
4、Mathf.Clamp 钳制
static float Clamp(float value, float min, float max)
限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value
5、Enabled
gameObject.renderer.enabled:是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的
6、Destroy
表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放 而是在你下下个场景中槽释放内存资源,就是你a场景中Destroy了 一般是在c场景中才真正释放该物体的内存资源
7、Active
是否在场景中停用该物体 在你gameObject.active =false中 则你在场景中用find找不到该物体
如果该物体有子物体 你要用SetActiveRecursively(false) 来控制是否在场景中停用该物体(递归的),SetActiveRecursively方法可以递归实现父类与子类的状态统一,但是因为子类无法记得自己原来的状态,所以被标记已过时,只能使用SetActive,但是实验得出SetActive无法递归到子物体,因为unity不想破坏子类原有的状态,那么要想实现子类与父类状态统一,那么解决方案如下:
void DeactivateChildren(GameObject g, bool a) //g为父类对象,递归子类实现状态统一 { g.SetActive(a); foreach (Transform child in g.transform) { DeactivateChildren(child.gameObject, a); } }
使用activeSelf只读属性来判断对象自身的激活状态,而不会考虑他的父类是什么状态
使用activeInHierarchy只读属性来判断自身的激活状态,但是会考虑父类的激活状态的:
只要父类和子类有一个状态为false,那么此子类的activeinHierarchy就为false,
而父类的状态activeInHierarchy是和activeSelf一样的
如果父类active被设为false,那么就无法找到子类,
如果父类active被设为true,那么子类中active为false的将找不到
8、Input.GetAxis("Horizontal")
Input.GetAxis("Horizontal") 表示水平方向,即键盘左右键,
当你一直按着键盘的左键,那么获得的返回值会从0一直减少到-1(不会小于-1),如果松掉键盘左键,那么值就会从-1慢慢回升到0,(总区间为-1~0)
当你一直按着键盘的右键,那么获得的返回值会从0一直增长到1(不会大于1),如果松掉键盘右键,那么值就会从1慢慢减少到0,(总区间为0~1)
Input.GetAxis("Vertical")则为垂直方向,值区间:左键(-1~0) 右键(0~1)
这个函数的参数是unity中的“轴”的概念,轴可以再edit— projrct setting—input中设置,unity最多可以设置17个轴。事实上,每个轴对应于键盘或者鼠标的某种动作。
9、Transform.TransformPoint 变换点
C#
⇒ Vector3 TransformPoint(Vector3 position) 传入的参数即为“位置点”
简单来说就是以当前物体为世界坐标原点,以当前物体的方向为世界坐标的方向来看的。
比如:
var someObject : GameObject; thePosition = transform.TransformPoint(Vector3.right * 2); Instantiate(someObject, thePosition, someObject.transform.rotation);
这个自带的例子,是在当前物体自身坐标轴的x的轴向上上2个单位的地方实例化。
而不是在世界坐标轴的(2, 0, 0)的位置实例化
10、Transform.TransformDirection 变换方向
C#
⇒ Vector3 TransformDirection(Vector3 direction);可以看出传的参数是表示”方向“的三维坐标
其作用就是找出当前对象的某个方向在世界坐标中的方向(因为对象有可能由于旋转而造成对象的本地方向和世界坐标方向不一致)
假如对象的Rotation为(0,0,0),那么此时对象的Transform.forward就等于世界坐标的方向Verctor.forward
如果对象绕x轴旋转了90°,那么此时对象的z轴方向向下,z轴为对象向前方向,如果想获得对象向前方向可以使用transform.forward和transform.TransformDirection(Vector3.forward),两者效果是一样的!
11、Transform.Rotation旋转
function Update() { //沿着x轴每秒1度慢慢的旋转物体 transform.Rotate(Vector3.right * Time.deltaTime); //相对于世界坐标沿着y轴每秒1度慢慢的旋转物体 transform.Rotate(Vector3.up * Time.deltaTime, Space.World); }
function Update() { //围绕x轴每秒1度,慢慢的旋转物体 transform.Rotate(Time.deltaTime, 0, 0); //围绕x轴每秒10度 transform.Rotate(Time.deltaTime*10, 0, 0); //相对于世界坐标,围绕y轴每秒1度,慢慢的旋转物体 transform.Rotate(0, Time.deltaTime, 0, Space.World); }
另外:Vector3.right表示物体绕x轴旋转 Vector3.left 表示相对的逆时针旋转
Vector3.Up表示物体绕y轴旋转 Vector3.down表示相对的逆时针旋转
Vector3.forward 表示物体绕z轴旋转 Vector3.back表示相对的逆时针旋转
void Update() { transform.Rotate(Vector3.right * Time.deltaTime); print(“rotationx=” + transform.localEulerAngles.x); print("time=" + Time.timeSinceLevelLoad); }
输出结果为:图左
void Update() { transform.Rotate(Vector3.right); print("rotationx=" + transform.localEulerAngles.x); print("time=" + Time.timeSinceLevelLoad); }
输出结果如图:图右
void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) Debug.DrawLine(ray.origin, hit.point); }