讓我們繼續來學習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腳本添加粒子效果組件。
最終游戲效果:
文章列表