Unity C#:如何实现瞄准状态切换,使武器在瞄准/非瞄准时切换位置
解决方案
1. 补充取消瞄准的委托与方法
首先在Player脚本中新增用于触发取消瞄准的静态委托:
public static Action aimCancelInput;
接着在WeaponInfo脚本中添加取消瞄准的方法,并在初始化时订阅该委托:
private void Start() { shootingSound = GetComponent<AudioSource>(); Player.shootInput += Shoot; Player.reloadInput += StartReload; Player.aimInput += Aim; // 新增订阅取消瞄准委托 Player.aimCancelInput += CancelAim; aiming = false; // 修正初始值,默认处于非瞄准状态 } // 新增取消瞄准方法 public void CancelAim() { aiming = false; }
2. 修改Player脚本的输入检测逻辑
在Player脚本中补充松开瞄准键时的处理逻辑,触发取消瞄准委托:
void Update() { if (Input.GetKey(aimKey)) { aimInput?.Invoke(); } // 新增松开瞄准键的处理 if (Input.GetKeyUp(aimKey)) { aimCancelInput?.Invoke(); } }
3. 可选优化:简化逻辑(无需额外委托)
如果想省去委托订阅的步骤,可以直接在Player中维护瞄准状态,让WeaponInfo直接读取:
- 在Player脚本中添加静态状态字段:
public static bool isAiming = false;
- 修改Player的输入逻辑:
void Update() { isAiming = Input.GetKey(aimKey); }
- 在WeaponInfo的Update方法中直接使用该状态:
private void Update() { timeSinceLastShot += Time.deltaTime; Debug.DrawRay(playerCamera.position, playerCamera.forward); // 直接读取Player的瞄准状态 transform.position = Player.isAiming ? ADSWeaponPos.position : DefaultWeaponPos.position; }
额外优化建议
为了让武器位置切换更自然,可以添加平滑过渡效果,替换原有的直接赋值:
private void Update() { timeSinceLastShot += Time.deltaTime; Debug.DrawRay(playerCamera.position, playerCamera.forward); Vector3 targetPos = aiming ? ADSWeaponPos.position : DefaultWeaponPos.position; // 使用Lerp实现平滑移动,8f为过渡速度,可根据需求调整 transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * 8f); }
内容的提问来源于stack exchange,提问作者Arbuzinsky
相关产品推荐
相关产品推荐

