/// <summary> /// 删除链接方块 /// </summary> /// <param name="chunk"></param> /// <param name="localPosition"></param> /// <param name="direction"></param> /// <param name="listLink"></param> public void DestoryLinkBlock(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, List <Vector3Int> listLink) { Vector3Int baseWorldPosition = localPosition + chunk.chunkData.positionForWorld; //获取数据 BlockBean blockData = chunk.GetBlockData(localPosition); //延迟一帧执行 等当前方块已经删除了 chunk.chunkComponent.WaitExecuteEndOfFrame(1, () => { if (blockData != null) { BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta); if (blockDoorData != null) { //如果是子级 则不生成 if (blockDoorData.level > 0) { baseWorldPosition = blockDoorData.linkBasePosition.GetVector3Int(); //删除基础方块 chunk.SetBlockForWorld(baseWorldPosition, BlockTypeEnum.None); } } } //如果不是子级 则说明是基础方块 从这里开始删除方块 for (int i = 0; i < listLink.Count; i++) { Vector3Int linkPosition = listLink[i]; Vector3Int closeWorldPosition = baseWorldPosition + linkPosition; chunk.SetBlockForWorld(closeWorldPosition, BlockTypeEnum.None); } }); }
public override string ItemUseMetaData(Vector3Int worldPosition, BlockTypeEnum blockType, BlockDirectionEnum direction, string curMeta) { BlockMetaDoor blockDoor = new BlockMetaDoor(); blockDoor.level = 0; blockDoor.linkBasePosition = new Vector3IntBean(worldPosition); return(ToMetaData(blockDoor)); }
/// <summary> /// 创建链接的方块 /// </summary> public virtual void CreateLinkBlock(Chunk chunk, Vector3Int localPosition, List <Vector3Int> listLink) { //获取数据 BlockBean blockData = chunk.GetBlockData(localPosition); if (blockData != null) { BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta); if (blockDoorData != null) { //如果是子级 则不生成 if (blockDoorData.level > 0) { return; } } } //判断是否在指定的link坐标上有其他方块,如果有则生成道具 bool hasBlock = false; for (int i = 0; i < listLink.Count; i++) { Vector3Int linkPosition = listLink[i]; Vector3Int closeWorldPosition = localPosition + chunk.chunkData.positionForWorld + linkPosition; chunk.GetBlockForWorld(closeWorldPosition, out Block closeBlock, out BlockDirectionEnum closeDirection, out Chunk closeChunk); if (closeBlock != null && closeBlock.blockType != BlockTypeEnum.None) { hasBlock = true; break; } } if (hasBlock) { //创建道具 chunk.SetBlockForLocal(localPosition, BlockTypeEnum.None); ItemsHandler.Instance.CreateItemCptDrop(this, chunk, localPosition + chunk.chunkData.positionForWorld); } else { //创建link方块 for (int i = 0; i < listLink.Count; i++) { Vector3Int linkPosition = listLink[i]; Vector3Int closeWorldPosition = localPosition + chunk.chunkData.positionForWorld + linkPosition; BlockMetaDoor blockDoor = new BlockMetaDoor(); blockDoor.level = 1; blockDoor.linkBasePosition = new Vector3IntBean(localPosition + chunk.chunkData.positionForWorld); BlockDirectionEnum blockDirection = chunk.chunkData.GetBlockDirection(localPosition.x, localPosition.y, localPosition.z); chunk.SetBlockForWorld(closeWorldPosition, blockType, blockDirection, ToMetaData(blockDoor)); } } }
public override void CreateBlockModel(Chunk chunk, Vector3Int localPosition) { //如果有模型。则创建模型 if (!blockInfo.model_name.IsNull()) { //获取数据 BlockBean blockData = chunk.GetBlockData(localPosition); if (blockData != null) { BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta); if (blockDoorData != null) { if (blockDoorData.level == 1) { return; } } } chunk.listBlockModelUpdate.Enqueue(localPosition); } }
/// <summary> /// 互动 /// </summary> /// <param name="worldPosition"></param> public override void Interactive(GameObject user, Vector3Int worldPosition, BlockDirectionEnum blockDirection) { base.Interactive(user, worldPosition, blockDirection); WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block block, out BlockDirectionEnum direction, out Chunk chunk); //获取数据 BlockBean blockData = chunk.GetBlockData(worldPosition - chunk.chunkData.positionForWorld); BlockMetaDoor blockDoorData = GetLinkBaseBlockData <BlockMetaDoor>(blockData.meta); if (blockDoorData == null) { blockDoorData = new BlockMetaDoor(); blockDoorData.state = 0; blockDoorData.linkBasePosition = new Vector3IntBean(worldPosition); } Vector3Int baseWorldPosition = blockDoorData.GetBasePosition(); GameObject objDoor = BlockHandler.Instance.GetBlockObj(baseWorldPosition); Transform tfDoor = objDoor.transform.Find("Door"); if (blockDoorData.state == 0) { int directionFace = (int)direction % 10; if (user == null) { tfDoor.DOLocalRotate(new Vector3(0, 90, 0), 0.2f); blockDoorData.state = 1; } else { //如果是在X轴上 switch (directionFace) { case 1: if (user.transform.position.x > worldPosition.x) { tfDoor.DOLocalRotate(new Vector3(0, 90, 0), 0.2f); blockDoorData.state = 1; } else { tfDoor.DOLocalRotate(new Vector3(0, -90, 0), 0.2f); blockDoorData.state = 2; } break; case 2: if (user.transform.position.x > worldPosition.x) { tfDoor.DOLocalRotate(new Vector3(0, -90, 0), 0.2f); blockDoorData.state = 2; } else { tfDoor.DOLocalRotate(new Vector3(0, 90, 0), 0.2f); blockDoorData.state = 1; } break; case 3: if (user.transform.position.z > worldPosition.z) { tfDoor.DOLocalRotate(new Vector3(0, -90, 0), 0.2f); blockDoorData.state = 2; } else { tfDoor.DOLocalRotate(new Vector3(0, 90, 0), 0.2f); blockDoorData.state = 1; } break; case 4: if (user.transform.position.z > worldPosition.z) { tfDoor.DOLocalRotate(new Vector3(0, 90, 0), 0.2f); blockDoorData.state = 1; } else { tfDoor.DOLocalRotate(new Vector3(0, -90, 0), 0.2f); blockDoorData.state = 2; } break; } } } else if (blockDoorData.state == 1 || blockDoorData.state == 2) { //如果是开门状态 则关门 tfDoor.DOLocalRotate(new Vector3(0, 0, 0), 0.2f); blockDoorData.state = 0; } SaveLinkBaseBlockData(baseWorldPosition, blockDoorData); }