You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:56:10