游戏场景------主玩家------武器和子弹对象
武器
类字段
开火方法
然后再玩家类中关联武器
再调用武器的开火方法
记录武器的拥有者
设置武器的拥有者
为什么要记录和设置武器的拥有者?
因为我们要对子弹的拥有者进行设置,所以就要通过武器的拥有者来间接设置子弹的拥有者。
子弹
类字段
让子弹向前移动
自己再新建一个子弹预制体用于存储子弹
然后为子弹添加一个碰撞器和刚体组件,并将其碰撞器设置为is Tigger
子弹的碰撞逻辑
先为墙壁和地面添加一个标签
设置子弹的拥有者
将武器的拥有者设置为子弹的拥有者(它们都是TankBaseObj类型的变量)这样就可以来进行伤害判断了。
当子弹碰到物体时播放特效
跟子弹一样,新建一个特效预制体
然后再将特效预制体拖拽给子弹预制体即可
为特效预制体添加一个audioSoucre,并为其添加一个音效
控制音效
直到当前WeaponObj和BulletObj的代码如下
cs
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>();
bulletObj.SetFather(fatherObj);
}
}
//设置武器的拥有者
public void SetFather(TankBaseObj obj)
{
fatherObj = obj;
}
}
cs
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<TankBaseObj>();
if (obj != null)
{
obj.Wound(fatherObj);
}
if (effObj != null)
{
GameObject eff = Instantiate(effObj, transform.position, transform.rotation);
//获取特效预制体上挂载的音源组件并控制其音效
AudioSource audioSource = eff.GetComponent<AudioSource>();
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;
}
}