Unity3D_(游戲)2D簡單游戲制作過程:捕獲高空掉落保齡球


 

 

游戲介紹:通過鼠標的左右移動,可以控制帽子的移動,當帽子接到下落的保齡球時,會出現火花效果。沒有接到保齡球時,保齡球落到草地上,過10S后會自動消失。

 

實現效果:

 

 

素材+Unity3D源代碼:傳送門 

 

 

 

實現過程:

 

一、搭建基本場景

 

  創建工程時選擇2D正交視角,此時只有一個名為Main Camera的攝像機對象

 

  為了使得游戲對象在場景中的層次不會錯亂,可以創建不同的工作層次來管理游戲對象,使2D游戲場景的層次更加分明,游戲對象之間的操作也更加方便

選擇菜單欄中的Edit->Project Settings->Tags and Layout命令(或者直接單選編輯器右上方的Layout->Edit Layout),在Inspector視圖中,單機Sorting Layouts下的按鈕,講Layer ID 1命名為Background,再次單價Sorting Layout下的按鈕,講Layer ID 2命名為Foreground

 

 

Unity支持所有資源都可以通過以下三種方法進行導入:
1、直接將資源復制到項目文件夾下面的Assets文件中
2、直接將資源拖動到Project視圖的Assets文件夾中
3、依次打開菜單欄中的Assets->Import New Asset...進行導入
Unity3D導入資源方法

 

(1)天空

  創建一片天空,用來當做游戲背景的一部分。在場景中創建一個Sprite,依次選擇菜單欄中的GameObject->2D Object->Sprite命令,重命名為sky

  設置天空Sprite的紋理、工作層的順序。在Inspector中將Sprite圖片背景改為skySprite,並將Sorting Layout屬性值設置為Baclground,Order in Layout屬性值設置為0,設置參數如下

 

·Sprite:Sprite的圖片信息。
·Color:Sprite的顏色
·Material:Sprite的材質。
·Sorting Layer:Sprite的分類層。單機右側下拉按鈕可以選擇或者添加新的分層,層級越靠前,優先級越高,相同情況下后被渲染。
·Order in Layer:Sprite所在層中的順序。數值越大,優先級越高,相同情況下后被渲染。
Inspector視圖中對象Sprite Renderer組件各屬性的含義

 

(2)草地

  依次選擇菜單欄中的GameObject->2D Object->Sprite命令,在場景中創建一個Sprite,重命名為grass(草地Sprite在工作層順序要比天空高,這樣能將草地顯示在前面)

  設置草地Sprite的紋理,工作層的順序。在Inspector中將Sprite圖片背景改為GrassSprite,並將Sorting Layout屬性值設置為Baclground,Order in Layout屬性值設置為1,設置參數如下

 

 

  此時圖片不能填充滿地面背景,可以選擇多復制些草叢,並依次拖動Sprite,將sky下方背景被草地填充滿

  (有必要換可以創建一個空對象來管理游戲背景,依次選擇菜單欄中GameObject->Create Empty命令,創建一個空對象,將其命名為Background,將sky和grass對象拖動到Background中,與Background建立父子關系)

 

 

 

二、添加角色和控制

