unity3d 初始化可序列化类

piztneat  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个控制器类来控制一个游戏对象的健康。它不是一个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(); 
    }

}

但这对我来说似乎太复杂了:有没有更好的解决方案?

h7appiyu

h7appiyu1#

如果你使用惰性初始化,你不需要担心显式初始化HealthController对象。你可以用?health标记为可空,然后通过一个属性路由访问它:

private int? health;

public int Health {
    get {
        if (!health.HasValue) {
             health = max_health;
        }
        return health.Value;
    }
    private set {
        health = value;
    }
}
dohp0rv5

dohp0rv52#

您可以将ISerializationCallbackReceiver接口添加到您的HealthController对象中。诚然,当您只需要一把锤子时,这可能是一台推土机。但是,当您实现该接口时Unity提供的功能通常可以帮助您完成一个项目。
然后,您可以像这样使用它:

[Serializable]
public class HealthController : ISerializationCallbackReceiver
{
    [SerializeField]
    private int max_health;
    private int health;

    // required to satisfy the interface requirements.
    public void OnBeforeSerialize() { }

    public void OnAfterDeserialize ()
    {
        health = max_health;
        // .. then any further post deserialisation work you might want to do.
    }
}

这是用于ISerializationCallbackReceiver的Unity docs

相关问题