Unity总结七

碰撞器和触发器的区别:

要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器
物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。

unity3d中的碰撞器和触发器的区别?
 
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
 
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器

GameObject.Find()与transform.Find()查找游戏对象的区别

GameObject.Find()只能find没有被隐藏的游戏对象,而我们的UI对象一开始就隐藏了,所以使用GameObject.Find()找到的为null。
解决办法:使用GameObject.Find()找这个UI的父亲或随便祖先(只要他的上级是非隐藏的就可以了);然后再对祖先使用transform.Find()方法即可找到这个隐藏的UI。

GameObject root = GameObject.Find("MapRoot");

GameObject map = root.transform.Find("map").gameObject;  

map.SetActive(true);


unity3d 的Quaternion.identity和transform.rotation区别是什么

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接口

像所有集合类一样,List实现了Sort()方法,它允许您对所有实现了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(3090, -40));是在世界坐标系下的旋转,第一次旋转不影响其他两个轴而transform.Rotate(new Vector3(0900));transform.Rotate(new Vector3(3000));transform.Rotate(new Vector3(00, -40));是局部旋转,第二次旋转受到第一次旋转的影响。第三次旋转受到前两次旋转的影响

那么如果transform.Rotate(new Vector3(3090, -40));是按照Z、X、Y顺序,要想分步执行得到的结果一样,需要相反的顺序分步转,也即

transform.Rotate(new Vector3(0900));transform.Rotate(new Vector3(3000));transform.Rotate(new Vector3(00, -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.EulerQuaternion.eulerAngles。它们基本可以满足绝大多数的四元数旋转变换。

Quaternion.AngleAxis(float angle, Vector3 axis),它可以返回一个绕轴线axis旋转angle角度的四元数变换。

如果我们需要对旋转进行插值,我们可以首先使用 Quaternion .eulerAngles 来得到欧拉角度,然后使用 Mathf.Clamp 对其进行插值运算。
最后更新Quaternion.eulerAngles或者使用Quaternion.Euler(yourAngles)来创建一个新的四元数。


最后总结矩阵旋转,欧拉旋转,四元数旋转的优缺点:

矩阵旋转:

优点:

旋转轴可以是任意向量;

缺点:

旋转其实只需要知道一个向量+一个角度,一共4个值的信息,但矩阵法却使用了16个元素;

而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;

欧拉旋转:

优点

便于理解,表示方便,大大简化了人机交互,方便在代码中测试和调试

缺点:需要限制欧拉角和万向锁,由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;

四元数旋转:

优点:

解决万向锁,效率较高,可以提供平滑插值

缺点:

比欧拉旋转稍微复杂了一点点,因为多了一个维度;

理解更困难,不直观;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值