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

使用PointerEventData报"Unexpected symbol"错误,Unity中Vector2.MoveTowards用法求助

问题分析与修复方案

作为Unity+C#新手,你遇到的问题核心是对Vector2.MoveTowards的用法理解有误,再加上代码里的语法/参数错误,才导致了一系列报错。我们一步步拆解并修复:

1. 核心错误:Vector2.MoveTowards的参数完全不符合要求

这个方法的作用是计算从当前位置到目标位置的步进位置,它的参数规则是:

  • 第一个参数:当前物体的位置(Vector2/Vector3类型),不是GameObject实例
  • 第二个参数:目标位置(Vector2/Vector3类型)
  • 第三个参数:单次调用时允许移动的最大距离(float类型)

你现在传了GameObject.Find("player-1")(一个GameObject对象)和语法错误的Vector2 PointerEventData.position(),完全不符合方法要求,这是触发报错的根本原因。

2. 次要错误:PointerEventData用法不对

OnMouseDown是Unity内置的鼠标点击事件,不需要手动调用PointerEventData——而且你写的语法本身就错了(Vector2和PointerEventData之间缺了成员访问符,也没实例化这个对象)。如果要获取鼠标点击位置,在这个方法里直接用Input.mousePosition即可,但注意这是屏幕坐标,需要转成世界坐标才能用于物体移动。

3. 容易忽略的点:MoveTowards不会直接移动物体

这个方法只是返回计算后的新位置,你必须把结果赋值给物体的transform.position,才会让物体真正移动。

修复后的代码示例

using UnityEngine;

public class PlayerShoot : MonoBehaviour
{
    public GameObject bullet_player;
    public float p1BulletSpeed = 5f;
    private float weapCoolDown = 1f;
    private float lastFireTime;
    // 提前缓存player引用,避免重复Find损耗性能
    private Transform playerTransform;

    void Start()
    {
        playerTransform = GameObject.Find("player-1").transform;
    }

    void OnMouseDown()
    {
        // 实现冷却逻辑(你之前定义了weapCoolDown但没用到)
        if (Time.time - lastFireTime < weapCoolDown)
            return;
        lastFireTime = Time.time;

        // 生成子弹并设置初始位置
        GameObject bullet = Instantiate(bullet_player);
        bullet.transform.position = playerTransform.position;

        // 把鼠标屏幕坐标转成世界坐标(2D游戏需固定Z轴避免物体跑到相机后)
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPos.z = 0f;
        Vector2 targetPos = mouseWorldPos;

        // 更适合子弹的移动方式:给刚体加方向速度(一次性触发,不用逐帧调用)
        Vector2 moveDirection = (targetPos - (Vector2)playerTransform.position).normalized;
        bullet.GetComponent<Rigidbody2D>().velocity = moveDirection * p1BulletSpeed;

        // 如果你一定要用MoveTowards,需要给子弹单独写逐帧更新的脚本:
        /*
        // 子弹脚本示例
        public class BulletMove : MonoBehaviour
        {
            public Vector2 targetPos;
            public float moveSpeed;

            void Update()
            {
                transform.position = Vector2.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
            }
        }
        */
        // 生成子弹时赋值参数
        // bullet.GetComponent<BulletMove>().targetPos = targetPos;
        // bullet.GetComponent<BulletMove>().moveSpeed = p1BulletSpeed;
    }
}

额外注意事项

  • 关于EventSystems报错:如果你的场景里没有UI,其实不需要额外引用;如果有UI,确保场景中有一个EventSystem对象(右键UI菜单可创建),但你的问题根源不是这个。
  • GameObject.Find性能问题:尽量不要在每次点击时调用,提前在Start里缓存引用更高效。
  • 2D/3D适配:如果是3D游戏,改用Vector3.MoveTowards,并根据相机类型调整坐标转换逻辑。

你不需要额外的类或引用,主要是对方法用法和Unity坐标系统的理解偏差,上面的代码提供了两种子弹移动方案,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:20