(1)創建Sprite動畫

  Unity3D能自動切割Sprite,將一張多紋理的圖片切割成多個Sprite,並且這些Sprite將保持在同一個圖片文件中,在Project視圖中,選中切割圖片,在圖片的Inspector視圖中,將Sprite Mode設置為Multiple,然后單擊下面的Sprite Editor按鈕,在彈出的Sprite Editor對話框左上角的Slice按鈕中單擊另一個同名的Slice按鈕,最后單擊Apple俺就,Sprite圖片就會自動切割完成

 

 

  自動切割完成后,Sprite動畫就被切割成8長小圖,接下來要制作天鵝飛行的動畫

  依次選擇菜單欄中的GameObject->2D Object->Sprite命令,創建一個Sprite,並改名為swan,在Select Sprite對話框中選擇swan_sheet_0,在Inspector視圖中將Sorting Layout屬性值設置為Background,Order in Layout屬性值設置為1,

 

 

  給天鵝Sprite創建一個煽動翅膀的動畫

  選中swan,依次選擇菜單欄中的Window->Animation命令,在演出的Animation對話框中,單選左側的按鈕,選擇Create New Clip,然后在彈出的Create New Aniamtion對話框中選擇Assets下方的Animation文件夾,將文件命名為swan,保存

  在Project視圖中的Animation文件夾中,會創建出2個swan文件,其中一個是swan動畫片段,另一個是swan動畫控制器

  以Sprite的變化作為動畫幀,在Hierarchy視圖中選中swan,依次選擇菜單欄中的Window ->Animation命令,在打開的Animation視圖中,將Sampke屬性值設置為10,然后單擊Add Property按鈕,在彈出的選擇列表中單擊Sprite Renderer左側的播放按鈕(必須先將Sampke屬性值設置為10)

  將末尾處無用的關鍵幀刪除。在Animation視圖中,選中1:00選的關鍵正右擊關閉,在彈出快捷菜單每0.01s創建一個一個幀動畫(改變幀動畫只需要修改一幀的Inspector下的Animator下的Controller,最后面有參考書籍,這里出問題了可以按照課本上多O(∩_∩)O~)

 

最終預覽效果:

 

 

  添加腳本,實現天鵝飛行的效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwanMove : MonoBehaviour {

    //swan的移動速度
    private float moveSpeed = 4;

    // Use this for initialization
    void Start () {
        //設置天鵝的初始位置
        transform.position = new Vector3(22, 3, 0);
    }
    
    // Update is called once per frame
    void Update () {
        if(transform.position.x>-22){
            //天鵝移動
            transform.Translate(Vector3.right * -moveSpeed * Time.deltaTime);
        } else{
            transform.position = new Vector3(22, 3, 0);
        }
    }
}
天鵝飛行腳本:SwanMove

 

  將腳本綁定到天鵝上,播放按鈕實現天鵝從左側飛向右側

 

 

三、帽子對象

  (1)將HatBackSprite圖片拖動到Hierarchy視圖中,將其命名為Hat,為了使帽子顯示在所有背景的前方,將Sorting Layout屬性值設置為Foreground,Order in Layout的屬性值為0,

  (2)在Project視圖中的Sprite文件夾中,將Hierarchy拖動到Hat上,建立父子關系,將Sorting Layout屬性值設置為Foreground,Order in Layout屬性值為2,將帽子后半部分的Order in Layer屬性值為0,前半部分的Order in Layer屬性值為2,前半部分的Order in Layer屬性值設置為2,目的是使得保齡球Sprite的優先級在兩者之間,實現保齡球在被帽子接住候達到進入帽子的視覺效果

 

 

  (3)創建保齡球Sprite,改名為BowlingBall,在BowlingBall的Inspector視圖中,將Sorting Layout值設置為Foreground,Order in Layout的值設置為1

  (4)為保齡球Sprite添加剛體,使其有自由下落的效果,並添加碰撞剛體,使其與別的碰撞體之間有碰撞的效果。

在Hierarchy視圖中選中BallingBall,依次選擇菜單欄中的Component->Physics 2D->Rigidbody 2D(2D剛體)命令,給BowlingBall添加一個Rigidbody 2D組件。再一次選擇菜單欄中的Compent->Physics 2D->Collider 2D(2D圓形碰撞體命令),給BowlingBall添加一個Circle Collider 2D組件

 

 

(5)添加腳本,實現保齡球自由下落

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour {

    //BowlingBall
    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;
    }
    
    // Update is called once per frame
    void FixedUpdate () {
        time -= Time.deltaTime;
        if(time<0)
        {
            //產生一個隨機數,代表實例化下一個保齡球所需要的時間
            time = Random.Range(1.6f,1.8f);
            //在保齡球實例化位置的寬度內產生一個隨機數,來控制實例化保齡球的位置
            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);
        }
    }
}
實現保齡球自由下落

 

(6)將腳本綁定到保齡球上

 

 

