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

Unity传送脚本报错:当前上下文中不存在final_Distance变量

Unity传送功能坐标获取报错的修复方案

错误原因拆解

  1. final_Distance是Mouse_Radius类中Update方法的局部变量,仅在方法内部有效,外部类根本访问不到。
  2. 你把Unity自带的Update生命周期方法当成普通方法调用,还传了个未定义的参数,这完全不符合Unity的调用规则。
  3. 如果Teleport和Mouse_Radius脚本没挂在同一个游戏对象上,GetComponent<Mouse_Radius>()会返回空值,后续调用直接报错。

第一步:修改Mouse_Radius类,暴露传送坐标

把final_Distance改成类的公共成员变量,让外部能直接读取:

using UnityEngine;

public class Mouse_Radius : MonoBehaviour
{
    public GameObject Player;
    public float radius;
    // 把局部变量升级为类的公共成员
    public Vector2 final_Distance;

    void Start()
    {
        Cursor.visible = false;
    }

    // 保留Unity原生Update方法,不要改返回值和参数
    void Update()
    {
        Vector2 Mouse_Cord = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y));
        Vector2 Player_Coord = Player.transform.position;

        Vector2 Player_Cursor_Distance = Mouse_Cord - Player_Coord;
        Vector2 dir = Player_Cursor_Distance.normalized;
        Vector2 cursorVector = dir * radius;

        // 赋值给类成员变量
        final_Distance = Player_Coord + cursorVector;
        transform.position = final_Distance;
    }

    private void OnDrawGizmosSelected()
    {
        UnityEditor.Handles.DrawWireDisc(transform.parent.position, Vector3.back, radius);
    }
}

第二步:修复Teleport类的调用逻辑

修正调用方式,直接读取Mouse_Radius的成员变量,同时优化地面检测逻辑:

using UnityEngine;

public class Teleport : MonoBehaviour
{
    private CharacterController2D characterController2D;
    private Mouse_Radius MR;

    public bool canTeleport = true;

    void Awake()
    {
        characterController2D = GetComponent<CharacterController2D>();
        // 注意:如果Mouse_Radius在其他对象上,换成FindObjectOfType或者Inspector拖拽赋值
        MR = GetComponent<Mouse_Radius>();
    }

    void FixedUpdate()
    {
        if (canTeleport && Input.GetMouseButtonDown(0))
        {
            T_Port();
        }
        else
        {
            // 简化逻辑:落地才能重新传送
            canTeleport = characterController2D.m_Grounded;
        }
    }

    public void T_Port()
    {
        // 直接读取Mouse_Radius的传送坐标
        transform.position = MR.final_Distance;
        canTeleport = false;
    }
}

额外注意点

  • 确保Mouse_Radius脚本挂在显示传送位置的GameObject上,并且Player变量已在Inspector中拖入正确对象。
  • 如果两个脚本不在同一个对象,别用GetComponent,改用FindObjectOfType<Mouse_Radius>()或者手动在Inspector给MR变量赋值。
  • 原代码里screenPosition和worldPosition没用到,可按需删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:43