首页 > 解决方案 > 如何创建使用工厂模式实例化对象的正确脚本

问题描述

我正在创造游戏。有玩家应该收集的硬币。现在我正在尝试输入 factory-pattern 并且我有 2 个问题。

在工厂中,我需要实例化硬币的预制件,同时工厂必须可以从其他类中获得。它不可能通过它的实例来获取工厂,所以它必须是静态的。但在这种情况下,工厂无法保持与预制件的链接。我已经考虑过实现单例,但这样我应该把这个脚本放在现场,它看起来像是某种“肮脏的方式”。

硬币.cs

public class Coin : MonoBehaviour
{
    CellCoordinates coords;
    public CellCoordinates Coords
    {
        get { return coords; }
        set
        {
            coords = value;
            transform.localPosition = coords.ToWorld();
        }
    }
    static public event System.Action OnCollect;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Player")
        {
            Destroy(gameObject, 0.2f);
            OnCollect?.Invoke();
        }
    }
}

CoinFactory.cs

public class CoinFactory : MonoBehaviour
{
    [SerializeField]Coin coinPrefab;
    public Coin Create(Maze.CellCoordinates coords)
    {
        Coin coin = Instantiate(coinPrefab) as Coin;
        coin.Coords = coords;
        return coin;
    }
}

标签: c#unity3dfactory-pattern

解决方案


我会做什么:

public class CoinFactory : MonoBehaviour
{
    private static CoinFactory instance;

    [SerializeField] private Coin coinPrefab;

    private void Awake()
    {
        instance = this;
    }

    public static Coin Create(Maze.CellCoordinates coords)
    {
        var coin = Instantiate(instance.coinPrefab);
        coin.Coords = coords;
        return coin;
    }
}

推荐阅读