unity3d 变量在当前上下文Unity Telepportation Script中不存在

xt0899hw  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(181)

我正在做一个学校项目,需要帮助我的代码的某个方面。我正在做一个游戏,想包括一个传送移动,这将是通过一个矢量,其Angular 将由鼠标的方向控制的球员。
我计划通过一个单独的GameObject向玩家显示传送的位置,因此需要从一个单独的对象中的类继承信息。这就是错误开始的地方。而不是继承变量final_Distance,这是一个矢量,包含玩家在传送后出现的矢量末端的坐标,出现错误消息说:“final_Distance名称在当前上下文中不存在。在这件事上工作了大约一个小时后,我真的被我应该做什么难住了。我试着在类的开头声明向量,但没有成功,在Awake void中也是如此。我会很感激你的帮助。
以下是我的传送类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Teleport : MonoBehaviour
{
    public Vector2 screenPosition;
    public Vector2 worldPosition;

    private CharacterController2D characterController2D;
    private Mouse_Radius MR;

    public bool canTeleport = true;

    void Awake()
    {
        characterController2D = GetComponent<CharacterController2D>();
        MR = GetComponent<Mouse_Radius>();
    }

    void FixedUpdate()
    {
        if (canTeleport == true && Input.GetMouseButtonDown(0))
        {

            T_Port();
        }

        else
        {
            bool ground_check = characterController2D.m_Grounded;

            if (!ground_check && canTeleport == false)
            {
                canTeleport = false;
            }
            else
            {
                canTeleport = true;
            }
        }
    }

    public void T_Port()
    {
        worldPosition = MR.Update(final_Distance);

        transform.position = worldPosition;

        canTeleport = false;
    }
}

这里是负责提供gameobject位置的类,它显示了玩家在传送后的最终位置:

public class Mouse_Radius : MonoBehaviour
{
    public GameObject Player;
    public float radius;

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

    // Update is called once per frame
    public 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;

        Vector2 final_Distance = Player_Coord + cursorVector;

        transform.position = final_Distance;
    }

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

}
n7taea2i

n7taea2i1#

变量 * 在这个上下文中不存在。在T_Port方法或其名为final_Distance的类中没有变量。
请注意Mouse_Radius中的代码是如何首先 * 创建 * 一个变量,然后 * 使用 * 该变量的:

Vector2 final_Distance = Player_Coord + cursorVector;

transform.position = final_Distance;

将此与Teleport中的代码进行比较,该代码只尝试 * 使用 * 变量,从未 * 创建 * 它:

worldPosition = MR.Update(final_Distance);

在它被使用之前,它必须存在。因此,目前还不清楚您希望该变量是什么,也不清楚它应该包含什么值。
后退一步。..为什么首先要尝试向Update方法发送值?它不期望一个:

public void Update()

因此,即使你声明了你的变量,并在使用它之前给它赋值,下一个错误将告诉你,你正在向一个不接受值的方法传递一个值。
由于该方法不接受值,因此不要向其传递值:

worldPosition = MR.Update();

这将有一个额外的好处,即纠正试图使用不存在的变量的错误,因为你不再试图使用它。

另外.. Update方法也不会 * 返回任何内容 *:

public void Update()

因此,将其返回值赋给worldPosition也会生成错误。删除分配操作:

MR.Update();

总的来说,Update方法不接受任何参数,也不产生任何结果,所以不要尝试向它传递参数,也不要尝试使用它的结果。
如果你想传递参数给它和/或使用它的结果,那么首先你需要修改Update方法来做你想做的事情,然后你可以调用它来执行那个操作。

w8biq8rn

w8biq8rn2#

要回答为什么final_Distance在上下文中不存在的问题,这是因为Teleport类不能访问该变量-它没有在类定义中定义,或者在Teleport继承的任何类的定义中定义,并且它没有在T_Port()方法的作用域中定义。
幸运的是,在这种情况下,它不需要。Mouse_RadiusUpdate()方法不带参数,并且查看它,执行所有计算以获得final_Distance(仅在该方法的范围内定义,因此仅存在于该方法中)。调用Teleport的T_Port()中的MR上的Update()而不带参数也可以工作,尽管应该注意的是,MonoBehaviour中的Update()在每帧都被unity调用。由于Mouse_RadiusUpdate()方法中没有检查是否允许心灵传送,因此单位将导致玩家在每一帧都进行心灵传送,无论是否应该。
综上所述,将Mouse_Radius中的Update()重命名为类似TeleportPlayer()的东西,无论是在其定义中还是在Teleport脚本中的使用,并且在调用它时也不要给予它任何参数,因为它不需要任何参数(像这样-MR.TeleportPlayer();)。

相关问题