2016年5月6日 星期五

Unity_C#_Physics.Raycast射線

*此教學使用Unity 5.3.4f1 (64-bit)免費版
*最後更新時間2016/05/30


本文將教學:
                     Physics.Raycast基礎應用
                     改變材質
                     Rigibody改變阻力
----------------------------------------------------------------------------------------------------------
先展示這次要製作的效果,Cube在指定高度會變為藍色,同時阻力增加(Rigibody.drag),
碰觸地面時會變成紅色。


1.首先先在場景中建立兩個Cube,添加Rigibody,
   並新增兩個Material,分別為Blue與Red(都還不用指定),
   再新增一個Plane當地板,並貼上Tag:environment,可再新增材質指定方便辨識。
   下個步驟先進行講解。


2.Physics.Raycast的架構為:

Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo,float distance,int LayerMask);

Vector3 origin 為射線發射的原點。以槍為例就是槍口,利用Vector3儲存xyz軸
Vector3 direction 為射線發射的座標。由於世界座標和射擊軸向不一定相同,所以需要此變數來儲存發射座標。

我們可以使用Ray來儲存前兩個變數,所以實際上寫法會變成:
Ray myRay = new Ray(Vector3 origin, Vector3 direction);

Physics.Raycast(myRay, RaycastHit hitInfo,float distance,int LayerMask);

RaycastHit hitInfo用來儲存射線碰到的碰撞體(有Collider)資料,一般也會用變數表示,所以程式碼會變為:
Ray myRay = new Ray(Vector3 origin, Vector3 direction);
RaycastHit hit;
Physics.Raycast(myRay, out hit, float distance,int LayerMask);

P.S.記得加out
最後還有兩個選擇性參數(可用可不用)
float distance 射線長度,預設為無限遠
int LayerMask用來指定射線檢查可忽略的圖層

3.新增一個C#腳本命名changebox,開始構思:
   目前要做的事是:
   3-1.讓Cube在指定高度會變為藍色:
          需要一個Physics.Raycast計算高度位置,可變換材質的渲染器
   3-2.同時阻力增加(Rigibody.drag):
          需要宣告一個Rigibody,並且設定阻力大小
   3-3.碰觸地面時會變成紅色:
          在OnCollisionEnter()內建時改變為紅色

所以程式碼會變成這樣,也可以也自己的寫法



4.在Update中我們來寫Physics.Raycast:
   射線不會出現在場景中可以用DebugDrawRay使其顯示
   射線長度則是方向乘高度:Vector.down * height


5.在此附上完整程式碼:

using UnityEngine;
using System.Collections;

public class changebox : MonoBehaviour {

public float drag_r; //設定剛體阻力
public float height; //設定所在高度

private bool change_to_blue;//使否將材質變成藍色

 public Material blue;//儲存藍色材質
public Material red;//儲存紅色材質

private Renderer rend;//宣告渲染器

private Rigidbody rb;//宣告剛體


void Start () {
        rend = GetComponent<Renderer>();//宣告rend為自身渲染器
        rend.enabled = true;//渲染器設定為可渲染
        rb = GetComponent<Rigidbody>();//宣告rb為自身剛體
    }

void Update () {

        Debug.DrawRay (transform.position, Vector3.down * height);//顯示射線(除錯用)

        RaycastHit hit;//被射線碰到的碰撞體
Ray landingRay = new Ray (transform.position, Vector3.down);//世界座標,本地座標

if(change_to_blue == false){//如果BOX沒有變成藍色
               
if(Physics.Raycast(landingRay,out hit, height))//把射線放到if條件式判斷
{
if(hit.collider.tag == "environment")//如果射線碰到的碰撞體標籤為environment
                {
ChangeBlue();//執行變成藍色函式
                    change_to_blue = true;
                }
}
}

}


    void ChangeBlue()
    {//變換為藍色函式
        rb.drag = drag_r;//指定阻力大小
        rend.material = blue;//變換材質
    }

    void OnCollisionEnter()
    {//碰地時觸發
        rend.material = red;//變換材質
        rb.drag = 0;//無阻力
    }


}


6.把材質指定給指定兩個物件,設定數值,按下Play觀看效果。



沒有留言:

張貼留言