/// <summary> /// 点击-开始合成 /// </summary> public void OnClickForStartSynthesis() { //当前选中的合成道具 ItemsSynthesisBean itemsSynthesis = listSynthesisData[indexSelect]; //检测当前道具是否能合成 bool canSynthesis = itemsSynthesis.CheckSynthesis(); if (!canSynthesis) { //素材不足 无法合成 UIHandler.Instance.ToastHint <ToastView>(TextHandler.Instance.GetTextById(30002)); return; } //首先消耗素材 BaseUIComponent currentUI = UIHandler.Instance.GetOpenUI(); //获取素材 List <ItemsSynthesisMaterialsBean> listMaterials = itemsSynthesis.GetSynthesisMaterials(); UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); //扣除素材 for (int i = 0; i < listMaterials.Count; i++) { ItemsSynthesisMaterialsBean itemMaterials = listMaterials[i]; for (int f = 0; f < itemMaterials.itemIds.Length; f++) { //只要扣除其中一项素材就行 long itemMaterialId = itemMaterials.itemIds[f]; if (userData.HasEnoughItem(itemMaterialId, itemMaterials.itemNumber)) { userData.RemoveItem(itemMaterialId, itemMaterials.itemNumber); break; } else { continue; } } } //添加道具 itemsSynthesis.GetSynthesisResult(out long itemsId, out int itemNum); int moreNum = userData.AddItems(itemsId, itemNum, null); //如果还有多余的道具 则丢出来 if (moreNum > 0) { Player player = GameHandler.Instance.manager.player; ItemsHandler.Instance.CreateItemCptDrop(itemsId, moreNum, null, player.transform.position + Vector3.up, ItemDropStateEnum.DropNoPick); } UIViewBackpackList backpackUI = currentUI.GetComponentInChildren <UIViewBackpackList>(); backpackUI.RefreshUI(); UIViewShortcuts shortcutsUI = currentUI.GetComponentInChildren <UIViewShortcuts>(); shortcutsUI.RefreshUI(); RefreshUI(); }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); Vector3Int localPosition = targetPosition - chunkForHit.chunk.chunkData.positionForWorld; //获取原位置方块 Block tagetBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(localPosition); //如果不能种地 if (tagetBlock.blockInfo.plant_state == 0) { return; } //种植位置 Vector3Int upLocalPosition = localPosition + Vector3Int.up; //获取上方方块 Block upBlock = chunkForHit.chunk.chunkData.GetBlockForLocal(upLocalPosition); //如果上方有方块 则无法种植 if (upBlock != null && upBlock.blockType != BlockTypeEnum.None) { return; } //种植的方块 ItemsInfoBean itemsInfo = GetItemsInfo(itemData.itemId); BlockTypeEnum plantBlockType = (BlockTypeEnum)itemsInfo.type_id; //初始化meta数据 BlockMetaCrop blockCropData = new BlockMetaCrop(); blockCropData.isStartGrow = false; blockCropData.growPro = 0; string metaData = BlockBaseCrop.ToMetaData(blockCropData); //替换为种植 chunkForHit.chunk.SetBlockForLocal(upLocalPosition, plantBlockType, BlockDirectionEnum.UpForward, metaData); //扣除道具 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); userData.AddItems(itemData, -1); //刷新UI UIHandler.Instance.RefreshUI(); } } }
/// <summary> /// 丢弃处理 /// </summary> /// <param name="callback"></param> public void HandleForDrop(CallbackContext callback) { //获取道具栏上的物品 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); ItemsBean itemData = userData.GetItemsFromShortcut(); //丢出道具 Player player = GameHandler.Instance.manager.player; Vector3 randomFroce = new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(0f, 0.5f), UnityEngine.Random.Range(-0.5f, 0.5f)); ItemsHandler.Instance.CreateItemCptDrop(itemData.itemId, 1, itemData.meta, player.transform.position + Vector3.up, ItemDropStateEnum.DropNoPick, player.transform.forward + randomFroce); //扣除道具 userData.AddItems(itemData, -1); //刷新UI UIHandler.Instance.RefreshUI(); }
/// <summary> /// 捡起道具 /// </summary> /// <param name="targetTF"></param> /// <param name="pickSpeed">捡道具速度</param> public void PickItem(Transform targetTF, float pickSpeed) { //修改状态 SetItemDropState(ItemDropStateEnum.Picking); //关闭碰撞 EnablePhysic(false); Vector3 startPosition = transform.position; Vector3 endPosition = targetTF.position + Vector3.up; float dis = Vector3.Distance(endPosition, startPosition); float timePick = dis / pickSpeed; float movePro = 0; //飞向玩家 Tween tween = DOTween .To(() => movePro, (data) => movePro = data, 1f, timePick) .SetEase(Ease.InQuart) .OnUpdate(() => { endPosition = targetTF.position + Vector3.up; transform.position = Vector3.Lerp(startPosition, endPosition, movePro); }) .OnComplete(() => { UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); int number = userData.AddItems(itemData.itemId, itemData.number, itemData.meta); if (number == 0) { //如果都加完了 则删除 Destroy(gameObject); } else { //如果还有剩余 itemData.number = number; SetItemDropState(ItemDropStateEnum.DropNoPick); EnablePhysic(true); //随机散开 System.Random random = new System.Random(); rbItem.AddForce(random.Next(-100, 100), random.Next(-100, 100), random.Next(-100, 100)); } UIHandler.Instance.RefreshAllUI(); }); }
protected override void UseForPlayer(Player player, ItemsBean itemData, ItemUseTypeEnum useType) { //检测玩家前方是否有方块 if (player.playerRay.RayToChunkBlock(out RaycastHit hit, out Vector3Int targetBlockPosition)) { ChunkComponent chunkForHit = hit.collider.GetComponentInParent <ChunkComponent>(); if (chunkForHit != null) { //获取位置和方向 player.playerRay.GetHitPositionAndDirection(hit, out Vector3Int targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction); //如果上手没有物品 或者是左键点击 则挖掘 if (itemData == null || itemData.itemId == 0 || useType == ItemUseTypeEnum.Left) { TargetBreak(itemData, targetPosition); } //如果手上有物品 则使用 else { //获取目标方块 WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(targetPosition, out Block targetBlock, out BlockDirectionEnum targetBlockDirection, out Chunk taragetChunk); //首先获取靠近方块 WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(closePosition, out Block closeBlock, out BlockDirectionEnum closeBlockDirection, out Chunk closeChunk); //如果靠近得方块有区块 if (closeChunk != null) { //如果不是空方块 则不放置(液体则覆盖放置) if (closeBlock != null && closeBlock.blockType != BlockTypeEnum.None && closeBlock.blockInfo.GetBlockShape() != BlockShapeEnum.Liquid) { return; } //如果重量为1 说明是草之类太轻的物体 则也不能放置 if (closeBlock != null && closeBlock.blockInfo.weight == 1) { return; } //获取物品信息 ItemsInfoBean itemsInfo = ItemsHandler.Instance.manager.GetItemsInfoById(itemData.itemId); //获取方块信息 Block useBlock = BlockHandler.Instance.manager.GetRegisterBlock(itemsInfo.type_id); BlockInfoBean blockInfo = useBlock.blockInfo; BlockTypeEnum changeBlockType = blockInfo.GetBlockType(); //获取meta数据 string metaData = useBlock.ItemUseMetaData(closePosition, changeBlockType, direction, itemData.meta); //使用方块 useBlock.ItemUse( targetPosition, targetBlockDirection, targetBlock, taragetChunk, closePosition, closeBlockDirection, closeBlock, closeChunk, direction, metaData); //扣除道具 UserDataBean userData = GameDataHandler.Instance.manager.GetUserData(); userData.AddItems(itemData, -1); //刷新UI UIHandler.Instance.RefreshUI(); } } } } }