Unity3D學習筆記(二):個體層次、絕對和局部坐標、V3平移旋轉


Directional Light:平行光源/方向性光源,用來模擬太陽光(角度只與旋轉角度有關,與位置無關)
Point Light:點光源,用來模擬燈泡,向四周發散光源
Spotlight:錐光源/聚光燈,用來模擬手電筒,燈塔等光源,向一個方向擴散性發散光源
Area Light:區域光,用於烘焙光照貼圖,上面這三種光源可以用於實時渲染,也可以用於烘焙光照貼圖
通過代碼控制光源旋轉、顏色、強度,可以做出24h光線變幻,日月輪轉
----Intensity光線強度,默認1,關閉0
----Shadow Type陰影類型,柔性陰影更耗資源
----Intensity Multiplier反射光
----Spot Angle錐光源的角度
燈光控制
LightType是枚舉類型
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyLight : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        Light light = GetComponent<Light>();
        light.intensity = 1;
        //int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
        if (light != null)
        {
            Debug.Log(light.intensity);
        }
    }
    // Update is called once per frame
    void Update()
    {
    }
}
 
UNITY關於陰影打開關閉的設置

對於單個物體可以在Mesh Renderer中的Cast Shadows選擇是否產生陰影,Receive Shadows中選擇是否接受陰影;
對於整個地圖可以在光源的inspector面板打開和關閉。

 
父子物體:
在層級視圖中,將一個游戲物體拖拽到另一個游戲物體下面,就變成了父子物體關系。
特點:子物體動,父物體不動;父物體動,子物體跟隨移動。
作用:拼接游戲物體。
Center:父子物體的幾何中心
Pivot:選中物體的幾何中心
注意:當形成父子物體關系后,在檢視面板中(在代碼中不同)子物體的Transform下的屬性是相對於父物體的值。比如position就是相對於父物體坐標為坐標原點的相對坐標。
當游戲物體沒有父物體,世界就是父物體,這個時候坐標就是相對於世界的坐標位置。
在C#代碼中所有物體都是世界坐標。
兩個游戲物體的關聯,本質上是把兩個兩個游戲物體Transform的關聯在一起。
 
建立父子關系
API:Application Programer Interface //應用程序編程接口,拿到Unity來說,有一些需要用到的功能,unity已經幫你寫好了,直接拿來用就可以得到想要的結果,不需要自己重新寫,而且也不必須知道到底是怎么實現的。
查找游戲物體:
GameObject.Find(string name);//通過游戲物體的名字來查找游戲物體的引用。但是,正常開發過程中,尤其是在頻繁的查找過程中,不建議使用Find。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Find_Parent : MonoBehaviour
{
    public GameObject sphere;
    // Use this for initialization
    void Start()
    {
        //如何在整個場景中查找游戲物體
        //查找寫成靜態方法,是工具,不是某一個對象的方法
        sphere = GameObject.Find("Find_Parent/Sphere");
        Debug.Log(sphere.name);
        //建立父子關系,需要關聯transform
        gameObject.transform.parent = sphere.transform;
    }
    // Update is called once per frame
    void Update()
    {
        //不要在Update進行查找,GameObject.Find("Sphere");
        //要建一個全局的sphere初始化
        //移動父物體,子物體也會動
        if (sphere)
        {
            sphere.transform.Translate(new Vector3(0, 0, 0.1f));
            //    //或者
            //    sphere.transform.Translate(Vector3.forward * 0.1f);
        }
    }
}
 

Unity找到父物體下的子物體

GameObject obj = GameObject.Find("Image Bg"); //首先找到父物體 GameObject zhen = obj.transform.Find("zhen").gameObject; //然后找到父物體下的子物體

 

GetComponent推薦使用泛型的重載
1、用代碼獲取組件
T:GetComponent<T>()//如果獲取Transform,就可以直接寫Transform,是Component類中的一個只讀的成員屬性,代表着當前這個組件對象所掛載的游戲物體身上的Transform組件的引用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetComponent : MonoBehaviour {
       // Use this for initialization
       void Start () {
        Transform trans = GetComponent<Transform>();
        //GetComponent獲取組件的方法,加()表執行
        //GetComponent獲取不到組件,會返回空引用變量(空指針),在使用的時候,會報空引用異常的錯誤
        Transform trans = null;
        Debug.Log(trans.position);
        if (trans != null)
        {
            Debug.Log(trans.position);
        }
        //transform
        transform.position = new Vector3(1, 2, 3);//不能只修改transform.position某個分量的值,需要對transform.position整體重新賦值,才會有返回值
        Debug.Log(transform.position);
    }
    // Update is called once per frame
    void Update () {
              
       }
}
 
