unity3d 使用带有多个示例的预制脚本中的变量

i2loujxw  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(93)

我正在创建一个2D的统一游戏。游戏的想法是2D点(马)围绕赛马场比赛。我有一个名为horsePos(马的位置,如第一,第二,第三)的int变量。这很有效。我试图做的是看看哪匹马在前面,无论是Horse(原始预制件)还是预制件的示例化版本(Horse(1))。
所以我使用了一个外部脚本,它是一个名为Game Handler的空gameObject。这是我对gameObject的引用。

horseOne = GameObject.Find("Horse");
        horseTwo = GameObject.Find("Horse (1)");

在更新中尝试以下代码时,它给了我错误“'GameObject'不包含'horsePos'的定义,并且找不到接受类型'GameObject'的第一个参数的可访问扩展方法'horsePos'”

if (horseOne.horsePos < horseTwo.horsePos)
        {
            Debug.Log("horse 1 infront");
        }

我已经尝试使用,但由于我针对超过1个示例的特定脚本,我不相信这将工作,所以我需要针对gameObject,然后脚本的特定gameObject。
任何帮助将不胜感激,如果有任何额外的信息,我会提供它。提前感谢!

ffx8fchx

ffx8fchx1#

永远不要使用GameObject.Find。这只是一个不好的习惯。对于这种用例,请使用检查器引用预制件并将示例化的对象存储在变量中。像这样更改代码:

public class GameHandler : MonoBehaviour
{
    public Horse horsePrefab;

    private Horse horseOne;
    private Horse horseTwo;

    private void Start()
    {
        SpawnHorses();
    }

    public void SpawnHorses()
    {
        horseOne = Instantiate(horsePrefab);
        horseTwo = Instantiate(horsePrefab);
    }

    private void CheckHorses()
    {
        if (horseOne.horsePos < horseTwo.horsePos)
        {
            Debug.Log("horse 1 infront");
        }
    }
}

public class Horse : MonoBehaviour
{
    public int horsePos;
}

之后,通过拖放将horsePrefab分配给检查器中的GameHandler。这将使您的代码更好,并解决您的问题。此外,为了更正确的方法,可以考虑像这样定义horsePrefab字段,以避免破坏失能:

[SerializeField] Horse horsePrefab;

相关问题