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

Unity中能否修改鼠标指针位置?实现AI攻击时鼠标击退效果

鼠标指针受攻击击退效果实现方案

核心思路

基于你已有的AI攻击触发碰撞器,通过检测碰撞触发、计算击退方向、施加位移/物理力三个步骤实现击退效果,同时加入状态控制避免操作冲突。


1. 碰撞触发监听

在鼠标指针的脚本中,监听AI攻击碰撞器的触发事件,判断攻击来源后启动击退逻辑:

  • 确保AI攻击的碰撞体勾选Is Trigger,并设置专属标签(比如AIAttack)。
  • 在鼠标指针脚本中实现OnTriggerEnter2D(2D场景)或OnTriggerEnter(3D场景)方法。

2. 计算击退方向

击退方向需指向远离AI攻击源的方向,通过向量运算快速获取:

// 2D场景示例:计算从AI到鼠标的反向向量(即远离AI的方向)
Vector2 knockbackDir = (transform.position - attackerTransform.position).normalized;

3. 两种击退实现方式

方式一:物理力驱动(适合带物理效果的场景)

给鼠标指针添加Rigidbody2D(2D)或Rigidbody(3D),通过施加瞬时力实现自然的击退效果:

using UnityEngine;
using System.Collections;

public class MousePointer : MonoBehaviour
{
    [Header("击退参数")]
    public float knockbackForce = 6f;
    public float knockbackLockTime = 0.25f;
    
    private Rigidbody2D _rb;
    private bool _isKnockedBack = false;

    void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
        Cursor.visible = false; // 隐藏系统鼠标
    }

    void Update()
    {
        // 击退期间禁用鼠标跟随控制
        if (!_isKnockedBack)
        {
            Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position = mouseWorldPos;
        }
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("AIAttack"))
        {
            StartCoroutine(ExecuteKnockback(other.transform));
        }
    }

    IEnumerator ExecuteKnockback(Transform attacker)
    {
        _isKnockedBack = true;
        // 计算击退方向
        Vector2 knockbackDir = (transform.position - attacker.position).normalized;
        
        // 施加瞬时力
        _rb.AddForce(knockbackDir * knockbackForce, ForceMode2D.Impulse);
        
        // 等待击退结束,恢复控制
        yield return new WaitForSeconds(knockbackLockTime);
        
        // 停止刚体运动,避免持续滑动
        _rb.velocity = Vector2.zero;
        _isKnockedBack = false;
    }
}

方式二:平滑位置插值(适合无物理的简洁效果)

如果不需要物理反馈,直接通过插值计算位置实现平滑击退:

// 替换上述ExecuteKnockback协程内容
IEnumerator ExecuteKnockback(Transform attacker)
{
    _isKnockedBack = true;
    Vector2 knockbackDir = (transform.position - attacker.position).normalized;
    Vector2 startPos = transform.position;
    Vector2 targetPos = startPos + knockbackDir * knockbackForce;
    float elapsedTime = 0f;

    // 平滑插值移动
    while (elapsedTime < knockbackLockTime)
    {
        transform.position = Vector2.Lerp(startPos, targetPos, elapsedTime / knockbackLockTime);
        elapsedTime += Time.deltaTime;
        yield return null;
    }

    // 确保最终位置准确
    transform.position = targetPos;
    _isKnockedBack = false;
}

注意事项

  • 调整knockbackForce(击退强度)和knockbackLockTime(控制锁定时间)参数,适配游戏手感。
  • 若为3D场景,将Rigidbody2D替换为Rigidbody,Vector2替换为Vector3即可。
  • 确保AI攻击碰撞器仅在攻击生效时启用,避免误触发。

内容的提问来源于stack exchange,提问作者StickKai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:39