如何在C#/ Unity中访问预定义结构化对象中的其他元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#/ Unity中访问预定义结构化对象中的其他元素?相关的知识,希望对你有一定的参考价值。

我做了一个名为FOOD的预定义对象。 Inside是一个指向PreFab GameObject的GameObject。 GameObject也附加到碰撞脚本。我的问题是,如何在碰撞脚本中访问我的结构的其他元素,如健康,卡路里等?

public class FOODS: ScriptableObject
{
public GameObject preFabFood; 
//points to a prefab object that is attached to a collision script

int health;
int calories;
float height;
float width;
}

//this is the script that is attached to the GameObject preFabFood
void OnCollisionEnter2D(Collision2D c)
{
    //how do I access elements such as height, weight, etc?
}
答案

You have two problems.

1)属性是private,意味着它们对其他类不可见。成员字段is private的默认可见性。

2)属性不在预制件附加的脚本中。

修复#2(如Soraphis)建议是正确的做法,但是,如果你将public GameObject preFabFood;类附加到预制实例(你不需要),你会想要从你的FOODS类中删除FOODS字段用实例化来携带实例化对象的副本。在调整代码时请记住这一点(您发布的代码看起来像一个脚本,但我怀疑它应该不止一个,实际上至少应该是2个)。

至于修复#1,你必须公开它们或从同一个脚本访问它们。如果你直接将你的FOODS类附加到你的实例化预制件并且FOODS类包含OnCollisionEnter2D方法,那么一切都很好。

但是,由于我怀疑你在这里有两个课程,你需要这样做:

public int health;
public int calories;
public float height;
public float width;

然后使用GetComponent()调用从另一个获取一个脚本。例如

FOODS foods = this.gameObject.GetComponent<FOODS>(); //gets the FOODS script attached to this game object.
//Functionally identical to GetComponent<FOODS>();
int hp = foods.health; //etc

请注意,您应该尽可能少地调用GetComponent,因为它具有非零开销,因此请尽快缓存结果(例如,您可以在Start()而不是每次在OnCollisionEnter2D顶部执行此操作),但这是更多的是一般的“小心”标志,因为过度使用会导致帧速率问题。

另一答案

我的问题是,如何在碰撞脚本中访问我的结构的其他元素,如健康,卡路里等?

你不能。但你可以像这样解决它:

在CollisionScript中,将GameObject PrefabFood更改为可编写脚本的对象FOODS food

然后在这个课程中你可以访问这样的东西:

food.preFabFood // is the prefab
food.health // is the health variable

看起来你对编码很新,我之前建议学习基础知识,因为这是基本的编程,并不是真正的统一甚至是c#相关的。

以上是关于如何在C#/ Unity中访问预定义结构化对象中的其他元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity / C# 中访问 Cinemachine 的相机距离值?

会一点java,有面向对象编程基础,选择入门unity有很大难度吗?应如何有效的入门?

c# Unity - 如何在另一个类中调用结构对象数组

如何在 Unity 的另一个场景中访问游戏对象 [重复]

层次结构窗口

C++类和对象