Unity3D開發飛盤射擊案例之角色控制(十六)

本節要點

1.鼠標控制手臂朝向

1.使用射線控制手臂朝向

主攝像機發射射線,與場景中的物體碰撞,獲取一個碰撞點,然后手臂“朝向”

這個點。


Transform.LookAt(Vector3):朝向(面向)世界中的一個點。


2.場景背景模型添加碰撞器組件

添加 Mesh Collider 組件,使用簡模進行碰撞檢測。

簡模模型的作用:降低物理運算資源消耗,提高游戲性能;


Vertices(verts):頂點個數,Mesh 網格是由頂點組成面,面組成體。

頂點個數越少,計算量越小。



3.控制手臂的旋轉軸

手臂應該是以肩關節為軸進行旋轉。

和 Unity 初級課程上部《瘋狂教室》案例中旋轉門的處理方式一樣,新建父物

體,通過父物體控制子物體。


4.Debug 繪制測試線

槍口到碰撞點直接繪制一根測試線。




Debug.DrawLine(Vector3, Vector3, Color):繪制線

和 Debug.DrawRay()用法一樣。




Transform.FindChild(string):在當前物體的子物體中查找游戲物體。

2.槍口添加激光特效

1.槍口位置添加 LineRenderer 組件

在槍口這個空游戲物體上添加 LineRenderer 組件,設置相關屬性。



LineRenderer.SetPosition(int,Vector3):設置線的位置。

int:位置的索引值;

Vector3:該位置所在的坐標值;


2.從其他項目中導出資源包

選中 Project 面板中相應的資源,然后鼠標右鍵-->Export Package...


關鍵代碼

Weapon

public class Weapon : MonoBehaviour {

    //手臂指向鼠標點擊的位置
    //聲明一個手臂位置的變量;
    private Transform m_transform;


    //利用射線去檢測
    //聲明一個射線的變量 聲明一個存貯射線信息存貯的變量
    private Ray ray;
    private RaycastHit hit;


    //定義一個槍口位置的變量;
    private Transform m_Point;




    //設置特效 線渲染器屬性組件 變量

   private LineRenderer m_LineRenderer;
    
    void Start () {
        //將Transform 位置賦值
        m_transform=gameObject.GetComponent<Transform>();

        //槍口位置賦值;
      //  m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>(); 
        m_Point = m_transform.FindChild("Point");


        //特效渲染器組件位置賦值;關鍵語法  利用槍口的位置設置; 先將查找到的組件 linerenderer 存貯起來

      m_LineRenderer = m_Point.gameObject.GetComponent<LineRenderer>();




    }
    
    
    void Update () {
    
        //使手臂朝向鼠標點擊的位置;

        //接收射線的變量  利用攝像機獲取射線并賦值;
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從屏幕發射到鼠標點擊的位置的射線;
        //進行物理檢測 
        if (Physics.Raycast(ray, out hit))
        {
            //控制手臂的方向
            //檢測成功后調用 游戲對象位置的  朝向 方法 lookat
           m_transform.LookAt(hit.point);//參數是碰撞點


            //檢查是否有碰撞;
            //Debug.Log("Collider");
            //場景中沒有任何碰撞體 或者打開場景的屬性檢查;所以手臂不會移動

            //因此 要添加網格碰撞器 選中 游戲物體 add component  加組件 mesh Collider; 
            //但是默認的有4千個頂點,ui設計的只有2千頂點的簡模 所以用ui的添加碰撞器



            //成功測試后,發現手的旋轉關節不對,就是手是手臂的中心點 可以定義一個父類來控制它 不要以為手臂的中心點來控制
            //建立一個父類,把之前的代碼組件移除  設置好父類坐標,將腳本掛載到父類組件去


            //繪制槍口發射線  
           //與繪制射線方法相同 Debug.DrawRay();
          // Debug.DrawLine(m_transform.position,hit.point,Color.red);//參數1: 起始位置 參數2:射線碰撞的位置 參數3:顏色;


        //射線出發的位置不對 所以定義一個空物體存貯槍口的位置 transform
            //怎么查找父類下的組件呢?
           //gameObject.transform.Find("Point");
            //如果游戲對象下面有N個叫Point的組件呢;所以我們只要查找父類下的組件名稱即可;
          // m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>(); // 這是賦值過程,寫到Start方法即可;

            //再次繪制射線;
           Debug.DrawLine(m_Point.position, hit.point, Color.red);


            //繪制特效線的位置;注意關鍵函數 
          m_LineRenderer.SetPosition(0,m_Point.position);//參數1:特效起始位置的下標 參數2:特效起始位置下標的位置 (槍口位置)
         m_LineRenderer.SetPosition(1,hit.point);//參數1:特效結束位置的下標 參數2:特效結束位置下標的位置 (射線碰撞點)




        }



    }
}


小結

Unity API.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容