gpt4 book ai didi

c# - 我如何在 monobehaviour 类中重复使用代码?

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:51 25 4
gpt4 key购买 nike

首先,我想简要介绍一下我的问题:我如何访问附加到另一个游戏对象的另一个代码片段,或者我如何在没有附加游戏对象的情况下初始化一个类。

当我在 Unity 中制作一个小游戏时,我制作了一个单位设计器,您可以在其中提供一些值,例如它携带多少武器,以及该单位的状态(攻击、射程、速度等)将被计算通过 ComputeValues() 并在您单击确认时保存。但是所有这些值都是通过单击按钮而不是直接输入来调整的。 (即单击一个按钮并添加/减少 1 个武器)

但是,当我尝试在启动时添加一些模板单元时,它不起作用。所以我做了一个 CreateDesignWithValue() 函数。它接受所有相关数据的输入,并使用上面的 ComputeValues() 计算该对象的值。

问题是我正试图在玩家类中这样做。但我无法创建新的 ShipDesigner,也无法将其设置为静态。我怎样才能访问它?

最佳答案

在不知道您确切的用例以及您所谈论的方法的情况下,我们只能给出一个非常笼统的答案:

并非所有类都必须是 MonoBehaviour 类型,这实际上取决于您的需要。

扩展方法

如果您对某种类型有一定的计算,您可以使用 Extension Methods喜欢

public static class Vector3Extensions
{
public static Vector3 DevideBy(this Vector3 a, Vector3 b)
{
return new Vector(a.x / b.x, a.y / b.y, a.z / b.z);
}
}

你可以像这样使用

var newVector = transform.position.DevideBy(new Vector(1, 2, 3));

在所有其他类中。

公共(public)静态类

通常,您可以使用公共(public)静态类 来实现方法并存储可从任何地方执行的值,例如

public static class Settings
{
private static int _currentInt = 7;

public static void SaySomething(string something)
{
Debug.Log(something);
}

public static void DoubleCurrentInt()
{
_currentInt *= 2;
}

public static int GetSquareOfCurrentInt()
{
return _currentInt * _currentInt;
}
}

你现在可以从任何地方调用它

Settings.DoubleCurrentInt();
Settings.SaySomething(Settings.GetSquareOfCurrentInt.Tostring);

实例

当然有时你不希望某些东西可以从任何地方访问,所以你也可以简单地为你的计算使用一个普通的实例类

public class Settings
{
private int _currentInt = 7;

public Settings(int initialInt = 0)
{
_currentInt = initialInt;
}

public void SaySomething(string something)
{
Debug.Log(something);
}

public void DoubleCurrentInt()
{
CurrentInt *= 2;
}

public int GetSquareOfCurrentInt()
{
return CurrentInt * CurrentInt;
}
}

所以你可以使用

private Settings settings;

private void Start()
{
new Settings(3);
}

在一个 MonoBehaviour

private Settings settings;

private void Start()
{
new Settings(26);
}

在另一个 MonoBehaviour 中,两者都有不同的实例,但可以使用其中的所有实现来单独计算和执行操作。

公共(public)静态无效

您也可以只在特定类型的所有实例中“共享”一个方法 (static) 并且还允许其他类型访问它 (public)

public class A : MonoBehaviour
{
// A prefab only this specific component has access to
[SerializeField] private GameObject prefab;

// example for a kind of singleton pattern
private static GameObject prefabSingleton;

private void Start()
{
prefabSingleton = prefab;
}

public static void Spawn(int someIntToAssign, string someTextToAssign)
{
var obj = Instantiate(prefabSingleton)

; componentReference = obj.GetComponent();

        componentReference.someIntField = someIntToAssign;

componentReference.Getcomponent<Text>().text = someTextToAssign;
}
}

你也可以从其他类型调用它

A.Setup(someExampleReference, "Yeay!");

(在此示例中,您可以考虑在 SomeExampleType 中实现它,尽管 ^^)

ScriptableObjects

你描述的也听起来像ScriptableObjects ( Tutorial ) 您可能会感兴趣。

ScriptableObjects 是一种类似于预制件的 Assets ,但可以存储值和方法。您可以在 MonoBehaviour 组件的字段中引用它们,以根据值更改它们的行为,或者为了在多个实例和不同类型之间将其作为一种容器共享。

使用public 方法的实例

最后但同样重要的是,最“通常”的做法是拥有一个

public class A : MonoBehaviour
{
[SerializeField] private Transform someObject;

public Vector3 GetObjectPosition()
{
return someObject.position;
}
}

并通过许多 GetComponent 或/和 FindObjectOfType 变体之一或简单地通过引用相应的组件来访问它

public class B : MonoBehaviour
{
// drag in via the Inspector
public A AReference;

private void Start()
{
// or get it on runtime e.g.
AReference = GameObject.Find("ObjectWithA").GetComponent<A>();

// or if there is only one e.g.
AReference = FindObjectOfType<A>();


Debug.Log(AReference.GetObjectPosition());
}
}

关于c# - 我如何在 monobehaviour 类中重复使用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com