如何访问我在另一个函数中定义的另一个变量?

How can I access another variable I defined in another function?

提问人:Mr Glub 提问时间:6/24/2023 最后编辑:Rufus LMr Glub 更新时间:6/24/2023 访问量:57

问:

该方法将用于按钮,并希望在开始时定义变量,但我不确定该怎么做(Unity 2D):Attack()

using System.Collections;
using System.Collections.Generic;
using UnityEditor.SearchService;
using UnityEngine;
using TMPro;

public class DefaultEnemy : MonoBehaviour
{
    public static void DefineVariables()
    {
        int phealth = GameObject.Find("VStorage").GetComponent<VStorage>().phealth;
        int pdamage = GameObject.Find("VStorage").GetComponent<VStorage>().pdamage;

        int ehealth = GameObject.Find("VStorage").GetComponent<VStorage>().ehealth;
    }

    public static void Attack()
    {
        ehealth = ehealth - pdamage
    }

    private void Update()
    {
    }

    private void Start()
    {
        DefineVariables();
    }
}

我尝试了一些东西,比如为变量制作方法。我希望这会做一些事情,但我只是得到一个不同的错误 :/

C# unity-game-engine 变量

评论

0赞 marc_s 6/24/2023
这是一个变量 - 不是“可变的”:..
0赞 shingo 6/24/2023
你为什么使用静电?你尝试过什么?你期望做什么?你遇到了什么错误?

答:

0赞 akaBase 6/24/2023 #1

您正在更新该脚本中的值,而不是组件中的值,为此,您希望使用对组件的引用。VStorageVStorage

请参阅下面的示例

// Reference to the VStorage component
private VStorage vStorage;

public static void Attack()
{
    //Update the value on the component like so
    vStorage.ehealth = vStorage.ehealth - vStorage.pdamage;
    //But it can be made simpler by using -= which does the same thing (+= will add a value)
    // vStorage.eHealth -= vStorage.pdamage;
}
private void Awake()
{
    // Setup the VStorage reference, you can find it using this method rather than looking for the GameObject and then getting the component
    vStorage = FindObjectOfType<VStorage>();
}

看看这些关于运算符和表达式的文档,以更好地理解,等等-=

评论

0赞 Mr Glub 6/24/2023
现在我只是收到一个错误,说非静态字段需要对象引用。此外,VStorage 是一个游戏对象,附加了一个脚本来携带变量
0赞 akaBase 6/24/2023
你在方法中创建引用,这就是AwakeFindObjectOfType
0赞 Mr Glub 6/24/2023
我仍然收到错误,但是当io将Awake()更改为Start()时,它工作正常:/
0赞 Rufus L 6/24/2023 #2

我对Unity一无所知,但您的问题与变量SCOPE有关。变量可以从定义它们的块内访问,因此如果要从多个方法访问变量,则需要在单个方法的范围之外(在类级别)定义它们:

public class DefaultEnemy : MonoBehaviour
{
    // Variables defined at the class level can 
    // be accessed from any method in the class
    int phealth = 0;
    int pdamage = 0;
    int ehealth = 0;

    public static void DefineVariables()
    {
        phealth = GameObject.Find("VStorage").GetComponent<VStorage>().phealth;
        pdamage = GameObject.Find("VStorage").GetComponent<VStorage>().pdamage;
        ehealth = GameObject.Find("VStorage").GetComponent<VStorage>().ehealth;
    }

    public static void Attack()
    {
        ehealth = ehealth - pdamage;
    }

    private void Start()
    {
        DefineVariables();
    }
}