一、新建項目
創建成功後,進入瞭如下界面。
二、場景的設計
在Hierarchy中鼠標右鍵創建Plane(地面)遊戲物體,將其Transform組件重置,並將遊戲物體重命名爲Ground,如下圖所示。
調整地面的大小。
在Assets下創建文件夾Materials,並在其中創建Ground的Material(材質)並在Ground(地面)遊戲物體上設置材質。如下圖所示。(Smoothness爲光滑度)
三、創建磚塊和磚塊的prefab(預製體)
右鍵創建Cube,並給該遊戲物體添加Rigidbody(剛體)組件,然後創建在Assets下創建Prefabs文件夾,將Cube拖入到Prefabs文件夾下將Cube遊戲物體設置爲prefab(預製體)。如下圖所示。
Rigidbody:當遊戲物體添加了剛體組件,會有物理效果,如重力。
prefab:預製體,相當於模板,當修改預製體時,由此prefab生成的實例也會進行相同的變化。
四、創建牆
通過預製體來創建牆,在Unity中距離的單位爲米,而Cube的長度爲1,即是1米,當移動時,我們可以按住ctrl鍵然後通過按住箭頭來移動固定的距離。創建牆如下圖所示。
五、創建子彈
通過預製體來創建子彈的實例,因爲子彈會有很多個,所以需要用到預製體,並且通過代碼來控制子彈的生成。創建子彈如下圖所示。
六、創建C#腳本
在Assets下創建Scripts文件夾,並且創建命名爲Shoot的C#腳本文件,然後將腳本文件拖入Main Camera作爲一個腳本組件。如下圖所示。
七、子彈的生成
打開Shoot腳本,並定義一個屬性public GameObject bullet;
,保存,回到Unity,可以看到Main Camera遊戲物體中的腳本組件出現了變化,這時可以將Prefabs中的Sphera預製體拖入其中,給其賦值。具體如下圖所示。
在Shoot的Update方法中加入實例化代碼用於控制子彈的生成。
// 每幀調用一次
void Update() {
//Input.GetMouseButtonDown(0):鼠標左鍵按下
if (Input.GetMouseButtonDown(0)) {
//transform:當前腳本所在遊戲物體的transform組件
//transform.position:這裏取得的是當前遊戲物體(Camera)的位置
//transform.rotation:當前遊戲物體的旋轉角度
GameObject.Instantiate(bullet, transform.position, transform.rotation);//生成bullet實例
}
}
此時運行,點擊左鍵,觀察Hierarchy發現,有Sphere實例生成。如下圖所示。但是觀察Game視圖發現,子彈並沒有發射出去。
八、給子彈生成初速度,使其能夠發射出去。
我們可以通過Rigidbody(剛體)來給子彈施加速度,這樣就可以發射了。
在Shoot中定義一個屬性public float speed=5;
並在Update方法中獲取Rigidbody組件,並賦予向前的速度。
//獲得Rigidbody(剛體)
Rigidbody rgd = b.GetComponent<Rigidbody>();
//給其賦一個向前的初速度
rgd.velocity = transform.forward * speed;
這時我們運行下看看效果,如下圖所示。
通過運行,我們發現,相機的距離過近需要調整相機距離,並且子彈發射出去進行了翻滾,我們可以通過鎖定它的y軸來讓它不進行翻滾。如下圖所示。
九、控制相機的上下左右移動
創建C#腳本Movement,並將其掛載到Main Camera上。如下圖所示。
在Movement腳本中添加屬性public float speed = 3;
並且在Update方法中添加上下左右移動代碼
void Update() {
//獲取左右鍵的按下
float h = Input.GetAxis("Horizontal");
//獲取上下鍵的按下
float v = Input.GetAxis("Vertical");
//移動
//Time.deltaTime:時間修正值
transform.Translate(new Vector3(h, v, 0) * Time.deltaTime * speed);
}
十、運行
對子彈速度進行一個調整。
運行效果如下圖所示。
十一、代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shoot : MonoBehaviour {
public GameObject bullet;
public float speed = 5;
// 在第一幀更新之前調用Start
void Start() {
}
// 每幀調用一次
void Update() {
//Input.GetMouseButtonDown(0):鼠標左鍵按下
if (Input.GetMouseButtonDown(0)) {
//transform:當前腳本所在遊戲物體的transform組件
//transform.position:這裏取得的是當前遊戲物體(Camera)的位置
//transform.rotation:當前遊戲物體的旋轉角度
GameObject b=GameObject.Instantiate(bullet, transform.position, transform.rotation);//生成bullet實例
//獲得Rigidbody(剛體)
Rigidbody rgd = b.GetComponent<Rigidbody>();
//給其賦一個向前的初速度
rgd.velocity = transform.forward * speed;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour {
public float speed = 3;
// Start is called before the first frame update
void Start() {
}
// Update is called once per frame
void Update() {
//獲取左右鍵的按下
float h = Input.GetAxis("Horizontal");
//獲取上下鍵的按下
float v = Input.GetAxis("Vertical");
//移動
//Time.deltaTime:時間修正值
transform.Translate(new Vector3(h, v, 0) * Time.deltaTime * speed);
}
}