Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象

游戏场景——主玩家——武器和子弹对象

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第1张图片

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第2张图片

武器

类字段

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第3张图片

开火方法

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第4张图片

然后再玩家类中关联武器

再调用武器的开火方法

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第5张图片

记录武器的拥有者

设置武器的拥有者

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第6张图片

 为什么要记录和设置武器的拥有者?

因为我们要对子弹的拥有者进行设置,所以就要通过武器的拥有者来间接设置子弹的拥有者。

子弹

类字段

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第7张图片

让子弹向前移动

自己再新建一个子弹预制体用于存储子弹

然后为子弹添加一个碰撞器和刚体组件,并将其碰撞器设置为is Tigger

子弹的碰撞逻辑

先为墙壁和地面添加一个标签

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第8张图片

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第9张图片

设置子弹的拥有者

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第10张图片

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第11张图片

将武器的拥有者设置为子弹的拥有者(它们都是TankBaseObj类型的变量)这样就可以来进行伤害判断了。 

当子弹碰到物体时播放特效

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第12张图片

跟子弹一样,新建一个特效预制体

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第13张图片

然后再将特效预制体拖拽给子弹预制体即可

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第14张图片

为特效预制体添加一个audioSoucre,并为其添加一个音效

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第15张图片

控制音效

Unity坦克大战开发全流程——游戏场景——主玩家——武器和子弹对象_第16张图片

直到当前WeaponObj和BulletObj的代码如下

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

public class WeaponObj : MonoBehaviour
{
    //该武器要实例化的子弹对象
    public GameObject bullet;
    //关联的炮口位置
    public Transform[] shootPos;
    //记录武器的拥有者
    public TankBaseObj fatherObj;
    


    //开火方法
    public void Fire()
    {
        //有多少个炮口就创建多少个子弹
        for (int i = 0; i < shootPos.Length; i++)
        {
            GameObject obj = Instantiate(bullet, shootPos[i].transform.position, shootPos[i].transform.rotation);
            //控制子弹做什么
            BulletObj bulletObj = obj.GetComponent();
            bulletObj.SetFather(fatherObj);
        }
    }

    //设置武器的拥有者
    public void SetFather(TankBaseObj obj)
    {
        fatherObj = obj;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletObj : MonoBehaviour
{
    //子弹的移动速度
    public int moveSpeed = 50;
    //是谁发射的子弹
    public TankBaseObj fatherObj;
    //关联的特效
    public GameObject effObj;

    void Update()
    {
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
    }

    //当子弹发生碰撞时
    private void OnTriggerEnter(Collider other)
    {
        //子弹销毁的三种情况:1.碰到墙壁或地面 2.敌人射到了玩家 3.玩家射到了敌人
        if (other.CompareTag("Cube")||other.CompareTag("Player")&&fatherObj.CompareTag("Monster")|| other.CompareTag("Monster") && fatherObj.CompareTag("Player"))
        {
            //执行伤害逻辑
            TankBaseObj obj = other.GetComponent();
            if (obj != null)
            {
                obj.Wound(fatherObj);
            }

            if (effObj != null)
            {

                GameObject eff = Instantiate(effObj, transform.position, transform.rotation);
                //获取特效预制体上挂载的音源组件并控制其音效
                AudioSource audioSource = eff.GetComponent();
                audioSource.volume = GameDataMgr.Instance.musicData.soundValue;
                audioSource.mute = !GameDataMgr.Instance.musicData.isOpenSound;
                if (other.CompareTag("Player"))
                    audioSource.Play();
            }

            Destroy(gameObject);
        }
    }

    //设置子弹的拥有者
    public void SetFather(TankBaseObj obj)
    {
        fatherObj = obj;
    }
}

 

 

你可能感兴趣的:(unity,游戏,游戏引擎)