關鍵字:Unity、FPS、Ray、互動、觸發
這篇文章想要教如何使用在第一人稱運用準心與物件進行觸發或互動
由於屋主我的慣用程式語言是C#,所以教學文程式部分是用C#撰寫喔~
*首先新增專案並勾選Characters資源
*建個Plane當作地板,拉出第一人稱角色FPSController
*接著要來製作FPS遊戲畫面中的準心
新增UI物件的RawImage並設定在畫面中央,Texture設定自製的準心PNG圖
RawImage的Inspector設定詳見下圖
*來示範「準心對準Cube後按下鍵盤E鍵變換Cube顏色」
在Plane上放4個Cube並放入純色材質球
*新增一個C#腳本RayScript (命名隨意)
拖曳給FirstPersonCharacter,跟攝影機在同一個物件中
*接著我們要開始撰寫程式
先把需要物件宣告出來
Ray ray; //射線
float raylength = 1.5f; //射線最大長度
RaycastHit hit; //被射線打到的物件
接著在Updata區塊中撰寫
ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
if (Physics.Raycast(ray, out hit, raylength))
// (射線,out 被射線打到的物件,射線長度),out hit 意思是:把"被射線打到的物件"帶給hit
hit.transform.SendMessage("HitByRaycast", gameObject, SendMessageOptions.DontRequireReceiver);
//向被射線打到的物件呼叫名為"HitByRaycast"的方法,不需要傳回覆
Debug.DrawLine(ray.origin, hit.point, Color.yellow);
//當射線打到物件時會在Scene視窗畫出黃線,方便查閱
print(hit.transform.name);
//在Console視窗印出被射線打到的物件名稱,方便查閱
*接著執行遊戲
這樣能在遊戲進行中從Scene觀察射線(黃線)
開啟Unity上方的工具列Window > Console 視窗
可以看到不斷的print出hit的名稱(也就是Cube(4))
*接著要講解重點
物件如果想要被射線打中必須要有添加Collider(碰撞器),不然射線會穿透過去
Cube的預設Collider就是Box Collider 以此類推
*接著撰寫Cube改變顏色的程式
新增一個C#腳本CubeScript (命名隨意)並拖曳給Cube
宣告一個渲染(Renderer)
Renderer R1;
在Start區塊中
void Start()
{
R1 = gameObject.GetComponent<Renderer>(); //把R1指定為物件的Renderer
}
另外自行撰寫HitByRaycast區塊(這是自己命名的,跟上支程式對應就好)
void HitByRaycast() //被射線打到時會進入此方法
{
if (Input.GetButtonUp("E")) //當按下鍵盤 E 鍵時
{
if (R1.material.color== Color.green) //如果Renderer材質是綠色
{
R1.material.color = Color.red; //Renderer材質換成紅色
}
else
{
R1.material.color = Color.green; //Renderer材質換成綠色
}
}
}
「當按下鍵盤 E 鍵時」
這件事可以在Unity上方工具列Edit>Project Settings>Input設定
*接著重新檢查
- RayScript、CubeScript兩支程式是否內容有誤
- 程式是否已經拖曳到場景物件上
- 要能被射線打中的物件必須要有添加Collider
執行遊戲
成功的將Cube的顏色改為程式指定的紅色
透過這樣判斷機制,可以在HitByRaycast()方法中寫入各種相對應動作
例如:撥放開門動畫,撿取道具,移動物件 等等
另外附上這篇文章的範例專案 v5.2.0f3
開啟專案後Project視窗點擊Scene 1 開啟場景
文章有誤或是疑問可以留言給我,如果可以我會盡量回覆