(7)創建一個C#腳本,用來控制帽子的移動

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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 frame
    void FixedUpdate () {
        //將鼠標的屏幕位置轉換成世界坐標
        rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        //設置帽子將要移動的位置,帽子移動范圍控制
        hatPosition = new Vector3(rawPosition.x, hatPosition.y, 0);
        hatPosition.x = Mathf.Clamp(hatPosition.x,-maxWidth,maxWidth);
        //帽子移動
        GetComponent<Rigidbody2D>().MovePosition(hatPosition);
    }

 
}

(這個腳本挺好用的,不采用折疊)

 

  為帽子添加剛體並開啟is Kinematic(是否運動學,開啟的話 游戲對象不會受到物理引擎的影響只能通過Transfrom(幾何變化組件)屬性來對其操作)

在Hierarchy視圖中選中Hat,依次選擇菜單欄中的Component->Physics2D Rigidbody 2D命令,然后在Hat的Inspector視圖中,將Gravity Scale設置為0(防止Hat下落),並選中Fixed Angle屬性復選框

 

  創建2D物理阻擋

  給帽子添加碰撞體,使其與保齡球可以發生碰撞。在Hierarchy視圖中選種Hat下的HatForntSprite,依次選擇菜單欄中的Component->Physics 2D->EdgeCollider 2D(2D邊緣碰撞)命令,為HatFrontSprite添加一個Edge Collider 2D組件,然后在Inspector視圖中單擊Edit Collider左側按鈕,在Scene視圖中編輯Edge Collider 2D,使得Edge Collider 2D組件包裹住Hat

(當小球碰撞到這些綠色的線條就會被彈開)

 

 

  給帽子添加觸發器,用來判斷保齡球是否進入帽子,按照上一步步驟,給Hat添加一個Edge Collider 2D主鍵,使得Edge Collider 2D在Hat底部呈一條直線

 

 

 添加保齡球進入觸發器后刪除保齡球的代碼,這樣帽子可以持續接取保齡球

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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 frame
    void FixedUpdate () {
        //將鼠標的屏幕位置轉換成世界坐標
        rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        //設置帽子將要移動的位置,帽子移動范圍控制
        hatPosition = new Vector3(rawPosition.x, hatPosition.y, 0);
        hatPosition.x = Mathf.Clamp(hatPosition.x,-maxWidth,maxWidth);
        //帽子移動
        GetComponent<Rigidbody2D>().MovePosition(hatPosition);
    }

    //有碰撞物體進入觸發器時觸發
    private void OnTriggerEnter2D(Collider2D col)
    {
        GameObject neweffect = (GameObject)Instantiate(effect, transform.position, effect.transform.rotation);
        neweffect.transform.parent = transform;
        Destroy(col.gameObject);
        //刪除該碰撞的物體
        Destroy(col.gameObject,1.0f);
    }
}
接取保齡球:HatController

 

  在草地下方添加一個碰撞體,用來阻擋保齡球繼續下落。

  依次選擇菜單欄中的GameObject->Create Empty命令,創建一個空對象,將其命名為ground,選中ground,依次選擇菜單欄中的Component->Physics 2D->Box Collider 2D命令,最后在ground的Inspector視圖中,調整ground的Offset和Size屬性值

 

 

  當沒有接住保齡球,保齡球在草地上停留10S后會自動消失

 

到此時就已經實現游戲基本功能

 

 

四、添加2D游戲效果

 

  為了鼓勵玩家操作,讓玩家更有參與感,可以給當玩家接收到天空落下的求就會出現火花的粒子特效,下面來實現最終游戲的效果

 

  首先導入火花粒子資源包

  依次選擇菜單欄中的Asset->Import Package->Custom Package命令,導入Effect,unitypackage資源包進入到工程中,選中Effect文件夾下的Effect粒子預設體,將Particle System組件中的Renderer屬性值下的Sorting Layout設置為Foreground,Order in Layout設置為1

 

 

  點擊Hat Controller(Script)組件下的Effect按鈕,在彈出的Select GameObject對話框中選擇Effects

 

 

  此時點擊播放按鈕,就可以實現通過鼠標的左右移動,可以控制Hat的移動,當Hat接到下落的保齡球時,會出現火花效果

 

  End! 

 

 

 

 

 

參考書籍《Unity 5.X從入門到精通》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM