public override void GenGlobalEntity(ref List <DataTag> globalEntityList) { var playerData = new DataTag( new Dictionary <string, object> { { "name", "Player" }, { "type", "island.entity:player" }, { "position", new Vector3(16, 100, 16) } }); var cameraData = new DataTag( new Dictionary <string, object> { { "name", "Camera" }, { "type", "island.entity:game_camera" } }); globalEntityList.Add(playerData); globalEntityList.Add(cameraData); }
/// <summary> /// 加载实体 /// </summary> /// <param name="entitys"></param> public void LoadEntity(ChunkPos chunkPos, ref List <DataTag> entityDataList) { var entityDataName = chunkPos.IsGlobal() ? "global" : chunkPos.x + "." + chunkPos.z; var loadPath = _dir + "e." + entityDataName + ".dat"; if (!chunkPos.IsAvailable()) { return; } // 如果未创建实体信息则生成 if (!File.Exists(loadPath)) { var worldSize = GameManager.WorldManager.worldInfo.worldSize; if (!chunkPos.IsGlobal()) { if ( !(chunkPos.x < 0 || chunkPos.x > worldSize.x || chunkPos.z < 0 || chunkPos.z > worldSize.z)) { GameManager.WorldManager.worldGenerator.GenChunkEntity(chunkPos, ref entityDataList); } } else { GameManager.WorldManager.worldGenerator.GenGlobalEntity(ref entityDataList); } return; } var entityStream = File.OpenRead(loadPath); var decompressFileStream = new GZipStream(entityStream, CompressionMode.Decompress); var reader = new BinaryReader(decompressFileStream); // 加载实体 var entityCount = reader.ReadInt32(); for (var i = 0; i < entityCount; ++i) { var entityData = DataTag.Empty(); entityData.Load(reader); entityDataList.Add(entityData); } reader.Close(); decompressFileStream.Close(); entityStream.Close(); }
/// <summary> /// 实例化实体 /// </summary> /// <param name="container"></param> /// <param name="type"></param> /// <param name="entityName"></param> /// <returns></returns> public static Entity Create(EntityContainer container, DataTag dataTag) { var entityObj = new GameObject(dataTag.Get <string>("name")); var entity = entityObj.AddComponent <Entity>(); container.Add(entity); entity.Owner = container; entity.SetEntityData(dataTag); if (entity.IsSelectable) { entityObj.layer = SelectableLayer; } else { entityObj.layer = Layer; } return(entity); }
/// <summary> /// 设置实体数据 /// </summary> /// <param name="entityData"></param> public void SetEntityData(DataTag entityData) { // 设置代理 var entityProxyName = entityData.Get <string>("type"); // 创建行为 _entityProxy = GameManager.ProxyManager.Get <IEntity>(entityProxyName); foreach (var entityBehaviour in _entityProxy.EntityBehaviours) { if (gameObject.GetComponent(entityBehaviour) == null) { gameObject.AddComponent(entityBehaviour); } } gameObject.SendMessage("OnEntityCreated"); // 同步标签 _entityDataTag = entityData; // 加载 LoadFromEntityData(); }
public Entity Create(DataTag dataTag) { return(Entity.Create(this, dataTag)); }
public override void GenChunkEntity(ChunkPos chunkPos, ref List <DataTag> entityData) { var count = _random.Next() % 50 + 1; for (var i = 0; i < count; ++i) { var x = _random.Next() % 16; var z = _random.Next() % 16; var height = GetHeight( chunkPos.x * worldInfo.chunkSize.x + x, chunkPos.z * worldInfo.chunkSize.z + z, worldInfo.chunkSize.y / 3 * 2); var pos = new Vector3( chunkPos.x * worldInfo.chunkSize.x + (x + 0.5f) * worldInfo.blockSize.x, height * worldInfo.blockSize.y, chunkPos.z * worldInfo.chunkSize.z + (z + 0.5f) * worldInfo.blockSize.z); var type = _random.Next(0, 3); if (type == 0) { var envElement = new DataTag( new Dictionary <string, object> { { "name", "EnvElement" }, { "type", "island.entity:env_element" }, { "position", pos }, { "envElement", "island.env_element:withered_grass" } } ); entityData.Add(envElement); } else if (type == 1) { var envElement = new DataTag( new Dictionary <string, object> { { "name", "EnvElement" }, { "type", "island.entity:env_element" }, { "position", pos }, { "envElement", "island.env_element:grass" } } ); entityData.Add(envElement); } else if (type == 2) { var dropStone = new DataTag( new Dictionary <string, object> { { "name", "DropStone" }, { "type", "island.entity:drop_item" }, { "position", pos + Vector3.up * 0.5f }, { "item", "island.item:stone" }, { "itemCount", 1 } } ); entityData.Add(dropStone); } } if (chunkPos.x == 1 && chunkPos.z == 1) { var height2 = GetHeight( chunkPos.x * worldInfo.chunkSize.x, chunkPos.z * worldInfo.chunkSize.z, worldInfo.chunkSize.y / 3 * 2); var pos2 = new Vector3( chunkPos.x * worldInfo.chunkSize.x + 0.5f * worldInfo.blockSize.x, height2 * worldInfo.blockSize.y, chunkPos.z * worldInfo.chunkSize.z + 0.5f * worldInfo.blockSize.z); var chest = new DataTag( new Dictionary <string, object> { { "name", "Chest" }, { "type", "island.entity:chest" }, { "position", pos2 - Vector3.left } } ); entityData.Add(chest); var craftTable = new DataTag( new Dictionary <string, object> { { "name", "CraftTable" }, { "position", pos2 + Vector3.left }, { "type", "island.entity:craft_table" } } ); entityData.Add(craftTable); } }
/// <summary> /// 创建实体 /// </summary> /// <param name="dataTag"></param> public void CreateEntity(DataTag dataTag) { Entity.Create(_entityContainer, dataTag); }