本節要點
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