文章出處

  讓我們繼續來學習Unity2D游戲場景的制作,本文分為以下3個部分:

· 添加角色和控制

. 添加2D物理阻擋

· 添加2D效果

  通過制作一個移動帽子接保齡球的小游戲,我們可以學習到任何創建游戲對象,使用2D物理引擎和制作2D特效等。

·  添加角色和控制

  1. 創建游戲主角帽子

   帽子整體由Hat和HatFrontSprite兩部分組成,為了讓保齡球在被帽子接住時達到進入帽子的視覺效果,我們設置帽子的屬性如下兩張圖所示。Hat的層級為0,而HatFrontSprite的層級為2,我們只要將保齡球的層級設置為1,就可以到達效果了。

 

 

  為帽子添加剛體,并且防止帽子下落。選擇菜單欄中的命令,Component——Physic 2D——Rigidbody 2D(剛體)。在帽子的Inspector視圖中,將Gravity Scale設置為0,防止帽子下落。選中Freeze Rotation Z 來固定帽子的角度,

  2. 創建保齡球

  創建好保齡球sprite后,為了讓保齡球有自由下落的效果,我們為它添加剛體。選擇菜單欄中的命令,Component——Physic 2D——Rigidbody 2D(剛體)。為了讓保齡球與其他碰撞體之間有碰撞效果,選擇Component——Physic 2D——Circle Colider 2D(2D圓形碰撞體)。

  如果不給保齡球添加剛體,那么游戲中的保齡球就不會自由下落。

  在游戲中,我們要生成多個保齡球,所以要將保齡球sprite制作成Prefab。將Hierarchy視圖中的sprite直接拖到Project視圖的文件夾中,就可以制作成預設體了。如下圖所示:

 

  3. 創建腳本來控制保齡球帽子

  我們先創建一個空的游戲對象GameController,創建一個C#腳本也名為GameController,然后將GameController腳本拖到GameController對象上

 

public class GameController : MonoBehaviour {
    public GameObject ball;
    private float maxWidth;
    private float time = 2;
    private GameObject newball;
    // Use this for initialization
    void Start () {
        //將屏幕的寬度轉換成世界坐標
        Vector3 screenPos = new Vector3(Screen.width, 0, 0);
        Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
        //獲取保齡球自身的寬度
        float ballWidth = ball.GetComponent<Renderer>().bounds.extents.x;
        //計算保齡球實例化位置的寬度
        maxWidth = moveWidth.x - ballWidth;
    }
    
    void FixedUpdate () {
        time -= Time.deltaTime;
        if (time < 0) 
        {
            //產生一個隨機數,代表實例化下一個保齡球所需的時間
            time = Random.Range(1.5f, 2.0f);
            //在保齡球實例化位置的寬度內產生一個隨機數,來控制實例化的保齡球的位置
            float posX = Random.Range(-maxWidth, maxWidth);
            Vector3 spawnPosition = new Vector3(posX, transform.position.y, 0);
            //實例化保齡球,10秒后銷毀
            newball = (GameObject)Instantiate(ball, spawnPosition, Quaternion.identity);
            //如果不寫時間的話,組件會被馬上銷毀的
            Destroy(newball, 10);
        }
    }
}

 

   再來創建一個腳本HatController來控制帽子的移動,然后將HatController腳本拖到Hat對象上。

public class HatController : MonoBehaviour {
    public GameObject effect;
    private Vector3 rawPosition;
    private Vector3 hatPosition;
    private float maxWidth;
    // Use this for initialization
    void Start () {
        //將屏幕的寬度轉換成世界坐標
        Vector3 screenPos = new Vector3(Screen.width, 0, 0);
        Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
        //計算帽子的寬度
        float hatWidth = GetComponent<Renderer>().bounds.extents.x;
        //獲得帽子的初始位置
        hatPosition = transform.position;
        //計算帽子的移動寬度
        maxWidth = moveWidth.x - hatWidth;
    }
    
