[Unity學習筆記:FPS游戲制作(2)] 發射子彈


一,實現思路
制作子彈的預制體,然后在腳本的Update()中進行監聽用戶是否點擊鼠標左鍵,如果用戶點擊鼠標左鍵,則加載之前制作的子彈預制體,並在槍口的附近位置生成子彈。而且考慮到槍口位置隨用戶游戲視角變化,非固定,所以子彈生成位置不能為絕對位置,而是相對位置。但這里有個問題出現了,那就是子彈發射出去的時候為絕對位置(如果為相對位置的話,發射出去的子彈會隨着槍口位置變化,發生變化。錯誤演示如下圖)

為了解決以上的問題,一個解決辦法就是,在槍口附近新建一個空物體集(Bullets),並將子彈生成為該物體集的子對象,然后因為該物體集本身也為槍口的子物體,所以保證子彈處於槍口的相對位置,最后在發射的時候調用該物體集的DetachChildren(),解除該物體集跟子彈的父子關系,讓子彈發射之后為絕對位置。
解決完子彈發射的位置問題之后,只要通過Destroy()將發射后的子彈物體銷毀,整個子彈發射功能就完成了。

二,實現代碼

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

public class FireScript : MonoBehaviour
{
    public GameObject BulletPrefab;//子彈預制體
    public GameObject Bullets;//子彈物體集
    public Camera PlayerCamera;//玩家攝像頭
    public int BulletSpeed = 800;//子彈速度
    private int index=0;//子彈計數
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Mouse0))//監測鼠標左鍵是否被點擊
        {
            index++;//子彈計數
            GameObject BulletGameObject = Instantiate(BulletPrefab);//加載預制體
            BulletGameObject.name = "Bullet"+index;
            BulletGameObject.transform.parent = Bullets.transform;//設置子彈父對象
            BulletGameObject.transform.localPosition = new Vector3((float)(-1),0,(float)(-0.02));//在指定坐標生成子彈
            BulletGameObject.transform.rotation = PlayerCamera.transform.rotation;
            Bullets.transform.DetachChildren();//解除父子關系
            BulletGameObject.GetComponent<Rigidbody>().AddForce(PlayerCamera.transform.forward * BulletSpeed);//給予子彈一個向前的推進力
            Destroy(BulletGameObject,2);//銷毀子彈物體
        }
    }
}

三,腳本的使用方法

在槍口物體下新建物體集,並將物體集和子彈預制體,玩家攝像頭綁定在腳本上(如下圖)。

 

 

四,最終效果


免責聲明!

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



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