我正在制作游戏,我有一个每个玩家选择的可用角色列表,每个角色包含一个(3D)模型和一个 Texture2D 图标已通过内容管道加载。
问题是,我希望多个玩家选择相同的角色,但player1Char = charDatabase[choosenChar];
是引用,所以任何重复选择都会引用相同的模型。
这是我想要复制的Character类的构造函数,CModel类只是一个具有该模型的位置,旋转和缩放值的模型。
public Character(CModel model, string name, int HP, Vector2 iconPositionOnSheet)
我认为我想要做的是制作该类的深层副本,但Model类不可序列化。我能想到的唯一另一种方法是使用Content.Load从其文件中加载相同的模型(如果选择了重复),但我想知道是否有一种方法可以简单地复制字符类,因此模型,因为这对我来说会更容易。
答案 0 :(得分:0)
不是将Model对象传递给构造函数,而是传递ContentManager对象(内容)和模型的文件名字符串。然后在构造函数的主体中,调用Content.Load<Model>(filename)
。然后,如果你想给它一个替代颜色或纹理,克隆basicEffect并用你希望该角色拥有的纹理/颜色重置它并设置。
现在,一个新的Model对象将被分配到其他类似模型的堆上(实例化),这样两个玩家都可以拥有一个唯一的对象。
内容管理器所做的一件聪明的事情就是重用GPU资源(如果已加载它们)。因此,如果您第二次加载模型,虽然它为您的c#提供了堆上的唯一引用,但两个Model对象将使用相同的顶点缓冲区和效果,因此它们不必实例化两次。