2、用代碼動態添加組件
gameObject可以直接在繼承自component的類中使用,代表着當前組件所掛載的游戲物體的引用。
T:gameObject.AddComponent<T>() 當完成添加組件的任務之后,會返回這個組件的引用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddComponent : MonoBehaviour {
    // Use this for initialization
    void Start () {
        Light light = gameObject.AddComponent<Light>();
        light.intensity = 1;
        light.type = LightType.Spot;
        light.color = Color.green;
        Destroy(light, 5.0f);
    }
    // Update is called once per frame
    void Update () {
              
       }
}
 
3、用代碼動態移除組件
Destroy(Object obj);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Destroy : MonoBehaviour {
       // Use this for initialization
       void Start () {
        AudioSource audio = GetComponent<AudioSource>();
        if (audio)//audio是傳進來的引用
        {
            Destroy(audio);
            //5秒后銷毀audio引用
            Destroy(audio, 5);
            //5秒后銷毀Lesson3腳本組件
            Destroy(this, 5);
        }
    }
    // Update is called once per frame
    void Update () {
              
       }
}
 
平移:transform.Translate(Vector3 translation);
transform.Translate (vector.forward) :移動的是自身坐標系的方向
transform.position += vector.forward:移動世界坐標系的方向
向量 * 標量,控制速度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
    public float moveSpeed = 0.5f;
    // Use this for initialization
    void Start()
    {
        // transform.position = new Vector3(3.0f, 3.0f, 3.0f);//不要放在循環里用,調用一次就夠了
    }
    // Update is called once per frame
    void Update()
    {
        if (transform.position.z < 10.0f)
        {
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        }
        else
        {
            transform.position = new Vector3(3.0f, 3.0f, 3.0f);
        }
        //每幀z軸都移動0.1f,當前坐標加上新坐標,再返回給原坐標
        transform.position += new Vector3(0, 0, 0.1f);
        //Translate平移
        transform.Translate(new Vector3(0, 0, 0.1f));
        //自定義myTranslate
        myTranslate(new Vector3(0, 0, 0.1f));
    }
    void myTranslate(Vector3 translation)
    {
        transform.position += new Vector3(0, 0, 0.1f);
    }
}
 
平移控制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveControl : MonoBehaviour
{
    private float moveSpeed = 2;
    // Use this for initialization
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))
        {
            this.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
        }
        if (Input.GetKey(KeyCode.S))
        {
            this.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed);
        }
        if (Input.GetKey(KeyCode.A))
        {
            this.transform.Translate(Vector3.left * Time.deltaTime * moveSpeed);
        }
        if (Input.GetKey(KeyCode.D))
        {
            this.transform.Translate(Vector3.right * Time.deltaTime * moveSpeed);
        }
    }
}
 
旋轉:transform.Rotate(Vector3 eulerAngles);
transform.Rotate (vector.up) :繞着自身坐標系的方向旋轉
transform.eulerAngles += vector.up:繞着世界坐標系的方向旋轉
transform.eulerAngles = new Vector3(90,0,0);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class position_eulerAngles : MonoBehaviour {
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
        transform.position += Vector3.back * 0.05f;
        transform.eulerAngles += Vector3.up;
    }
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotate : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        //旋轉
        //歐拉角
        transform.eulerAngles += new Vector3(0, 0, 0.1f);
        transform.eulerAngles += Vector3.up;
        //旋轉的API是Rotate
        transform.Rotate(Vector3.up);
    }
}
 
為什么要繼承MonoBehaviour
MonoBehaviour繼承於Behaviour

Behaviour繼承於Component,Component是所有組件的基類,enabled:組件是否激活

Object是Component的基類,組件的本質是Object類

GetComponent獲取不到組件,會返回空引用變量(空指針),在使用的時候,會報空引用異常的錯誤

 
Unity復習
cookie燈光遮罩效果(平行光源,點光源,椎光源)
jpg圖片沒有Alpha通道,需要從灰度生成Alpha通道,最好用png圖片

點光源,立方體貼圖(六個面可以不一樣),cookie

Halo光暈

Layer:給游戲物體添加層

Culing Mask遮罩剔除:光源對那些層(游戲物體)起作用

子物體從父物體拖出,會疊加上父物體的Transform,Position和Rotation做加法,Scale做乘法

F12進入定義,a是alpha通道

拖拽游戲物體到腳本組件,可以自動賦值

添加路徑路點,“/”代表搜索路徑,加上路徑可以減少搜索次數
implicit:隱式轉換
operator重載:if(exists != null) 可以簡寫為 if(exists)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM