碰撞器和触发器的区别:
GameObject.Find()与transform.Find()查找游戏对象的区别
GameObject root = GameObject.Find("MapRoot");
GameObject map = root.transform.Find("map").gameObject;
map.SetActive(true);
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可以这么设置transform.rotation = Quaternion.identit
创建两个cube 命名为cube1和cube2 把cube2作为cube1的子对象
可以看到,cube1的坐标(1,0,0) cube2的坐标为(0,0,5)
那么通过transform.localPosition获取cube2的坐标则为(0,0,5)
如果用transform.position获取cube2的坐标则为(1,0,5)
这就是localpostion和Position的区别
欧拉角(eulerAngles),rotation和Rotate(),都是用于旋转,那他们有什么区别呢。刚开始我也是犯糊涂
//rotate
transform.Rotate(Vector3.up * 5);
//rotation
transform.rotation = Quaternion.Euler(Vector3.up * 5);
Rotate()方法是:旋转多少度。在原有的基础上累加,即旋转了多少角度。又旋转了多少角度,是在原有的基础上在旋转
rotation属性是:旋转到某个角度,就是是在update中每帧都执行(我这里测试是放在了update中)。但每次旋转到的角度动是5,所以是旋转到5度。一直都是
比如你只想让他旋转到多少,用rotation;假如想让他一直转,可以用Rotate
当然:rotation()还可以通过插值旋转
在写脚本的时候,如果继承的不是MonoBehaviour那么在写uptdate和start,awake方法的时候先调用base的方法看看继承的类有没有写内容,如果没有提示说明没写,就可以不用写base了,否则要写的
如果看一个方法被哪个类的哪个方法调用?
shift+f12
隐式转换:
如果a是string类型,b为int,
a=b不对
a=b.toString;不对
a=b.toString();对
unity中start方法只有在脚本激活的(Enable)时候才会执行该方法,而awake方法不管脚本是否激活都会执行该方法
c#如何实现IComparable接口
public class Employee : IComparable
实现IComparable接口,Employee对象必须提供CompareTo()方法:
public int CompareTo(Employee rhs) //注意:传入的参数必须是对象本事,这样才能对对象进行排序,在方法内写是对对象的那个参数排序
{
//当前Employee对象必须把它自己跟做为参数传递进来的Employee进行对比,如果返回-1,表示它小于参数,如果大于参数则返回1,如果两者相等 则返回0。
}
在compare To方法内这样写:
这样new个arrayList存放多个Node对象,arraylist.sort();即可对Node的estimatedCost进行排序,list的第一个元素为estimatedCost最小的Node
插值运算vertor3.Lerp和圆弧插值Quaternion.Slerp的区别
在NGUI中如果create-->sprite那么创建图集里面的图片如果创建文件夹下面的图片就create-->simple texture
欧拉角:
欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。
缺点:存在别名问题:会导致两个问题,第一个是由于角度的周期性导致的,60和360度虽然一样但是数值不一样,第二个是万向锁,是由旋转轴的不独立导致的。
解决方法:
通过限制欧拉角的范围在多少到多少之间能解决插值会过多的旋转,插值导致按照长弧(补角)旋转等问题。
万向锁(gimbal lock):
1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。
2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。
注意,万向锁只有在动态也即本地坐标系旋转下存在,世界坐标系旋转(静态)不存在。万向锁产生:
在计算机计算欧拉角的时候,先绕x轴转,然后再绕y转(就要保证z轴平面不能动),最后绕z轴转(就要保证x,y轴平面不能动)
注意当物体绕y,z,x轴这样的顺序旋转时候,先转y轴一定会影响z,x轴的变化,接着转z轴一定会影响x轴变化但是不影响y轴变化,最后绕x轴旋转只影响物体本身,不影响y,z轴变化
那么有可能转动的时候,绕z轴旋转的平面和绕x轴的平面重合了,那么就丢失了一个维度,该现象叫万向锁。
解决办法:
不让绕y,z,x这样的顺序,换一种顺序,判断该物体最不可能的位置来选择按什么顺序转
欧拉旋转还有个注意点是:
transform.Rotate(new Vector3(30, 90, -40));是在世界坐标系下的旋转,第一次旋转不影响其他两个轴而transform.Rotate(new Vector3(0, 90, 0));transform.Rotate(new Vector3(30, 0, 0));transform.Rotate(new Vector3(0, 0, -40));是局部旋转,第二次旋转受到第一次旋转的影响。第三次旋转受到前两次旋转的影响
那么如果transform.Rotate(new Vector3(30, 90, -40));是按照Z、X、Y顺序,要想分步执行得到的结果一样,需要相反的顺序分步转,也即
transform.Rotate(new Vector3(0, 90, 0));transform.Rotate(new Vector3(30, 0, 0));transform.Rotate(new Vector3(0, 0, -40));这样Y,X,Z反向顺序的局部(动态)旋转和Z、X、Y的世界(静态)旋转结果一样,这是个定理。
四元数:
一个四元数用一个标量w和一个3d向量x,y,z一共四个数来表示方位,避免了万向锁的问题
一个四元数定义了复数w+xi+yj+zk的表达方式,符合复数的性质,他有三个虚部i,j,k,也可以这样q = ((x, y, z),w) = (v, w),其中v是向量,w是实数,这样的式子来表示一个四元数。
表示方法:
含义是:
如果你不想知道原理,只想在Unity里找到对应的函数来进行四元数变换,那么你可以使用这两个函数:Quaternion.Euler和Quaternion.eulerAngles。它们基本可以满足绝大多数的四元数旋转变换。
Quaternion.AngleAxis(float angle, Vector3 axis),它可以返回一个绕轴线axis旋转angle角度的四元数变换。
最后总结矩阵旋转,欧拉旋转,四元数旋转的优缺点:
矩阵旋转:
优点:
旋转轴可以是任意向量;
缺点:
旋转其实只需要知道一个向量+一个角度,一共4个值的信息,但矩阵法却使用了16个元素;
而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
欧拉旋转:
优点
便于理解,表示方便,大大简化了人机交互,方便在代码中测试和调试
缺点:需要限制欧拉角和万向锁,由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
四元数旋转:
优点:
解决万向锁,效率较高,可以提供平滑插值
缺点:
比欧拉旋转稍微复杂了一点点,因为多了一个维度;
理解更困难,不直观;