原型模式是创建型模式的一种,是在一个原型的基础上,建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销,我们可以使用原型模式来建立一个非常类似于复印机的系统。通过实现原型模式,我们将能够即时复制典型对象,同时将对我们应用程序的整体性能的影响降到最低。
在游戏开发中,原型模式尤其适合需要动态、高效生成可变对象的场景,配合Unity的预制体系统能大幅提升开发效率。
优点:
1.减少初始化开销:从理论上讲,复制一个已经存在于内存中的对象比初始化一个新的对象要快。
2.实例在内存中的可复用性:在原型对象从一种状态转移到另一种状态时,可以复制其排列组合。
3.一致性:让对象复制自己具有结构上的好处;它更安全,并为复制过程提供了一个标准接口。
缺点:
1.维护引用:如果总是在复制对象之前销毁原型对象,那么我们将最终使使用该模式的任何好处化为乌有。
2.不支持的循环引用:在某些情况下,对象具有不支持克隆的内部结构。在这些情况下,在实现原型模式的系统中可能难以使用对象。
说明例子:
1.UML类图:
2.实现:
1.实现ICopyable的接口:
public interface ICopyable
{ICopyable Copy();
}
2.实现Enemy类:
public class Enemy : MonoBehaviour, ICopyable
{public ICopyable Copy(){return Instantiate(this);}
}
3.实现EnemySpawner类:
public class EnemySpawner
{public ICopyable mCopy;public Enemy SpawnEnemy(Enemy prototype){mCopy = prototype.Copy();return (Enemy)mCopy;}
}
4.实现具体的Enemy类,SoliderA,SoliderB
public class SoliderA : Enemy
{public void Awake(){Debug.Log("创建了A");}
}public class SoliderB : Enemy
{public void Awake(){Debug.Log("创建了B");}
}
5.测试:
public class PrototypePattern : MonoBehaviour
{public SoliderA soliderAPrototype;public SoliderB soliderBPrototype;private EnemySpawner mEnemySpawner;void Start(){mEnemySpawner = new EnemySpawner();mEnemySpawner.SpawnEnemy(soliderAPrototype);mEnemySpawner.SpawnEnemy(soliderBPrototype);}
}
游戏中的使用场景:
1.敌人/NPC生成
2.武器/道具系统
3.技能特效复用
4.关卡元素动态生成
5.玩家角色生成
6.AI行为树配置
参考书籍以及相关链接:
《Hands-On Game Development Patterns with Unity 2019》
原型模式 - 维基百科,自由的百科全书 (wikipedia.org)
Prototype Design Pattern (C#) (youtube.com)
hw_dungeonwaterfall1c_h_en_120 (youtube.com)