激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

Unity3D入門:手把手帶你開(kāi)發(fā)一款坦克大戰(zhàn)的游戲

發(fā)布時(shí)間:2024-04-13 09:55:53 瀏覽量:761次

這一次我將帶領(lǐng)大家用Unity3D游戲引擎去開(kāi)發(fā)一款游戲——坦克大戰(zhàn)。

游戲玩法如下:

  • 通過(guò)“W”、“A”、“S”、“D”鍵控制玩家1(藍(lán)方)移動(dòng),空格鍵控制玩家1開(kāi)炮

  • 通過(guò)方向鍵控制玩家2(紅方)移動(dòng),回車鍵控制玩家2開(kāi)炮

游戲演示效果如下:

重播
播放
00:00 / 00:00 直播
00:00
進(jìn)入全屏
50
    點(diǎn)擊按住可拖動(dòng)視頻

    說(shuō)明:游戲開(kāi)發(fā)平臺(tái):Windows 10、Unity版本:Unity 2017.2.0f3

    一、創(chuàng)建游戲工程

    按照下圖依次點(diǎn)擊“New”→“輸入工程名”→“選擇保存路徑”→“點(diǎn)擊Create project按鈕”

    Unity工程創(chuàng)建完成后如圖所示:

    接下來(lái)應(yīng)該導(dǎo)入此項(xiàng)目所需的Unity Package文件,要用到的Unity package文件大家可以去Unity3D的官方網(wǎng)站下載(地址:
    https://www.assetstore.unity3d.com/en/?&_ga=
    2.21331896.203842797.1510021401-332298740.1510021401#!/content/46209/)

    導(dǎo)入Package的方法很簡(jiǎn)單,只需要在“Project”窗口下的“Assets”目錄上右鍵,再依次選擇“Import Package”→“Custom Package...”,選中下載好的package文件,然后在彈出的窗口中點(diǎn)擊“Import”按鈕即可

    導(dǎo)入完成后目錄結(jié)構(gòu)如下:

    二、添加游戲主場(chǎng)景

    首先在“Assets”目錄下新建一個(gè)文件夾“Scenes”,用來(lái)存放場(chǎng)景。創(chuàng)建方式如圖:右鍵”Assets“→”Create“→”Folder“

    按下快捷鍵”Ctrl+S“保存場(chǎng)景,在目錄“Assets”→“Prefabs”下找到預(yù)制體“LevelArt”,將它拖入“Hierarchy”窗口中

    隨后刪除“Directional Light”

    三、制作坦克和炮彈的預(yù)制體

    3.1、坦克預(yù)制體的制作

    在目錄“Assets”→“Models”下找到模型“Tank”,將它拖到“Hierarchy”窗口中

    在“Tank”上右鍵選擇“Create Empty”,創(chuàng)建一個(gè)空的游戲物體“FiringPoint”。將“FiringPoint”用作炮彈的發(fā)射點(diǎn),后續(xù)將從此處發(fā)射(實(shí)例化)炮彈

    將“發(fā)射點(diǎn)”調(diào)整到合適的位置,如下圖:

    在“Tank”上右鍵“UI”→“Slider”創(chuàng)建一個(gè)滑動(dòng)條,后續(xù)我們將使用這個(gè)滑動(dòng)條作為坦克的血條,用來(lái)顯示坦克剩余的血量。

    定位到“Canvas”中的“Slider”,展開(kāi)“Slider”滑動(dòng)條,將下面的“Handle Slide Area”刪除

    因?yàn)槲覀儗⒁故镜难獥l是一個(gè)環(huán)狀的圖形,所以我們還需改變它的“Background”。

    首先找到目錄“Assets”→“Sprites”下的“Health Wheel”,然后選中“Slider”下的“Background”,將前面的“Health Wheel”拖入到“Image”組件上的“Source Image”中,以此來(lái)改變Slider的背景

    重復(fù)上述方式,改變“Fill Area”→“Fill”的“Source Image”

    改變“Slider”的顯示方式,讓其居中,并將“Width”和“Height”設(shè)為一個(gè)合適的值,比如40

    然后將“Slider”里面的“Baackground”、“Fill Area”、“Fill”都設(shè)置為上下左右填充的方式,并把它們的“Left”、“Right”、“Top”、“Bottom”統(tǒng)統(tǒng)設(shè)為零。然后定位到“Fill”,把“Image”組件的“Color”屬性修改為血紅色,把“Image Type”屬性修改為“Filled”

    到這一步血環(huán)的基本樣式就做好了,你可以通過(guò)改變“Slider”的“Value”的大小來(lái)檢測(cè)效果,效果如下圖:

    上述效果完成之后,還需把“Canvas”的“Render Mode”改為“World Space”,并將“Canvas”整體拖入“Tank”下

    修改“Slider”的顯示,將其改為上下左右填充,修改“Canvas”的“Width”、“Height”,將它們改為合適的大小,比如3.8,將“Canvas”圍繞X軸旋轉(zhuǎn)90度,也就是將“Rotation”的“X”改為90,以讓其與地面平行,效果如下:

    選中游戲物體“Tank”,點(diǎn)擊“Inspector”窗口中的“Add Component”按鈕搜索并添加“Rigidbody”和“Box Collider”兩個(gè)組件

    然后點(diǎn)擊“Edit Collider”按鈕編輯碰撞器的大小,讓它吻合坦克的大小即可,如下圖,編輯坦克上的綠框即可進(jìn)行調(diào)整

    至此,坦克的預(yù)制體基本制作完畢,別忘了還要將它拖入到“Assets”→“Prefabs”目錄下才算徹底完成

    3.2、炮彈預(yù)制體的制作

    同樣的,在目錄“Assets”→“Models”下找到“Shell”的模型并將其拖放到場(chǎng)景中,然后通過(guò)“Inspector”窗口下的“Add Component”按鈕添加兩個(gè)組件,分別是“Rigidbody”和“Capsule Collider”

    同樣的,通過(guò)編輯碰撞器的大小來(lái)吻合炮彈的大小這里還要將碰撞器的”Direction“屬性改為”Z-Axis“

    這樣炮彈預(yù)制體的制作也結(jié)束了,一樣的,不要忘了要將”Hierarchy“窗口下的”Shell“拖到目錄”Assets“→”Prefabs“下才算完成

    四、控制坦克的移動(dòng)和攻擊

    我們的游戲有兩個(gè)玩家,自然就需要兩個(gè)坦克。前文已經(jīng)說(shuō)過(guò),我們將通過(guò)”W“、”A“、”S“、”D“鍵控制玩家1(1號(hào)坦克)、通過(guò)方向鍵控制玩家2(2號(hào)坦克)。

    首先將之前在”Hierarchy“窗口下的”Tank“和”Shell“兩個(gè)游戲物體刪除。隨后將目錄”Prefabs“下的”Tank“放入場(chǎng)景中,當(dāng)然需要放入兩個(gè),并把它們分別重命名為”Tank1“、”Tank2“。

    為了便于區(qū)分,我把”Tank1“設(shè)成藍(lán)色,把”Tank2“設(shè)為紅色

    展開(kāi)”Tank1“→”TankRenderers“,分別將其下面的”TankChassis“、”TankTracksLeft“、”TankTracksRight“、”TankTurret“中的”Materials“的屬性”Element 0“的值改為目錄”Prefabs“→”Materials“下的”Blue“

    對(duì)”Tank2“重復(fù)上述操作,只不過(guò)把材料”Blue“替換為”Red“

    改完后的整體效果如下:

    4.1、控制坦克移動(dòng)

    在控制坦克的移動(dòng)之前我們稍微進(jìn)行一下項(xiàng)目設(shè)置,因?yàn)橐?strong>讓Unity區(qū)分”W“、”A“、”S“、”D“鍵和方向鍵并做不同的控制。

    首先在菜單欄中依次點(diǎn)擊”Edit“→”Project Settings“→”Input“

    然后在”Inspector“窗口下右鍵”Axes“→”Horizontal“,再點(diǎn)擊”Duplicate Array Element“復(fù)制兩個(gè)”Horizontal“,將復(fù)制得到的一個(gè)”Horizontal“的”Name“改為”HorizontalPlayer1“并去掉其中的”left“、”right“兩個(gè)值,因?yàn)槲覀冎幌Mㄟ^(guò)”A“、”D“鍵而不是左右鍵來(lái)控制玩家1的移動(dòng)(轉(zhuǎn)向);同理將復(fù)制得到的另一個(gè)”Horizontal“的”Name“改為”HorizontalPlayer2“并去掉其中的”A“、”D“兩個(gè)值,因?yàn)槲覀冎幌Mㄟ^(guò)左右方向鍵而不是”A“、”D“鍵來(lái)控制玩家2的移動(dòng)(轉(zhuǎn)向)。

    對(duì)于”Vertical“重復(fù)上面的操作,只不過(guò)要把上面的”Horizontal“全部替換為”Vertical“。

    給坦克的預(yù)制體添加一個(gè)腳本組件,將其命名為”TankMovement“。右鍵此腳本,點(diǎn)擊”Edit Script“,編輯腳本文件的內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class TankMovement : MonoBehaviour {

    private Rigidbody rb;

    public int number = 1; // 通過(guò)編號(hào)區(qū)分不同坦克

    public float speed = 10; //速度大小

    public float angularSpeed = 10; //轉(zhuǎn)向角度

    // Use this for initialization

    void Start () {

    rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame

    void Update () {

    float h = Input.GetAxis("HorizontalPlayer" + number);

    float v = Input.GetAxis("VerticalPlayer" + number);

    rb.velocity = transform.forward * v * speed;

    rb.angularVelocity = transform.up * h * angularSpeed;

    }

    }

    因?yàn)閚umber默認(rèn)為1,所以需要修改”Tank2“的”Tank Movement“組件下的”Number“屬性,將其改為2。

    然后需要注意一點(diǎn),我們還要把”Tank“預(yù)制體的”Constraints“下的”Freeze Position“的”Y“給勾選上,把”Freeze Rotation“的”X“、”Z“勾選上

    4.2、控制坦克攻擊

    給坦克的預(yù)制體添加一個(gè)腳本組件,將其命名為”TankAttack“。右鍵此腳本,點(diǎn)擊”Edit Script“,編輯腳本文件的內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class TankAttack : MonoBehaviour {

    public Transform firingPointTransform;

    public GameObject shellPrefab;

    public KeyCode firingKey = KeyCode.Space; // 開(kāi)火鍵,默認(rèn)為空格鍵

    // Use this for initialization

    void Start () {

    }

    // Update is called once per frame

    void Update () {

    if (Input.GetKeyDown(firingKey)) {

    Instantiate(shellPrefab,
    firingPointTransform.position,
    firingPointTransform.rotation); // 發(fā)射炮彈即實(shí)例化炮彈

    }

    }

    }

    寫入以上代碼后,別忘了在Unity中給”firingPointTransform“和”shellPrefab“賦值,然后再把”Tank2“的”firingKey“改為回車鍵。

    五、控制炮彈的飛行和爆炸

    在”Shell“預(yù)制體上添加一個(gè)腳本組件,并命名為”Shell“,用來(lái)控制炮彈的飛行和爆炸。右鍵此腳本組件并選擇”Edit Script“,編輯腳本的內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Shell : MonoBehaviour {

    private Rigidbody rb;

    public GameObject shellExplosionPrefab;

    public float shellSpeed = 15;

    private float duration = 1.50f; // 爆炸動(dòng)畫效果持續(xù)時(shí)間

    // Use this for initialization

    void Start () {

    rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame

    void Update () {

    rb.velocity = transform.forward * shellSpeed;

    }

    private void OnCollisionEnter(Collision collision)

    {

    GameObject shellExplosion = Instantiate(shellExplosionPrefab, transform.position, transform.rotation) as GameObject;

    Destroy(gameObject);

    Destroy(shellExplosion, duration);

    }

    }

    同樣別忘了在Unity中給屬性”shellExplosionPrefab“賦值。還要記得把”ShellExplosion“的”Play On Awake“勾選上。這樣動(dòng)畫才能播放

    六、控制坦克的血量和傷害

    首先修改”Shell.cs“腳本的內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Shell : MonoBehaviour {

    private Rigidbody rb;

    public GameObject shellExplosionPrefab;

    public float shellSpeed = 15;

    private float duration = 1.50f; // 爆炸動(dòng)畫效果持續(xù)時(shí)間

    // Use this for initialization

    void Start () {

    rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame

    void Update () {

    rb.velocity = transform.forward * shellSpeed;

    }

    private void OnCollisionEnter(Collision collision)

    {

    GameObject shellExplosion = Instantiate(shellExplosionPrefab, transform.position, transform.rotation) as GameObject;

    Destroy(gameObject);

    Destroy(shellExplosion, duration);

    // 如果炮彈攻擊到的是坦克,則對(duì)此坦克造成傷害

    if (collision.collider.tag == "Tank") {

    collision.collider.SendMessage("TankDamage");

    }

    }

    }

    給坦克的預(yù)制體添加一個(gè)名為”TankHealth“的腳本組件用來(lái)控制坦克的血量,編輯腳本,其內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class TankHealth : MonoBehaviour {

    public float hp = 100; // 坦克默認(rèn)共有100滴血

    private float hpTotal;

    public GameObject tankExplosionPrefab;

    private float duration = 1.05f;

    public Slider slider;

    // Use this for initialization

    void Start () {

    hpTotal = hp;

    }

    // Update is called once per frame

    void Update () {

    }

    // 坦克受到傷害

    private void TankDamage() {

    hp -= Random.Range(10, 20);

    slider.value = hp / hpTotal;

    if (hp <= 0) { // 坦克血量小于0,被干掉了

    GameObject tankExplosion = Instantiate(tankExplosionPrefab, transform.position, transform.rotation) as GameObject;

    Destroy(gameObject);

    Destroy(tankExplosion, duration);

    }

    }

    }

    還是那句話,別忘了在Unity中給屬性”tankExplosionPrefab“和”slider“賦值。當(dāng)然”TankExplosion“的”Play On Awake“也要勾選上。

    七、控制相機(jī)跟隨與視野變化

    在控制相機(jī)”Camera“之前,先把相機(jī)的投影方式改為正交投影”O(jiān)rthographic“,并控制相機(jī)視角讓其正好同時(shí)能觀察到兩個(gè)坦克

    7.1、控制相機(jī)的跟隨

    在相機(jī)”Main Camera“中添加腳本組件,并將其命名為”FollowTarget“,腳本文件的內(nèi)容如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class FollowTarget : MonoBehaviour {

    public Transform tank1Transform;

    public Transform tank2Transform;

    private Vector3 offset; // 相機(jī)和兩坦克的相對(duì)位移,保持其不變即可完成相機(jī)跟隨

    // Use this for initialization

    void Start () {

    offset = transform.position - (tank1Transform.position + tank2Transform.position) / 2;

    }

    // Update is called once per frame

    void Update () {

    if (tank1Transform == null || tank2Transform == null) return;

    transform.position = (tank1Transform.position + tank2Transform.position) / 2 + offset;

    }

    }

    這里也要注意別忘了給”tank1Transform“和”tank2Transform“這兩個(gè)屬性賦值。

    7.2、控制視野范圍的變化

    再次打開(kāi)腳本文件”FollowTarget.cs“,修改為如下內(nèi)容:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class FollowTarget : MonoBehaviour {

    public Transform tank1Transform;

    public Transform tank2Transform;

    private Camera c;

    private Vector3 offset; // 相機(jī)和兩坦克的相對(duì)位移,保持其不變即可完成相機(jī)跟隨

    private float viewProportion; // 此視野比例乘兩坦克之間的距離即是當(dāng)前視野大小

    // Use this for initialization

    void Start () {

    c = GetComponent<Camera>();

    offset = transform.position - (tank1Transform.position + tank2Transform.position) / 2;

    viewProportion = c.orthographicSize / Vector3.Distance(tank1Transform.position, tank2Transform.position);

    }

    // Update is called once per frame

    void Update () {

    if (tank1Transform == null || tank2Transform == null) return;

    transform.position = (tank1Transform.position + tank2Transform.position) / 2 + offset;

    c.orthographicSize = viewProportion * Vector3.Distance(tank1Transform.position, tank2Transform.position);

    }

    }

    將上面內(nèi)容添加完畢后你會(huì)發(fā)現(xiàn),兩個(gè)坦克會(huì)一直處于相機(jī)視野的中心,并且視野范圍會(huì)隨著兩個(gè)坦克之間距離的變化而變化。

    八、給游戲添加音效

    終于到最后了,在這里我們將給游戲添加音效,讓游戲玩起來(lái)更帶感!

    你可以定位到”Assets“→”AudioClips“目錄下看一看已經(jīng)準(zhǔn)備好的音樂(lè),有游戲的背景聲、坦克的引擎聲、炮彈的爆炸聲等等,也可以先聽(tīng)一聽(tīng)它的效果

    8.1、添加游戲背景音

    首先我們來(lái)添加背景聲,在”Hierarchy“窗口下右鍵→”Create Empty“創(chuàng)建一個(gè)空的游戲物體并命名為”GameManager“

    按照下圖步驟給”GameManager”添加一個(gè)”Audio Source“組件

    下面給“Audio Source”設(shè)置一個(gè)聲音源,將“Assets”→“AudioClips”目錄下的背景音樂(lè)的聲音設(shè)置為“AudioClip”的值,并將“Play On Awake”和“Loop ”給勾選上。這樣背景聲就可以循環(huán)播放

    8.2、給坦克添加引擎聲和銷毀聲

    8.2.1、設(shè)置引擎聲

    接下來(lái)我們?cè)O(shè)置坦克引擎的聲音,打開(kāi)腳本“TankMovement.cs”,修改為如下內(nèi)容:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class TankMovement : MonoBehaviour {

    private Rigidbody rb;

    public int number = 1; // 通過(guò)編號(hào)區(qū)分不同坦克

    public float speed = 10; //速度大小

    public float angularSpeed = 10; //轉(zhuǎn)向角度

    public AudioClip engineDrivingAudio;

    public AudioClip engineIdleAudio;

    // Use this for initialization

    void Start () {

    rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame

    void Update () {

    float h = Input.GetAxis("HorizontalPlayer" + number);

    float v = Input.GetAxis("VerticalPlayer" + number);

    rb.velocity = transform.forward * v * speed;

    rb.angularVelocity = transform.up * h * angularSpeed;

    if (Mathf.Abs(h) > 0.1 || Mathf.Abs(v) > 0.1)

    {

    AudioSource.PlayClipAtPoint(engineDrivingAudio, transform.position);

    }

    else {

    AudioSource.PlayClipAtPoint(engineIdleAudio, transform.position);

    }

    }

    }

    8.2.2、設(shè)置銷毀聲

    打開(kāi)腳本文件“TankHealth.cs”并按如下內(nèi)容進(jìn)行修改:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.UI;

    public class TankHealth : MonoBehaviour {

    public float hp = 100; // 坦克默認(rèn)共有100滴血

    private float hpTotal;

    public GameObject tankExplosionPrefab;

    private float duration = 1.05f;

    public Slider slider;

    public AudioClip tankExplosionAudio;

    // Use this for initialization

    void Start () {

    hpTotal = hp;

    }

    // Update is called once per frame

    void Update () {

    }

    // 坦克受到傷害

    private void TankDamage() {

    hp -= Random.Range(10, 20);

    slider.value = hp / hpTotal;

    if (hp <= 0) { // 坦克血量小于0,被干掉了

    GameObject tankExplosion = Instantiate(tankExplosionPrefab, transform.position, transform.rotation) as GameObject;

    Destroy(gameObject);

    Destroy(tankExplosion, duration);

    AudioSource.PlayClipAtPoint(tankExplosionAudio, transform.position);

    }

    }

    }

    8.3、給炮彈添加聲音

    8.3.1、設(shè)置炮彈的裝載聲

    打開(kāi)腳本“TankAttack.cs”,將內(nèi)容修改如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class TankAttack : MonoBehaviour {

    public Transform firingPointTransform;

    public GameObject shellPrefab;

    public KeyCode firingKey = KeyCode.Space; // 開(kāi)火鍵,默認(rèn)為空格鍵

    public AudioClip shotChargingAudio;

    // Use this for initialization

    void Start () {

    }

    // Update is called once per frame

    void Update () {

    if (Input.GetKeyDown(firingKey)) {

    Instantiate(shellPrefab,
    firingPointTransform.position,
    firingPointTransform.rotation); // 發(fā)射炮彈即實(shí)例化炮彈

    AudioSource.PlayClipAtPoint(shotChargingAudio, transform.position);

    }

    }

    }

    8.3.2、設(shè)置炮彈的開(kāi)火聲和爆炸聲

    打開(kāi)腳本文件“Shell.cs”,將內(nèi)容修改如下:

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class Shell : MonoBehaviour {

    private Rigidbody rb;

    public GameObject shellExplosionPrefab;

    public float shellSpeed = 15;

    private float duration = 1.50f; // 爆炸動(dòng)畫效果持續(xù)時(shí)間

    public AudioClip shellExplosionAudio;

    public AudioClip shotFiringAudio;

    // Use this for initialization

    void Start () {

    rb = GetComponent<Rigidbody>();

    }

    // Update is called once per frame

    void Update () {

    rb.velocity = transform.forward * shellSpeed;

    AudioSource.PlayClipAtPoint(shotFiringAudio, transform.position);

    }

    private void OnCollisionEnter(Collision collision)

    {

    GameObject shellExplosion = Instantiate(shellExplosionPrefab, transform.position, transform.rotation) as GameObject;

    Destroy(gameObject);

    Destroy(shellExplosion, duration);

    AudioSource.PlayClipAtPoint(shellExplosionAudio, transform.position);

    // 如果炮彈攻擊到的是坦克,則對(duì)此坦克造成傷害

    if (collision.collider.tag == "Tank") {

    collision.collider.SendMessage("TankDamage");

    }

    }

    }

    到這里音效的設(shè)置也算告一段落了,還是要提醒一下別忘了在Unity中給相關(guān)的“AudioClip”屬性賦值。然后也別忘了保存場(chǎng)景哦。

    好了,差不多就這樣吧!一個(gè)簡(jiǎn)單的坦克對(duì)戰(zhàn)的游戲就基本開(kāi)發(fā)完成了,你還可以把該游戲Build到電腦上,勁情享受自己開(kāi)發(fā)的游戲帶來(lái)的樂(lè)趣吧!

    --END

    熱門課程推薦

    熱門資訊

    請(qǐng)綁定手機(jī)號(hào)

    x

    同學(xué)您好!

    您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
    確定