FPSSample分析
在FPSSample项目之前Unity官方出的示例都只是展示某一项技术,没有真正完整的大型项目。要做出真正易用的引擎,引擎开发商要使用自己的引擎做实际的项目,然后根据开发体验改进引擎,这样才会不断提高引擎的易用性,厨师要吃自己做的菜才能成为好厨师。很高兴看到Unity官方能做出FPSSample这样的项目,这代表了Unity态度的转变,事情在往好的方向发展。 FPSSample的Github地址是https://github.com/Unity-Technologies/FPSSample,这是一个包括了服务器和客户端的多人射击游戏,这篇文章主要分析资源管理,网络传输和同步。 总体分析 在阅读代码前需要先了解一下ECS,可以参考这个教程。项目里所用到的ECS知识点较为简单,这里简单介绍一下。ECS是一种以数据为中心的编程范式,它分离了数据和行为,包含三个要素:实体(Entity),组件(Component)和系统(System),其中Entity是用来引用Component的,Component只包含了纯数据,System首先过滤要操作的Component然后定义行为。下面举例说明项目中怎么使用ECS的。 // Component需要是struct,并且实现IComponentData接口 public struct Foo : IComponentData { public int value; } public struct Bar : IComponentData { public int value; } // Entity的创建和组件添加 // Entity e = entityManager.CreateEntity(); // entityManager.AddComponentData(e, new Foo{value = 0}); // entityManager.AddComponentData(e, new Bar{value = 1}); // entityManager.SetComponentData(e, new Bar{value = 100}); // Unity提供了ComponentSystem和用于多线程的JobComponentSystem, // 目前项目没有用到JobComponentSystem public class FoobarSystem : ComponentSystem { ComponentGroup group; // 通过注入的方式指定过滤的Component // public struct GroupType // { // public readonly int Length; // public ComponentDataArray<Foo> Foo; // public ComponentDataArray<Bar> Bar; // } // [Inject] GroupType group; protected override void OnCreateManager(int capacity) { base....