21 changed files with 592 additions and 670 deletions
@ -1,8 +0,0 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 178e0d528cfe03d4f81caddb6d109dbb |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -1,612 +0,0 @@ |
|||
using System.Collections; |
|||
using System.Collections.Generic; |
|||
using UnityEngine; |
|||
using UnityEngine.UI; |
|||
using UnityEngine.EventSystems; |
|||
using UnityEngine.InputSystem; |
|||
using System; |
|||
using Unity.VisualScripting; |
|||
using System.Data; |
|||
|
|||
public class TempPlaceEffect: MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler |
|||
{ |
|||
|
|||
[Header("拖拽参数")] |
|||
public Transform originalParent; |
|||
public Vector3 originalpoint; |
|||
|
|||
//更换父级前的排序位置
|
|||
public int originalIndexInChild; |
|||
|
|||
public EventSystem eventSystem; |
|||
public bool canUse = true;//决定卡牌是否可以释放
|
|||
bool choosed;//标识卡牌是否被选中
|
|||
|
|||
[Header("贝塞尔曲线瞄准")] |
|||
public GameObject ainPanle; |
|||
|
|||
[Header("影响格参数")] |
|||
public MapUnity currentNode;//瞄准的格子
|
|||
|
|||
[Header("卡牌拖拽状态")] |
|||
public CardDragState dragState = CardDragState.noDrag; |
|||
public enum CardDragState |
|||
{ |
|||
onBeginDrag, |
|||
onDrag, |
|||
onEndDrag, |
|||
noDrag |
|||
} |
|||
PointerEventData eventData; |
|||
List<RaycastResult> result = new List<RaycastResult>(); |
|||
|
|||
public bool ready;//是否已到达可释放位置
|
|||
|
|||
[Header("卡牌属性")] |
|||
public List<MapUnity> castingPool;//卡牌打出范围
|
|||
|
|||
private CardEntity cardEntity; |
|||
|
|||
[Header("射线图层剔除")] |
|||
public LayerMask layerMask; |
|||
|
|||
[Header("鼠标检测脚本")] |
|||
public CardOnMouseEnter cardOnMouseEnter; |
|||
|
|||
void Start() |
|||
{ |
|||
originalParent = gameObject.transform.parent; |
|||
dragState = CardDragState.noDrag; |
|||
eventSystem = GameObject.FindObjectOfType<EventSystem>(); |
|||
eventData = new PointerEventData(eventSystem); |
|||
|
|||
cardOnMouseEnter = GetComponent<CardOnMouseEnter>(); |
|||
|
|||
eventSystem = GameObject.FindObjectOfType<EventSystem>(); |
|||
cardEntity = GetComponent<CardEntity>(); |
|||
|
|||
cardEntity.createCard("2001", 0, true); |
|||
} |
|||
|
|||
|
|||
private void Update() |
|||
{ |
|||
handleRightClickCancel(); |
|||
|
|||
|
|||
if (dragState != CardDragState.noDrag && dragState != CardDragState.onDrag) |
|||
{ |
|||
//UI射线检测
|
|||
eventData.position = Mouse.current.position.value; |
|||
|
|||
eventSystem.RaycastAll(eventData, result); |
|||
if (result.Count > 0) |
|||
{ |
|||
Debug.Log(result[0].gameObject.name); |
|||
} |
|||
} |
|||
|
|||
if (GameManager.Instance.onDraw == false && TurnMaster.Instance.servantAction != TurnMaster.ServantAction.useSkill) |
|||
{ |
|||
switch (dragState) |
|||
{ |
|||
case CardDragState.onBeginDrag: |
|||
GameManager.Instance.onDrag = true; |
|||
SettlementManager.Instance.expectSettle(cardEntity.cardOriginalData);//预计伤害计算
|
|||
if (choosed == false) |
|||
{ |
|||
TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.useCard; |
|||
CardChoose(eventData); |
|||
dragState = CardDragState.onDrag; |
|||
} |
|||
break; |
|||
case CardDragState.onDrag: |
|||
CardFollow(); |
|||
if (Mouse.current.leftButton.wasReleasedThisFrame && ready) |
|||
{ |
|||
dragState = CardDragState.onEndDrag; |
|||
} |
|||
break; |
|||
case CardDragState.onEndDrag: |
|||
TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.none; |
|||
CardUse(); |
|||
break; |
|||
case CardDragState.noDrag: |
|||
if (Mouse.current.leftButton.wasReleasedThisFrame && GameManager.Instance.onDrag == false && TurnMaster.Instance.playerAction == TurnMaster.PlayerAction.none) |
|||
{ |
|||
eventData.position = Mouse.current.position.value; |
|||
|
|||
eventSystem.RaycastAll(eventData, result); |
|||
if (result.Count > 0) |
|||
{ |
|||
// Debug.Log(result[0].gameObject.name);
|
|||
if (result[0].gameObject == this.gameObject) |
|||
{ |
|||
dragState = CardDragState.onBeginDrag; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
break; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
//卡片动作
|
|||
//开始选中
|
|||
public void CardChoose(PointerEventData eventData) |
|||
{ |
|||
banActionCardCheck(); |
|||
disArmCheck(); |
|||
costCheck(); |
|||
disCardCheck(); |
|||
if (!cardEntity.canUse) |
|||
{ |
|||
resetComponentPosition(); |
|||
return; |
|||
} |
|||
choosed = true; |
|||
//选中音效
|
|||
AudioManager.Instance.ChooseCardVoicePlayer(true); |
|||
|
|||
GetComponent<CanvasGroup>().blocksRaycasts = false; |
|||
originalpoint = this.transform.localPosition; |
|||
|
|||
transform.SetParent(transform.parent.parent); |
|||
transform.localPosition = cardOnMouseEnter.originPoint; |
|||
|
|||
GetComponent<RectTransform>().localScale = cardOnMouseEnter.targetScale; |
|||
|
|||
//根据卡牌数据决定是否调用曲线
|
|||
if (cardEntity.cardOriginalData.CastingRange != 0) |
|||
{ |
|||
//释放范围为0则不需要调用曲线
|
|||
ainPanle.SetActive(true); |
|||
} |
|||
else |
|||
{ |
|||
ainPanle.SetActive(false); |
|||
} |
|||
} |
|||
|
|||
//拖拽中
|
|||
public void CardFollow() |
|||
{ |
|||
if (!cardEntity.canUse) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
dyeing(); |
|||
|
|||
eventData.position = Mouse.current.position.value; |
|||
|
|||
eventSystem.RaycastAll(eventData, result); |
|||
// Debug.Log(result[0].gameObject.name);
|
|||
if (result.Count > 0) |
|||
{ |
|||
if (result[0].gameObject.name == "TotalPanel") |
|||
{ |
|||
if (ready == false) |
|||
{ |
|||
ready = true; |
|||
} |
|||
transform.localPosition = cardOnMouseEnter.originPoint;// + new Vector3(0, 30, 0);
|
|||
// transform.localScale = new Vector3(1, 1, 1);
|
|||
if (cardEntity.cardOriginalData.CastingRange != 0) |
|||
{ |
|||
ainPanleWork(eventData); |
|||
} |
|||
else |
|||
{ |
|||
noAinPanleWork(eventData); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (ready == true) |
|||
{ |
|||
resetComponentPosition(); |
|||
} |
|||
else |
|||
{ |
|||
// Debug.Log(transform.position);
|
|||
// Debug.Log(eventData.position);
|
|||
// transform.position = eventData.position;
|
|||
Vector3 eventDataWorld = CardActiveSort.Instance.ScreenPointToWorldPoint(eventData.position, 4f); |
|||
transform.position = eventDataWorld; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
//卡牌释放
|
|||
public void CardUse() |
|||
{ |
|||
EnemyManager.Instance.HideExpHP_Observer(); |
|||
GameManager.Instance.onDrag = false; |
|||
//目标释放选择
|
|||
/*if (!cardTargetCheck()) |
|||
{ |
|||
canUse = false; |
|||
Debug.Log("目标不符合"); |
|||
//resetComponentPosition();
|
|||
}*/ |
|||
|
|||
if (canUse) |
|||
{ |
|||
CardActiveSort.Instance.ReflashCardPoint(); |
|||
StartCoroutine(OnDragIEnumerator(eventData)); |
|||
} |
|||
else |
|||
{ |
|||
canUse = true; |
|||
resetComponentPosition(); |
|||
} |
|||
|
|||
dragState = CardDragState.onDrag; |
|||
} |
|||
|
|||
//检查卡牌的费用是否可以释放
|
|||
private void costCheck() |
|||
{ |
|||
Debug.Log("当前费用:" + TurnMaster.Instance.currentCost); |
|||
Debug.Log("总费用:" + Usermanager.Instance.totalCost); |
|||
int trueCost = cardEntity.cardOriginalData.Cost; |
|||
if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Black)) |
|||
{ |
|||
trueCost++; |
|||
} |
|||
if (GameManager.Instance.playerState.currentCost - trueCost < 0) |
|||
{ |
|||
Debug.Log("费用不足"); |
|||
TipManager.Instance.SendTip("费用不足"); |
|||
cardEntity.canUse = false; |
|||
} |
|||
|
|||
} |
|||
|
|||
private void stepCostCheck(bool canAdv) |
|||
{ |
|||
/*if (canAdv) |
|||
{ |
|||
if (cardEntity.cardOriginalData.AdvantageFunctionVal.ContainsKey(CardFunction.costStep)) |
|||
{ |
|||
if (GameManager.Instance.playerState.currentStepRange< int.Parse(cardEntity.cardOriginalData.AdvantageFunctionVal[CardFunction.costStep])) |
|||
{ |
|||
Debug.Log("步数不足"); |
|||
cardEntity.canUse = false; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (cardEntity.cardOriginalData.FunctionVal.ContainsKey(CardFunction.costStep)) |
|||
{ |
|||
if (GameManager.Instance.playerState.currentStepRange < int.Parse(cardEntity.cardOriginalData.FunctionVal[CardFunction.costStep])) |
|||
{ |
|||
Debug.Log("步数不足"); |
|||
cardEntity.canUse = false; |
|||
} |
|||
} |
|||
}*/ |
|||
} |
|||
|
|||
private void disArmCheck() |
|||
{ |
|||
/*if (Usermanager.playerAbnormalCondition.ContainsKey(AbnormalCondition.disarm)&&cardEntity.cardOriginalData.CarType.Equals(CardType.attack)) |
|||
{ |
|||
Debug.Log("被缴械了"); |
|||
cardEntity.canUse = false; |
|||
}*/ |
|||
} |
|||
|
|||
private void disCardCheck() |
|||
{ |
|||
Dictionary<string, string> trueFunctionVal = new Dictionary<string, string>(); |
|||
//trueFunctionVal.AddRange(cardEntity.cardOriginalData.FunctionVal);
|
|||
int drawCardNum = 0; |
|||
foreach (KeyValuePair<string, string> kvp in trueFunctionVal) |
|||
{ |
|||
switch (kvp.Key) |
|||
{ |
|||
case CardFunction.drawCard: |
|||
if (Usermanager.playerAbnormalCondition.ContainsKey(AbnormalCondition.banDrawCard)) |
|||
{ |
|||
|
|||
} |
|||
else |
|||
{ |
|||
drawCardNum += int.Parse(kvp.Value); |
|||
} |
|||
break; |
|||
|
|||
} |
|||
} |
|||
foreach (KeyValuePair<string, string> kvp in trueFunctionVal) |
|||
{ |
|||
switch (kvp.Key) |
|||
{ |
|||
case CardFunction.discard: |
|||
if (TurnMaster.Instance.handCard.cardEntityList.Count - int.Parse(kvp.Value) - 1 + drawCardNum < 0) |
|||
{ |
|||
Debug.Log("没有足够的牌可以弃牌"); |
|||
cardEntity.canUse = false; |
|||
} |
|||
break; |
|||
|
|||
} |
|||
} |
|||
} |
|||
private void banActionCardCheck() |
|||
{ |
|||
if (TurnMaster.Instance.playerAction == TurnMaster.PlayerAction.banAction) |
|||
{ |
|||
cardEntity.canUse = false; |
|||
} |
|||
else |
|||
{ |
|||
cardEntity.canUse = true; |
|||
} |
|||
if (TurnMaster.Instance.playerAction == TurnMaster.PlayerAction.move) |
|||
{ |
|||
cardEntity.canUse = false; |
|||
} |
|||
else if (TurnMaster.Instance.playerAction != TurnMaster.PlayerAction.banAction) |
|||
{ |
|||
cardEntity.canUse = true; |
|||
} |
|||
|
|||
} |
|||
private void resetComponentPosition() |
|||
{ |
|||
//取消音效
|
|||
AudioManager.Instance.ChooseCardVoicePlayer(false); |
|||
//遍历范围预览池消除影响色
|
|||
foreach (MapUnity mapUnity in MapUnityManager.Instance.castPool) |
|||
{ |
|||
mapUnity.influenced = false; |
|||
} |
|||
MapUnityManager.Instance.castPool.Clear(); |
|||
//遍历影响池变色
|
|||
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool) |
|||
{ |
|||
mapUnity.influenced = false; |
|||
} |
|||
cardEntity.influencePreviewPool.Clear(); |
|||
|
|||
ready = false; |
|||
GameManager.Instance.onDrag = false; |
|||
dragState = CardDragState.noDrag; |
|||
|
|||
if (TurnMaster.Instance.playerAction == TurnMaster.PlayerAction.useCard) |
|||
TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.none; |
|||
|
|||
choosed = false; |
|||
canUse = true;//取消释放
|
|||
ainPanle.SetActive(false); |
|||
//其他位置都归位
|
|||
transform.SetParent(originalParent); |
|||
//归位孩子顺序
|
|||
transform.SetSiblingIndex(cardOnMouseEnter.oringinIndex); |
|||
|
|||
GetComponent<CanvasGroup>().blocksRaycasts = true; |
|||
transform.localScale = new Vector3(1f, 1f, 1f); |
|||
|
|||
CardActiveSort.Instance.ReflashCardPoint(); |
|||
|
|||
//隐藏怪物虚血
|
|||
EnemyManager.Instance.HideExpHP_Observer(); |
|||
|
|||
return; |
|||
} |
|||
|
|||
//右键取消释放
|
|||
private void handleRightClickCancel() |
|||
{ |
|||
|
|||
if (choosed && Mouse.current.rightButton.wasPressedThisFrame) |
|||
{ |
|||
resetComponentPosition(); |
|||
} |
|||
} |
|||
|
|||
public void OnBeginDrag(PointerEventData eventData) |
|||
{ |
|||
if (GameManager.Instance.onDrag == false && TurnMaster.Instance.playerAction == TurnMaster.PlayerAction.none && TurnMaster.Instance.servantAction != TurnMaster.ServantAction.useSkill) |
|||
dragState = CardDragState.onBeginDrag; |
|||
} |
|||
|
|||
private void ainPanleWork(PointerEventData eventData) |
|||
{ |
|||
//射线检测瞄准的地图节点,判断是否可放置和改变放置影响区
|
|||
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.value); |
|||
Debug.Log(Mouse.current.position.value); |
|||
if (Physics.Raycast(ray, out RaycastHit raycastHit, 500, layerMask.value)) |
|||
{ |
|||
//Debug.Log(raycastHit.collider.gameObject.name);
|
|||
//检测到跟上次瞄准地方不同,更新
|
|||
if (currentNode == null || raycastHit.collider.transform.gameObject != currentNode.gameObject) |
|||
{ |
|||
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool) |
|||
{ |
|||
mapUnity.influenced = false; |
|||
} |
|||
cardEntity.influencePreviewPool.Clear(); |
|||
currentNode = raycastHit.collider.transform.GetComponent<MapUnity>(); |
|||
|
|||
//重新调用范围预览
|
|||
//GameManager.Instance.player.StepPreviewInfluencedNode(cardEntity.cardOriginalData.CastingRange);
|
|||
int castRange = cardEntity.cardOriginalData.CastingRange; |
|||
if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Green)) |
|||
{ |
|||
castRange++; |
|||
} |
|||
setCastingRangePreview(castRange); |
|||
//预览影响范围
|
|||
if (currentNode.influenced) |
|||
{ |
|||
//根据卡牌属性改变影响池
|
|||
Vector3 face = currentNode.transform.position - GameManager.Instance.playerOn.transform.position; |
|||
float euler = Vector3.SignedAngle(-GameManager.Instance.playerOn.transform.forward, face, GameManager.Instance.playerOn.transform.up) + 180; |
|||
Debug.Log("euler是" + euler); |
|||
getNodeTools.setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode, cardEntity); |
|||
//setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode);
|
|||
//influencePreviewPool.Add(currentNode);
|
|||
|
|||
|
|||
} |
|||
|
|||
//更新效果作用范围内怪物虚血
|
|||
EnemyManager.Instance.ShowExpHp_Observer(cardEntity.influencePreviewPool); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
private void setCastingRangePreview(int castRange) |
|||
{ |
|||
foreach (MapUnity mapUnity in MapUnityManager.Instance.castPool) |
|||
{ |
|||
mapUnity.influenced = false; |
|||
} |
|||
MapUnityManager.Instance.castPool.Clear(); |
|||
MapUnityManager.Instance.getCastPool(cardEntity.cardOriginalData.EffectRange, castRange); |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
private void getInfluencePreviePoll(MapUnity currentNode, string effecctRange) |
|||
{ |
|||
switch (effecctRange) |
|||
{ |
|||
case EffectRange.range1: |
|||
break; |
|||
|
|||
} |
|||
} |
|||
|
|||
private void noAinPanleWork(PointerEventData eventData) |
|||
{ |
|||
|
|||
/*Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.value); |
|||
if (eventData.pointerCurrentRaycast.gameObject != null) |
|||
{ |
|||
if (Physics.Raycast(ray, out RaycastHit raycastHit)) |
|||
{ |
|||
currentNode = raycastHit.collider.transform.GetComponent<MapUnity>(); |
|||
cardEntity.influencePreviewPool.Add(currentNode); |
|||
} |
|||
}*/ |
|||
getNodeTools.setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, 30.0f, currentNode, cardEntity); |
|||
} |
|||
|
|||
public void OnDrag(PointerEventData eventData) |
|||
{ |
|||
|
|||
} |
|||
|
|||
private void dyeing() |
|||
{ |
|||
//遍历影响池变色
|
|||
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool) |
|||
{ |
|||
mapUnity.PlayerInfluenced(cardEntity.influencePreviewPool); |
|||
mapUnity.playerMark.meshRenderer.material = mapUnity.castPreRange; |
|||
} |
|||
} |
|||
|
|||
|
|||
public void OnEndDrag(PointerEventData eventData) |
|||
{ |
|||
|
|||
} |
|||
|
|||
private IEnumerator OnDragIEnumerator(PointerEventData eventData) |
|||
{ |
|||
if (!cardEntity.canUse) |
|||
{ |
|||
yield break; |
|||
} |
|||
choosed = false; |
|||
if (canUse) |
|||
{ |
|||
if (eventData.pointerCurrentRaycast.gameObject != null) |
|||
{ |
|||
resetComponentPosition(); |
|||
} |
|||
if (ainPanle.activeSelf) |
|||
{ |
|||
ainPanle.SetActive(false);//关闭贝塞尔曲线
|
|||
} |
|||
|
|||
//先判断该卡牌的类型是否是需要范围
|
|||
if (cardEntity.cardOriginalData.CastingRange != 0) |
|||
{ |
|||
if (currentNode != null && currentNode.influenced) |
|||
{ |
|||
//卡牌释放效果
|
|||
yield return StartCoroutine(cardEntity.settle(0, currentNode)); |
|||
} |
|||
else |
|||
{ |
|||
resetComponentPosition(); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
//卡牌释放效果
|
|||
yield return StartCoroutine(cardEntity.settle(0, GameManager.Instance.playerOn)); |
|||
|
|||
} |
|||
yield break; |
|||
} |
|||
else |
|||
{ |
|||
canUse = true; |
|||
} |
|||
} |
|||
|
|||
private bool cardTargetCheck() |
|||
{ |
|||
bool targetRight = false; |
|||
switch (cardEntity.cardOriginalData.CardTarget) |
|||
{ |
|||
case Name.Target.enemy: |
|||
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool) |
|||
{ |
|||
if (mapUnity.enemyNode != null && mapUnity.enemyNode.enemyType == EnemyNode.EnemyType.enemy) |
|||
{ |
|||
targetRight = true; break; |
|||
} |
|||
} |
|||
break; |
|||
case Name.Target.enemyAndBuilding: |
|||
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool) |
|||
{ |
|||
if (mapUnity.enemyNode != null) |
|||
{ |
|||
targetRight = true; break; |
|||
} |
|||
} |
|||
break; |
|||
case Name.Target.ally: |
|||
targetRight = true; |
|||
break; |
|||
} |
|||
Debug.Log("targetRight是" + targetRight); |
|||
return targetRight; |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
@ -0,0 +1,29 @@ |
|||
using System.Collections; |
|||
using System.Collections.Generic; |
|||
using UnityEngine; |
|||
|
|||
public class CoordinateColorPair |
|||
{ |
|||
public int X { get; set; } |
|||
public int Y { get; set; } |
|||
public string Color { get; set; } |
|||
|
|||
public CoordinateColorPair(int x, int y, string color) |
|||
{ |
|||
X = x; |
|||
Y = y; |
|||
Color = color; |
|||
} |
|||
|
|||
public override bool Equals(object obj) |
|||
{ |
|||
if (obj is CoordinateColorPair other) |
|||
return X == other.X && Y == other.Y && Color == other.Color; |
|||
return false; |
|||
} |
|||
|
|||
public override int GetHashCode() |
|||
{ |
|||
return (X, Y, Color).GetHashCode(); |
|||
} |
|||
} |
|||
@ -1,5 +1,5 @@ |
|||
fileFormatVersion: 2 |
|||
guid: b1a0228ae98882d43974484e55dca280 |
|||
guid: e9a4d6c1d5ec9674d9cfd40bdb9c2876 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
|
@ -1,5 +1,5 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 5b07afdbcf13e43438545d591cfd2e4b |
|||
guid: 741f3a676aaf67e458b1f5f2dfb9dea0 |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
Loading…
Reference in new issue