C# 单一模式Unity创建多个副本
我试图使用单例模式来监控Unity项目的统计数据。我正在使用下面的课程。我的问题是,我的代码似乎不是只有一个单例,而是为调用单例函数的每个实例创建一个单例。例如,我调用ShootingStats.Instance.incrementTotalShotsFired;每次球员开枪时。如果我总共有三个玩家,我的代码似乎会生成三个射击状态,每个玩家一个。我想要实现的是只有一个类来监控所有玩家的统计数据,而不是每个玩家一个。 我找到了单例代码:。我是Unity的新手,但编程经验丰富。我最初尝试使用一个非常简单的单例模式版本,就像有人在C中使用的那个样,但并没有达到预期的效果。相反,每次我访问一个单例方法时,它都在创建一个新对象。非常感谢你的帮助 独生子女班 射击状态类 MethodExtensionFormonObehaviorTransform类-不确定这是什么C# 单一模式Unity创建多个副本,c#,design-patterns,unity3d,singleton,unity5,C#,Design Patterns,Unity3d,Singleton,Unity5,我试图使用单例模式来监控Unity项目的统计数据。我正在使用下面的课程。我的问题是,我的代码似乎不是只有一个单例,而是为调用单例函数的每个实例创建一个单例。例如,我调用ShootingStats.Instance.incrementTotalShotsFired;每次球员开枪时。如果我总共有三个玩家,我的代码似乎会生成三个射击状态,每个玩家一个。我想要实现的是只有一个类来监控所有玩家的统计数据,而不是每个玩家一个。 我找到了单例代码:。我是Unity的新手,但编程经验丰富。我最初尝试使用一个非常
你可以用一种更简单的方式实现游戏对象的单例模式行为:
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);
}
}