示例#1
0
    /// <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);
            }
        });
    }
示例#2
0
    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));
    }
示例#3
0
    /// <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));
            }
        }
    }
示例#4
0
 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);
     }
 }
示例#5
0
    /// <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);
    }