*最後更新時間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觀看效果。
沒有留言:
張貼留言