unity經常使用小知識點

感受本身抑鬱變得更嚴重了,超級敏感,常常想崩潰大哭,睡眠超差,實在不想藥物治療,多看看書,多約約朋友,多出去走走。ide

來幾句雞湯吧,人必定要活得明白一點,任何關係都不要不清不楚,說不定最後受傷的就是自個。另外,心裏儘可能變得強大一點,這樣世界便會美好不少。函數

ok,吐槽到此,開始正題吧,今天說幾個unity的經常使用知識點,最近博客更得比較少,好像更習慣用有道筆記。優化

 

1.GetComponentInChildren()、GetComponentsInChildren() 包含本身和全部子對象
 
2.Instantiate
GameObject newGo = Instantiate (GameObject.Find("Cube"),Vector3.zero,Quaternion.identity,GameObject.Find("Father").transform);
newGo 的世界座標Vector3.zero,世界旋轉Quaternion.identity,父對象GameObject.Find("Father").transform
 
3.計算物體大小
總的來講三種方式:分別可經過 MeshRenderer,MeshFilter,collider這3個組件來獲取。
 
(1)根據 MeshRenderer這個值的結果 真實反應出有MeshRenderer這個組件的模型的尺寸。不須要再乘以localScale.x。
 
(2)經過MeshFilter得到原始模型的mesh,該值返回的結果是原始mesh的尺寸。
若要得到模型的尺寸大小還須要乘以模型的localScale.x。
即:gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x*gameObject.transform.localScale.x;
 
(3)爲物體添加Collider,而後使用XXX.collider.bounds.size;
這個不必定能很好的反應物體的大小,bounds得到的是物體的外包矩形。並且這個外包矩形的X,Y,Z和世界座標一致。所以,若物體有旋轉,得到的尺寸就不能反應出物體的真實大小,只是其外包矩形的大小。。。
如:得到terrain的尺寸
       
 terrainWidth = terrain.collider.bounds.size.x;
 terrainLength = terrain.collider.bounds.size.z;
 terrainHeight = terrain.collider.bounds.size.y; 
我的偏心 (2)
獲取複雜物體的真實尺寸
//計算物體真實尺寸
        public static Vector3 getTargetSizeByRender(GameObject target){
            Vector3 vec = Vector3.one;
            Quaternion localQuaternion = target.transform.rotation;
            target.transform.rotation = Quaternion.identity;
            var renders = target.transform.GetComponentsInChildren<Renderer> ();
            if (renders.Length > 0) {
                Bounds bounds = renders [0].bounds;
                for (int i = 1; i < renders.Length; i++) {
                    bounds.Encapsulate (renders [i].bounds);
                }
                vec = bounds.size;
            }
            target.transform.rotation = localQuaternion;
            return vec;
        }

  當物體中有粒子特效,會影響計算結果,這時判斷renders [i]的gameObject是否有粒子系統組件,若是有,將循環continue調就好了。總之,根據本身的項目需求在這個基礎上作一些計算優化就好了,多動動腦筋。ui

 
4.Invoke()
Invoke是一種委託方法。
void Invoke(string methodName, float time) ,第一個參數是要調用的函數名,後一個參數是延遲的時間。
意思爲:在time時間後調用函數名爲methodName方法。設置完methodName函數的執行時間後,程序會接着往下執行,並不會等methodName函數執行。而協程能夠等某個操做完成以後再執行後面的代碼。
使用 Invoke() 方法須要注意 3點:
(1)它應該在 腳本的生命週期裏的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被調用;
這個不是很明白,例以下面代碼
void Start () {
        Test ();
        Debug.Log ("start");
    }
    void TestInvoke(){
        Debug.Log ("TestInvoke");
    }
    void Test(){
        Debug.Log ("Test");
        Invoke ("TestInvoke",5f);
}
 
中 TestInvoke 能夠被調用。
(2)Invoke(); 不能接受含有 參數的方法;
(3)在 Time.ScaleTime = 0; 時, Invoke() 無效,由於它不會被調用到
Invoke() 也支持重複調用:void InvokeRepeating(string methodName, float time, float repeatRate);
意思是指:time秒後調用 調用函數名爲methodName方法,而且以後每隔 repeatRate秒調用一次調用函數名爲methodName方法。
相關文章
相關標籤/搜索