2018年4月21日 星期六

【Unity官方教學分享】射擊(單機)

網頁連結


多人連線遊戲的一個常見特徵是玩家可以發射子彈,並且讓這些子彈在遊戲中的每一個用戶端上執行。
本次的教學將會增加射擊功能,但是會先製作單機版本,非連線模式,下一篇的教學才會包含網路環境下的射擊。

  • 新增一個Sphere物件
  • 將它重新命名為Bullet
  • 選擇Bullet物件,修改scale數值為(0.2, 0.2, 0.2)
  • 在Bullet下新增元件Physics->Rigidbody
  • 將Rigidbody下的Use Gravity設為false
  • 拖曳Bullet至Project視窗下的prefab資料夾,將Bullet設為prefab物件
  • 刪除場經中的Bullet

PlayerController腳本先在需要新增射擊功能,此腳本需要參考Bullet prefab,並由一段程式碼完成射擊功能。
添加Bullet prefab的GameObject變數:
public GameObject bulletPrefab;
添加Bullet生成位置變數:
public Transform bulletSpawn;
在Update中添加以下的判斷式:
if (Input.GetKeyDown(KeyCode.Space))
{
    Fire();
}
新增一個Fire函式來發射子彈:
void Fire()
{
    // Create the Bullet from the Bullet Prefab
    GameObject bullet = (GameObject)Instantiate (
        bulletPrefab,
        bulletSpawn.position,
        bulletSpawn.rotation);

    // Add velocity to the bullet
    bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6;

    // Destroy the bullet after 2 seconds
    Destroy(bullet, 2.0f);
}

完成後PlayerController腳本如下:
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour
{
    public GameObject bulletPrefab;
    public Transform bulletSpawn;

    void Update()
    {
        if (!isLocalPlayer)
        {
            return;
        }

        float x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
        float z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

        transform.Rotate(0, x, 0);
        transform.Translate(0, 0, z);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Fire();
        }
    }


    void Fire()
    {
        // Create the Bullet from the Bullet Prefab
        GameObject bullet = (GameObject)Instantiate(
            bulletPrefab,
            bulletSpawn.position,
            bulletSpawn.rotation);

        // Add velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6;

        // Destroy the bullet after 2 seconds
        Destroy(bullet, 2.0f);        
    }

    public override void OnStartLocalPlayer ()
    {
        GetComponent<MeshRenderer>().material.color = Color.blue;
    }
}
到這裡,既然我們在腳本中增加了射擊功能,就要讓玩家物件看起來能做到這件事。

  • 拖曳Player物件至Hierarchy視窗中
  • 選擇Player物件,在它底下新增Cylinder子物件
  • 將Cylinder物件重新命名為Gun
  • 選擇Gun物件,移除它的Capsule Collider元件
  • 設定Position數值為(0.5, 0.0, 0.5)
  • 設定Rotation數值為(90.0, 0.0, 0.0)
  • 設定Scale數值為(0.25, 0.25, 0.25)
  • 將Gun物件的Material設為Black Material

現在我們的Player物件看起來會是這樣:
  • 接著在Player物件底下生成一個空物件
  • 重新命名為BulletSpawn
  • 設定BulletSpawn物件的Position為(0.5, 0.0, 1.0)

BulletSpawn的位置應該會和下圖一樣,位在Gun物件的末端:
  • 選擇Player物件
  • 按下Inspector介面下的apply按鈕
  • 刪除Player物件

再來我們要將PlayerController腳本的新變數設定好,將Bullet prefab和BulletSpawn拖曳至PlayerController對應的變數:

現在我們可以開始測試結果,老樣子Build and Run執行遊戲,以Host身分開始遊戲;執行Unity,點擊LAN Client以用戶端身分開始遊戲。
現在我們在遊戲中,按下空白鍵會在BulletSpawn位置上生成一個Bullet物件並發射出去,但只限本機,因為目前Bullet物件並沒有被網路系統所認識。

沒有留言:

張貼留言

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...