切换武器
给武器设置坑位,人枪分离
创建一个¥WeaponHolder
把原来武器的位置复制出来,给¥WeaponHolder
把原来的武器模型拖进assets文件夹里
专门创建WeaponManager类来管理武器
在¥Player里创建WeaponManager类
在WeaponManager类里
//切换武器是网络行为
public class WeaponManager : NetworkBehaviour
{
//PlayerWeapon之前在PlayerShooting里面用,是一个公共类大家都可以用,里面包含了枪的类型,数值等
[SerializeField]
private PlayerWeapon primaryWeapon;
//角色当前的武器
private PlayerWeapon currentWeapon;
void Start()
{
//初始默认主武器
EquipWeapon(primaryWeapon);
}
//切换武器
//其他地方可以通过WeaponManager的实例来调用此函数切换武器
public void EquipWeapon(PlayerWeapon weapon) {
currentWeapon = weapon;
}
//别的地方获取武器
public PlayerWeapon GetCurrentWeapon() {
return currentWeapon;
}
void Update()
{
}
}
在之前用过PlayerWeapon的地方更新一下代码
在PlayerShooting里
public class PlayerShooting : NetworkBehaviour
{
//之前通过序列化PlayerWeapon的weapon来获取伤害值
//现在通过weaponManager来获取武器信息,而不在这里更改武器数值
//[SerializeField]
//private PlayerWeapon weapon;
private WeaponManager weaponManager;
private PlayerWeapon currentWeapon;
...
void Start()
{
...
//动态找寻组件
weaponManager = GetComponent<WeaponManager>();
}
void Update()
{
//每次在读入开枪时先看看手上拿着是什么枪
//看成不停读入有没有切换武器
currentWeapon = weaponManager.GetCurrentWeapon();
...
}
private void Shoot() {
...
//射击时改成当前武器
if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, currentWeapon.range, mask)) {
if (hit.collider.tag == "Player") {
ShootServerRpc(hit.collider.name, currentWeapon.damage);
}
}
}
...
}
给PlayerWeapon添加图标
在PlayerWeapon里
public class PlayerWeapon
{
...
//将武器的模型托进来
public GameObject graphcis;
}
渲染¥WeaponHolder,用代码实现把¥M14拖进¥WeaponHolder里
在WeaponManager里
public class WeaponManager : NetworkBehaviour
{
...
//把¥WeaponHolder拖进来
[SerializeField]
private GameObject weaponHolder;
...
//切换武器
//其他地方可以通过WeaponManager的实例来调用此函数切换武器
public void EquipWeapon(PlayerWeapon weapon) {
currentWeapon = weapon;
//实例化出一个GameObject的克隆体出来,并附带位置(我猜的)
GameObject weaponObject = Instantiate(currentWeapon.graphcis, weaponHolder.transform.position, weaponHolder.transform.rotation);
weaponObject.transform.SetParent(weaponHolder.transform);
}
...
}
实现连发
在PlayerWeapon里
public class PlayerWeapon
{
...
public float shootRate = 10f;//平均每秒射十发
}
在PlayerShooting里
public class PlayerShooting : NetworkBehaviour
{
...
void Update()
{
//每次在读入开枪时先看看手上拿着是什么枪
//看成不停读入有没有切换武器
currentWeapon = weaponManager.GetCurrentWeapon();
//单发
if (currentWeapon.shootRate <= 0)
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
}
}
else //连发
{
if (Input.GetButtonDown("Fire1"))
{
//对Shoot()执行周期函数
InvokeRepeating("Shoot", 0f, 1f / currentWeapon.shootRate);
}else if (Input.GetButtonUp("Fire1"))
{
//对Shoot()关闭周期函数
CancelInvoke("Shoot");
}
}
}
...
}
实现切换武器
先在prefabs里创一个沙鹰出来,然后把他拖进WeaponManager里的secondWeapon里
在WeaponManager里
public class WeaponManager : NetworkBehaviour
{
...
[SerializeField]
private PlayerWeapon secondaryWeapon;
...
//切换武器
private void ToggleWeapon()
{
if (currentWeapon == primaryWeapon) {
EquipWeapon(secondaryWeapon);
}else
{
EquipWeapon(primaryWeapon);
}
}
//广播切枪
[ClientRpc]
private void ToggleWeaponClientRpc()
{
ToggleWeapon();
}
[ServerRpc]
private void ToggleWeaponServerRpc()
{
//Host服务器就要把下面代码注释掉,不然EquipWeapon()执行两次
ToggleWeapon();
ToggleWeaponClientRpc();
}
void Update()
{
if (IsLocalPlayer) {
if (Input.GetKeyDown(KeyCode.Q))
{
ToggleWeaponServerRpc();
}
}
}
}