    // Update is called once per physics timestep
    void FixedUpdate () {
        //將鼠標的屏幕位置轉換成世界坐標
        rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);//設置帽子將要移動的位置,帽子移動范圍控制
        hatPosition = new Vector3(rawPosition.x, hatPosition.y, 0);//限制value的值在min和max之間
        hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);
        //帽子移動
        GetComponent<Rigidbody2D>().MovePosition(hatPosition);
    }
}

  現在,在游戲中我們可以看到保齡球從天上隨機不同位置掉落,但保齡球下落后,會穿過草地。帽子則會跟著鼠標左右移動。

 

 ·  添加2D物理阻擋

  注意:假如帽子有碰撞體,而保齡球沒有添加碰撞體,那結果會怎樣呢?保齡球與帽子碰撞后,沒有任何反應。所以,參與碰撞的物體都必須要添加碰撞體。

  先給HatFrontSprite添加邊緣碰撞體,Component——Physics 2D——Edge Collider 2D(2D邊緣碰撞體)。然后再給Hat添加一個觸發器,用來判斷保齡球是否進入帽子,在Inspector視圖中選中Is Trigger復選框。給Hat添加一個Edge Collider 2D組件,在編輯Edge Collider 2D之前,要先點擊Edit Collider按鈕,讓Edge Collider 2D組件包裹住Hat。編輯過程要有耐心,需要不斷地調整,學會編輯后,最好把編輯過程錄制成視屏,以后忘記了的話,就可以按照視屏來操作。如下圖所示:


  為了讓帽子能夠持續地接取保齡球,我們要在保齡球進入觸發器后刪除保齡球。于是我們在HatController腳本中添加如下代碼:

    void OnTriggerEnter2D(Collider2D col) 
    {
        //刪除該碰撞物體
        Destroy(col.gameObject);
    }

 

  為了讓保齡球落到草地上后,不再下落,我們要給草地也添加一個碰撞體。GameObject——Create Empty,命名為ground,Component——Physics 2D——Box Collider 2D,設置ground屬性如下圖:

 

  現在,保齡球落到地面上后會被被地面擋住,我們移動帽子接到保齡球,不管你是否接到了保齡球,一段時間后,保齡球都會自動消失。

· 添加2D效果

 

  為了讓帽子接到了保齡球后會出現火花粒子特效,現在讓我們來制作一個簡單的特效。先將粒子效果資源包導入到項目中,點擊Import按鈕導入即可。

  

導入Effects資源之后,設置Effects粒子預設體的Inspector面板中的Renderer屬性。

  在HatController中添加帽子接取到保齡球之后,產生的粒子效果代碼。

public class HatController : MonoBehaviour {
    public GameObject effect;
    private Vector3 rawPosition;
    private Vector3 hatPosition;
    private float maxWidth;
    // Use this for initialization
    void Start () {
        //將屏幕的寬度轉換成世界坐標
        Vector3 screenPos = new Vector3(Screen.width, 0, 0);
        Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
        //計算帽子的寬度
        float hatWidth = GetComponent<Renderer>().bounds.extents.x;
        //獲得帽子的初始位置
        hatPosition = transform.position;
        //計算帽子的移動寬度
        maxWidth = moveWidth.x - hatWidth;
    }
    
    // Update is called once per physics timestep
    void FixedUpdate () {
        //將鼠標的屏幕位置轉換成世界坐標
        rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        //print(rawPosition);
        //設置帽子將要移動的位置,帽子移動范圍控制
        hatPosition = new Vector3(rawPosition.x, hatPosition.y, 0);
        //print(hatPosition);
        //限制value的值在min和max之間
        hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);
        //帽子移動
        GetComponent<Rigidbody2D>().MovePosition(hatPosition);
    }

    void OnTriggerEnter2D(Collider2D col) 
    {
        GameObject neweffect = (GameObject)Instantiate(effect, transform.position, effect.transform.rotation);
        neweffect.transform.parent = transform;
        //刪除該碰撞物體
        Destroy(col.gameObject);
        Destroy(neweffect, 1.0f);
    }
}

         為HatController腳本添加粒子效果組件。

  最終游戲效果:

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()