C# 单一模式Unity创建多个副本

C# 单一模式Unity创建多个副本,c#,design-patterns,unity3d,singleton,unity5,C#,Design Patterns,Unity3d,Singleton,Unity5,我试图使用单例模式来监控Unity项目的统计数据。我正在使用下面的课程。我的问题是,我的代码似乎不是只有一个单例,而是为调用单例函数的每个实例创建一个单例。例如,我调用ShootingStats.Instance.incrementTotalShotsFired;每次球员开枪时。如果我总共有三个玩家,我的代码似乎会生成三个射击状态,每个玩家一个。我想要实现的是只有一个类来监控所有玩家的统计数据,而不是每个玩家一个。 我找到了单例代码:。我是Unity的新手,但编程经验丰富。我最初尝试使用一个非常

我试图使用单例模式来监控Unity项目的统计数据。我正在使用下面的课程。我的问题是,我的代码似乎不是只有一个单例,而是为调用单例函数的每个实例创建一个单例。例如,我调用ShootingStats.Instance.incrementTotalShotsFired;每次球员开枪时。如果我总共有三个玩家,我的代码似乎会生成三个射击状态,每个玩家一个。我想要实现的是只有一个类来监控所有玩家的统计数据,而不是每个玩家一个。 我找到了单例代码:。我是Unity的新手,但编程经验丰富。我最初尝试使用一个非常简单的单例模式版本,就像有人在C中使用的那个样,但并没有达到预期的效果。相反,每次我访问一个单例方法时,它都在创建一个新对象。非常感谢你的帮助

独生子女班

射击状态类

MethodExtensionFormonObehaviorTransform类-不确定这是什么


你可以用一种更简单的方式实现游戏对象的单例模式行为:

private static GameControllerBehaviour instance;

void Awake(){

    //SINGLETON PATTERN

    if (GameControllerBehaviour.instance == null){
        DontDestroyOnLoad (this);
        GameControllerBehaviour.instance = this;

    } else {
        Destroy (this.gameObject);
    }
}

很抱歉,你的评论毫无帮助。什么应该是静态的,为什么?我调用的获取实例的方法是静态的。再多解释一下就好了。很简单。你好,谢谢你的回复。这对我的代码不起作用。从不调用Awake函数。此外,我需要类似的单身人士,以持续整个项目的生命周期。我该怎么做?
using UnityEngine;
using System.Collections;
using Project.Statistics;

namespace Project.Statistics
{
    public class ShootingStats : Singleton<ShootingStats>
    {

        private int _onTarget = 0;
        private int _totalShotsFired = 0;

        protected ShootingStats() { }

        public void incrementOnTarget()
        {
            _onTarget++;
        }

        public void incrementTotalShotsFired()
        {
            _totalShotsFired++;
        }

        public void printStats()
        {
            string lines = "Total shots fired: " + _totalShotsFired + "\n" + "Shots on target: " + _onTarget + "\n.";
            Debug.Log(lines);
        }
    }
}
using UnityEngine;

static public class MethodExtensionForMonoBehaviourTransform
{
    /// <summary>
    /// Gets or add a component. Usage example:
    /// BoxCollider boxCollider = transform.GetOrAddComponent<BoxCollider>();
    /// </summary>
    static public T GetOrAddComponent<T>(this Component child) where T : Component
    {
        T result = child.GetComponent<T>();
        if (result == null)
        {
            result = child.gameObject.AddComponent<T>();
        }
        return result;
    }
}
private static GameControllerBehaviour instance;

void Awake(){

    //SINGLETON PATTERN

    if (GameControllerBehaviour.instance == null){
        DontDestroyOnLoad (this);
        GameControllerBehaviour.instance = this;

    } else {
        Destroy (this.gameObject);
    }
}