我有一个控制器类来控制一个游戏对象的健康。它不是一个MonoBehavior,但它将被MonoBehavior对象使用。
using System;
using UnityEngine;
[Serializable]
public class HealthController{
[SerializeField]
private int max_health;
private int health;
public HealthController {
this.health = this.max_health; // this doesnt work because its called before serialisation
}
}
因此我希望能够在Unity编辑器中设置最大健康值:这就是为什么max_health
是一个SerializeField。但是现在我还希望变量health
初始设置为最大健康状态,而不为它引入第二个SerializeField。这就是为什么我试图将this.health = this.max_health
行放到构造函数中:但这不起作用,因为构造函数似乎是在序列化之前调用的。
我能想到的唯一解决方案是向HealthController添加一个public void Initialize()
而不是构造器,然后在拥有此控制器的Monobhavior的Start()方法中显式调用此方法。
using System;
using UnityEngine;
[Serializable]
public class HealthController{
[SerializeField]
private int max_health;
private int health;
public void Initialize() {
this.health = this.max_health;
}
}
public class Player : MonoBehaviour
{
public HealthController health;
public void Start() {
health.Initialize();
}
}
但这对我来说似乎太复杂了:有没有更好的解决方案?
2条答案
按热度按时间h7appiyu1#
如果你使用惰性初始化,你不需要担心显式初始化
HealthController
对象。你可以用?
将health
标记为可空,然后通过一个属性路由访问它:dohp0rv52#
您可以将
ISerializationCallbackReceiver
接口添加到您的HealthController
对象中。诚然,当您只需要一把锤子时,这可能是一台推土机。但是,当您实现该接口时Unity提供的功能通常可以帮助您完成一个项目。然后,您可以像这样使用它:
这是用于
ISerializationCallbackReceiver
的Unity docs。