Unity3D遊戲開發之《憤怒的小鳥》彈弓實現的技能培訓

下面我們開始今天的Unity3D遊戲開發技能培訓。 我們學習Unity3D培訓目標:讓U3D初學者可以更快速的掌握U3D技術,自行製作修改素材,可以獨立完成2D、3D小規模遊戲及網頁遊戲開發。

       今天我們來做一個高端大氣上檔次的東西。我相信大家都玩過一款叫做《憤怒的小鳥》的遊戲,這款遊戲之所以能夠受到玩家的喜愛,是因爲這是一款物理遊戲,在遊戲中處處充滿了物理。我們熟悉的拋物線、引力等物理元素都在這款遊戲中得到了體現。那麼《憤怒的小鳥》這款遊戲使用的正是Unity引擎,所以我們在遊戲中看到了各種各種有趣的物理現象。那麼,我們今天呢,就以《憤怒的小鳥》遊戲中的小鳥發射器——彈弓爲例,來講述在Unity中如何實現彈性效果。

        首先,我們來引入一個新的概念——LineRenderer。在Unity3D中LineRenderer被稱爲線性渲染器。通過這個組件,我們可以做一些比較有創意的東西,比如在遊戲中繪製線段、製作激光特效、武器拖尾效果等。那麼今天呢,我們是用LineRenderer來構造彈弓兩邊的繩子,這個繩子是具有彈性的,在受力結束後可以恢復到原來的狀態。我們首先創建一個如下圖的簡單場景:

       在上面的場景中,兩邊的柱子作爲固定繩子的物體,小球在兩根繩子中間。我們希望實現的是:

當用戶按下鼠標左鍵並移動鼠標的時候,小球和繩子都將跟着移動,當鬆開鼠標左鍵的時候,小球以一定的角度和一定的力發射出去。我們今天着重來講繩子的實現。首先我們創建一個空的GameObject將座標值設爲原點,命名爲RopeL。接下來我們通過Component->Effects->Line Renderer爲添加一個線性渲染器組件。如圖:

      我們設定好上述參數後,就可以開始編寫腳本了,這裏兩根繩子是對稱的:

[csharp] view plaincopyprint?

  1. using UnityEngine;  

  2. using System.Collections;  

  3.   

  4. public class Ball : MonoBehaviour {  

  5.   

  6.     //鼠標位置  

  7.     private Vector3 MousePos;  

  8.   

  9.     //左側LineRenderer  

  10.     private LineRenderer LineL;  

  11.     //右側LineRenderer  

  12.     private LineRenderer LineR;  

  13.       

  14.     void Start ()  

  15.     {  

  16.         //獲取LineRenderer  

  17.         LineL=GameObject.Find("Shootor").transform.FindChild("RopeL").  

  18.             transform.GetComponent<LineRenderer>();  

  19.         LineR=GameObject.Find("Shootor").transform.FindChild("RopeR").  

  20.             transform.GetComponent<LineRenderer>();  

  21.     }  

  22.   

  23.     void Update ()   

  24.     {  

  25.         if(Input.GetMouseButton(0))  

  26.         {  

  27.            //獲取鼠標位置  

  28.             MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));  

  29.            //設置小球的位置  

  30.            transform.position=MousePos;  

  31.            //重新設置LineRenderer的位置  

  32.            LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  

  33.            LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  

  34.         }  

  35.         if(Input.GetMouseButtonUp(0))  

  36.         {  

  37.             //獲取鼠標位置  

  38.             MousePos=Camera.main.ScreenToViewportPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,-2F));  

  39.             //設置小球的位置  

  40.             transform.position=MousePos;  

  41.             //重新設置LineRenderer的位置  

  42.             LineL.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  

  43.             LineR.SetPosition(0,new Vector3(MousePos.x,MousePos.y,MousePos.z-0.5F));  

  44.   

  45.             //計算小球合力方向  

  46.             Vector3 Vec3L=new Vector3(-2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);  

  47.             Vector3 Vec3R=new Vector3(2F-MousePos.x,1.8F-MousePos.y,0F-MousePos.z);  

  48.             Vector3 Dir=(Vec3L+Vec3R).normalized;  

  49.             //獲取剛體結構  

  50.             transform.GetComponent<Rigidbody>().useGravity=true;  

  51.             transform.GetComponent<Rigidbody>().AddForce(Dir*10F,ForceMode.Impulse);  

  52.             //恢復LineRenderer  

  53.             LineL.SetPosition(0,new Vector3(0F,1.8F,0F));  

  54.             LineR.SetPosition(0,new Vector3(0F,1.8F,0F));  

  55.         }  

  56.     }   

  57. }  

        我們給小球加上剛體後,綁定這段腳本就可以了。我們需要注意的問題有:

       1、這裏的力是給定的大小,我們可以根據繩子被拉長的距離使用一個彈性係數來計算力的大小。

更多精彩請到http://www.gopedu.com/


       2、計算合力的方向時,我們首先計算兩邊繩子的向量值,然後將這兩個向量想加即可得到我們的合力方向。

        好了,我們一起來看今天的效果演示吧!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章