Browse Source

程序化抽卡动画

pull/25/head
45 2 years ago
parent
commit
47889a4a08
  1. 24
      ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/Card.prefab
  2. 9990
      ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/CardSmall/CardSmall.prefab
  3. 7
      ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/CardSmall/CardSmall.prefab.meta
  4. 11
      ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/Card_v01.prefab
  5. 10150
      ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity
  6. 20
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/ArrowManager.cs
  7. 157
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs
  8. 9
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs
  9. 22
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOnMouseEnter.cs
  10. 127
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardSmall/CardSmall.cs
  11. 27
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs
  12. 4
      ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs
  13. 144
      ColorlessWorld-2024-4-2/Assets/Scripts/UI/CardActiveSort/CardActiveSort.cs
  14. 2
      ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs
  15. 2
      ColorlessWorld-2024-4-2/ProjectSettings/DynamicsManager.asset
  16. 2
      ColorlessWorld-2024-4-2/ProjectSettings/TagManager.asset

24
ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/Card.prefab

@ -189,9 +189,17 @@ MonoBehaviour:
originalParent: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0}
eventSystem: {fileID: 0}
canUse: 1
ainPanle: {fileID: 4722556306121517745}
currentNode: {fileID: 0}
influencePreviewPool: []
dragState: 3
ready: 0
castingPool: []
layerMask:
serializedVersion: 2
m_Bits: 0
cardOnMouseEnter: {fileID: 0}
smallCardPrefab: {fileID: 0}
--- !u!114 &6042570540965326076
MonoBehaviour:
m_ObjectHideFlags: 0
@ -237,9 +245,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
cardId: 0
originalParent: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0}
eventSystem: {fileID: 0}
ainPanle: {fileID: 0}
currentNode: {fileID: 0}
influencePreviewPool: []
cost: {fileID: 0}
cardIndex: 0
cardDescription: {fileID: 0}
cardName: {fileID: 0}
cardImage: {fileID: 0}
canUse: 1
smallCardPrefab: {fileID: 3615574969851259241, guid: 2f88da2f5ca2fbc438b76c3faf2ea9db,
type: 3}

9990
ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/CardSmall/CardSmall.prefab

File diff suppressed because it is too large

7
ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/CardSmall/CardSmall.prefab.meta

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2f88da2f5ca2fbc438b76c3faf2ea9db
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

11
ColorlessWorld-2024-4-2/Assets/Prefab/CardPrefab/Card_v01.prefab

@ -893,6 +893,8 @@ MonoBehaviour:
cardName: {fileID: 5281579542142419986}
cardImage: {fileID: 5399218162963011116}
canUse: 1
smallCardPrefab: {fileID: 3615574969851259241, guid: 2f88da2f5ca2fbc438b76c3faf2ea9db,
type: 3}
--- !u!114 &5066967261904071208
MonoBehaviour:
m_ObjectHideFlags: 0
@ -905,13 +907,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 80971e1d1b78104439c3472d4276e502, type: 3}
m_Name:
m_EditorClassIdentifier:
follow: 0
originalParent: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0}
eventSystem: {fileID: 0}
canUse: 1
ainPanle: {fileID: 1075869202937435496}
currentNode: {fileID: 0}
dragState: 3
ready: 0
castingPool: []
layerMask:
serializedVersion: 2
@ -941,14 +944,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 523596fd7703bbe44a0c37d83fd5c880, type: 3}
m_Name:
m_EditorClassIdentifier:
oringinIndex: 0
cardDrag: {fileID: 0}
targetScale: {x: 0, y: 0, z: 0}
originScale: {x: 0, y: 0, z: 0}
speed: 4
moveOffset: 100
thisIndexInIndex: 0
moveOffset: 50
originPoint: {x: 0, y: 0, z: 0}
UpperOffset: {x: 0, y: 100, z: 0}
UpperOffset: {x: 0, y: 50, z: 0}
originRotation: {x: 0, y: 0, z: 0}
--- !u!1 &3523919461092501418
GameObject:

10150
ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity

File diff suppressed because it is too large

20
ColorlessWorld-2024-4-2/Assets/Scripts/Card/ArrowManager.cs

@ -36,9 +36,14 @@ public class ArrowManager : MonoBehaviour
public void Update()
{
//p0ÊÇÆðʼλÖÃ
this.controlPoints[0] = new Vector2(this.origin.position.x, this.origin.position.y);
//p3ÊÇÊó±êλÖÃ
this.controlPoints[3] = new Vector2(Input .mousePosition .x,Input .mousePosition .y);
Vector3 worldstart = transform.parent.TransformPoint(transform.position);
this.controlPoints[0] = new Vector2(worldstart.x, worldstart.y);
Debug.Log(controlPoints[0]);
//p3是鼠标位置-------鼠标在ui平面上的位置
Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 8f);
Vector3 worldPoint = Camera.main.ScreenToWorldPoint(position);
this.controlPoints[3] = new Vector2(worldPoint .x,worldPoint .y);
//p1p2ͨ¹ýp0p3¼ÆËã
this.controlPoints[1] = this.controlPoints[0] + (this.controlPoints[3] - this.controlPoints[0] )* this.controlPointFactors[0];
this.controlPoints[2] = this.controlPoints[0] + (this.controlPoints[3] - this.controlPoints[0] )* this.controlPointFactors[1];
@ -47,16 +52,19 @@ public class ArrowManager : MonoBehaviour
{
var t = Mathf.Log(1f * i / (this.arrowNodes.Count - 1) + 1f, 2f);
this.arrowNodes[i].position =
Vector3 currentPoint =
Mathf.Pow(1 - t, 3) * this.controlPoints[0] +
3 * Mathf.Pow(1 - t, 2) * t * this.controlPoints[1] +
3 * (1 - t) * Mathf.Pow(t, 2) * this.controlPoints[2] +
Mathf.Pow(t, 3) * this.controlPoints[3];
this.arrowNodes[i].position = currentPoint;
this.arrowNodes[i].localPosition -= new Vector3(0, 0, this.arrowNodes[i].localPosition.z);
if (i > 0)
{
var euler = new Vector3 (0,0,Vector2.SignedAngle(Vector2.up,this.arrowNodes[i].position-this.arrowNodes[i-1].position));
this.arrowNodes[i].rotation = Quaternion.Euler(euler);
var euler = new Vector3 (0,0,Vector2.SignedAngle(CardActiveSort.Instance.transform.InverseTransformDirection(transform.up), this.arrowNodes[i].position-this.arrowNodes[i-1].position));
this.arrowNodes[i].localRotation = Quaternion.Euler(euler);
}
var scale = this.scaleFactor * (1f - 0.03f * (this.arrowNodes.Count - 1 - i));

157
ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs

@ -49,7 +49,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
public LayerMask layerMask;
[Header("鼠标检测脚本")]
public CardOnMouseEnter cardOnMouseEnter;
public CardOnMouseEnter cardOnMouseEnter;
void Start()
{
@ -82,47 +82,51 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
}
}
switch (dragState)
if (GameManager.Instance.onDraw ==false )
{
case CardDragState.onBeginDrag:
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)
{
eventData.position = Mouse.current.position.value;
eventSystem.RaycastAll(eventData, result);
if (result.Count > 0)
switch (dragState)
{
case CardDragState.onBeginDrag:
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)
{
Debug.Log(result[0].gameObject.name);
if (result[0].gameObject == this.gameObject)
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)
{
eventData.position = Mouse.current.position.value;
eventSystem.RaycastAll(eventData, result);
if (result.Count > 0)
{
dragState = CardDragState.onBeginDrag;
GameManager.Instance.onDrag = true;
Debug.Log(result[0].gameObject.name);
if (result[0].gameObject == this.gameObject)
{
dragState = CardDragState.onBeginDrag;
GameManager.Instance.onDrag = true;
}
}
}
}
break;
}
break;
}
}
}
@ -143,8 +147,9 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
GetComponent<CanvasGroup>().blocksRaycasts = false;
originalpoint = this.transform.localPosition;
transform.SetParent(transform.parent.parent);
transform.position = eventData.position;
transform.SetParent(transform.parent.parent);
transform.localPosition = cardOnMouseEnter.originPoint;
GetComponent<RectTransform>().localScale = cardOnMouseEnter.targetScale;
//根据卡牌数据决定是否调用曲线
@ -172,7 +177,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
eventData.position = Mouse.current.position.value;
eventSystem.RaycastAll(eventData, result);
Debug.Log(result[0].gameObject.name);
// Debug.Log(result[0].gameObject.name);
if (result.Count > 0)
{
if(result[0].gameObject.name == "TotalPanel")
@ -181,9 +186,10 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
{
ready = true;
}
transform.position = cardOnMouseEnter.originPoint;
transform.localPosition = cardOnMouseEnter.originPoint;
if (cardEntity.cardOriginalData.CastingRange != 0)
{
Debug.Log("12123123");
ainPanleWork(eventData);
}
else
@ -199,28 +205,17 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
}
else
{
transform.position = eventData.position;
// Debug.Log(transform.position);
// Debug.Log(eventData.position);
// transform.position = eventData.position;
Vector3 eventDataWorld = CardActiveSort.Instance.ScreenPointToWorldPoint(eventData.position, 10f);
transform.position = eventDataWorld;
}
}
}
// if (eventData.pointerCurrentRaycast.gameObject.name == )
// {
// follow = false;
// }
// else
// {
// follow = true;
// }
// if (follow == true)
// {
// transform.position = eventData.position;
// }
// else
// {
// transform.position = CardActiveSort.Instance.preparePoint.transform.position;
// }
}
//卡牌释放
@ -352,7 +347,8 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
transform.SetParent(originalParent);
GetComponent<CanvasGroup>().blocksRaycasts = true;
transform.localScale = new Vector3(1f, 1f, 1f);
CardActiveSort.Instance.ReflashCardPoint();
return;
}
@ -375,41 +371,40 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
{
//射线检测瞄准的地图节点,判断是否可放置和改变放置影响区
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.value);
if (eventData.pointerCurrentRaycast.gameObject != null)
Debug.Log(Mouse.current.position.value);
if (Physics.Raycast(ray, out RaycastHit raycastHit, 500, layerMask.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)
{
// Debug.Log(raycastHit.collider.gameObject.name);
//检测到跟上次瞄准地方不同,更新
if (currentNode == null || raycastHit.collider.transform.gameObject != currentNode.gameObject)
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool)
{
foreach (MapUnity mapUnity in cardEntity.influencePreviewPool)
{
mapUnity.influenced = false;
}
cardEntity.influencePreviewPool.Clear();
currentNode = raycastHit.collider.transform.GetComponent<MapUnity>();
mapUnity.influenced = false;
}
cardEntity.influencePreviewPool.Clear();
currentNode = raycastHit.collider.transform.GetComponent<MapUnity>();
//重新调用范围预览
//GameManager.Instance.player.StepPreviewInfluencedNode(cardEntity.cardOriginalData.CastingRange);
setCastingRangePreview(cardEntity.cardOriginalData.EffectRange);
//预览影响范围
if (currentNode.influenced)
{
//根据卡牌属性改变影响池
//重新调用范围预览
//GameManager.Instance.player.StepPreviewInfluencedNode(cardEntity.cardOriginalData.CastingRange);
setCastingRangePreview(cardEntity.cardOriginalData.EffectRange);
//预览影响范围
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;
setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode);
//influencePreviewPool.Add(currentNode);
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;
setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, euler, currentNode);
//influencePreviewPool.Add(currentNode);
}
}
}
}
}
}
private void setCastingRangePreview(string effectRange)

9
ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs

@ -36,6 +36,8 @@ public class CardEntity : MonoBehaviour
public bool canUse = true;
[Header("¿¨ÅÆÊͷźóЧС¿¨")]
public GameObject smallCardPrefab;
public void Start()
{
@ -69,8 +71,15 @@ public class CardEntity : MonoBehaviour
//卡牌效果的结算
public IEnumerator settle(int settleTurn)
{
CreateSmallCard();
yield return StartCoroutine(DestructionManager.Instance.startDestoryAndUseCard(this.gameObject, cardOriginalData, influencePreviewPool, cardIndex));
}
public void CreateSmallCard()
{
var smallCard = Instantiate(smallCardPrefab, transform.position, transform.localRotation);
smallCard.GetComponent<CardSmall>().SetDestination(TurnMaster.Instance.usedCardNumberText.gameObject,cardId);
}
//获取卡牌图片

22
ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOnMouseEnter.cs

@ -41,12 +41,12 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
{
// if(coroutineSmall !=null )
// StopCoroutine(coroutineSmall);
if (GameManager.Instance.onDrag == false)
if (GameManager.Instance.onDrag == false&& GameManager .Instance .onDraw ==false )
{
StopAllCoroutines();
transform.position = originPoint;
transform.localPosition = originPoint;
rectTransform.eulerAngles = new Vector3(0f, 0f, 0f);
transform.localEulerAngles = new Vector3(0f, 0f, 0f);
coroutineBig = StartCoroutine(ZoomBig());
}
}
@ -55,11 +55,11 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
{
// if(coroutineBig != null )
// StopCoroutine(coroutineBig);
if(GameManager .Instance . onDrag ==false )
if(GameManager .Instance . onDrag ==false && GameManager.Instance.onDraw == false)
{
StopAllCoroutines();
rectTransform.eulerAngles = originRotation;
rectTransform.localEulerAngles = originRotation;
coroutineSmall = StartCoroutine(ZoomSmall());
}
@ -67,7 +67,7 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
IEnumerator ZoomBig()
{
transform.position += UpperOffset;
transform.localPosition += UpperOffset;
OffsetOtherCard(oringinIndex);
@ -85,7 +85,7 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
{
transform.SetSiblingIndex(oringinIndex);
transform.position = originPoint ;
transform.localPosition = originPoint ;
ComebackOtherCard(oringinIndex);
@ -131,7 +131,7 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
if(originPoint.x != 0 )
{
//Ïȹéλ
transform.position = originPoint;
transform.localPosition = originPoint;
}
//Ïò²àÃæÒÆ¶¯ÅÅ¿ª
@ -158,9 +158,9 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
IEnumerator MoveSideway(Vector3 targetPos)
{
while (Vector3.Distance(transform.position, targetPos) > 0.1)
while (Vector3.Distance(transform.localPosition, targetPos) > 0.1)
{
transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * speed);
transform.localPosition = Vector3.Lerp(transform.localPosition, targetPos, Time.deltaTime * speed);
yield return null;
}
}
@ -168,7 +168,7 @@ public class CardOnMouseEnter : MonoBehaviour, IPointerEnterHandler, IPointerExi
{
while (Vector3.Distance(transform.position, originPoint) > 0.1)
{
transform.position = Vector3.Lerp(transform.position, originPoint, Time.deltaTime * speed);
transform.localPosition = Vector3.Lerp(transform.localPosition, originPoint, Time.deltaTime * speed);
yield return null;
}
}

127
ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardSmall/CardSmall.cs

@ -1,7 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Security.Cryptography;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
@ -11,49 +14,123 @@ public class CardSmall : MonoBehaviour
{
public GameObject praticleSystem;
public Camera mainCaera;
Camera mainCaera;
public GameObject destination;//Ä¿µÄµØ
public Vector3 destinationPos;
public Vector3 startPos;//ÆðʼλÖÃ
public float time;
[Header("ËÙ¶È")]
public float speed;
public float rotationSpeed;
public float speed = 2f;
public float rotationSpeed = 2f;
[Header("曲线")]
public LineRenderer lineRender;
public Vector3 lineStart;
public Vector3 lineMiddel;
public Vector3 lineEnd;
public List<Vector3> linePath = new List<Vector3>();
public float posCount = 20f;
[Header("ͼ²ãÌÞ³ý")]
public LayerMask layerMask;
[Header("卡牌ID")]
public int cardID;
private void Start()
IEnumerator moveCardFollowLineWithToUsedCard()
{
for (int i = 0; i < linePath .Count -1 ; i++)
{
bool isMove = true;
time = 0;
while (isMove )
{
this.transform.position = Vector3.Lerp(linePath[i], linePath[i + 1], time += Time.deltaTime * speed);
Vector3 direction = linePath[i + 1] - linePath[i];
float angle = Vector3.SignedAngle(transform.up, direction, -transform.forward);
transform.eulerAngles = Vector3.Lerp(transform.eulerAngles, new Vector3(0, 0, angle), Time.deltaTime * rotationSpeed);
if (Vector3.Distance(this.transform.position, linePath[i + 1]) < 0.05)
{
isMove = false;
}
yield return 0;
}
}
Destroy(this.gameObject);
}
float x = destination.transform.position.x;
float y = destination.transform.position.y;
Vector2 positonUItoScreen = new Vector2(x, y);
Ray ray = mainCaera.ScreenPointToRay(positonUItoScreen);
if (Physics.Raycast(ray, out RaycastHit raycastHit))
IEnumerator moveCardFollowLineWithDrawCards()
{
bool isMove = true;
time = 0;
while (isMove)
{
Debug.Log(raycastHit.collider.gameObject.name + raycastHit.point);
destinationPos = raycastHit.point;
transform.localPosition = Vector3.Lerp(lineStart, lineEnd, time += Time.deltaTime * speed);
if (Vector3.Distance(transform.localPosition, lineEnd) < 0.01f)
{
isMove = false;
}
Vector3 targetPoint = CardActiveSort.Instance.targrtPoint;
Vector3 direction = targetPoint - transform.localPosition;
float angle = Vector3.SignedAngle(-CardActiveSort.Instance.transform.InverseTransformDirection(transform.up), direction, CardActiveSort.Instance.transform.InverseTransformDirection(transform.forward));
transform. GetComponent<RectTransform>().Rotate(0, 0, angle);
yield return null;
}
// Vector3 targetPoint = CardActiveSort.Instance.targrtPoint;
// Vector3 direction = targetPoint - transform.localPosition;
// float angle = Vector3.SignedAngle(-CardActiveSort.Instance.transform.InverseTransformDirection(CardActiveSort.Instance.transform.up), direction, CardActiveSort.Instance.transform.InverseTransformDirection(CardActiveSort.Instance.transform.forward));
// GetComponent<RectTransform>().Rotate(0, 0, angle);
startPos = transform.position;
CardActiveSort.Instance.prepareHandCard.Add(this.gameObject);
Destroy(this);
}
public void SetDestination(GameObject gameObject,int ID )
{
cardID = ID;
lineRender = GetComponent<LineRenderer>();
mainCaera = GameManager.Instance.mainCamera;
lineStart = transform.position + new Vector3(0, 0, -0.05f);
lineEnd = gameObject.transform.position + new Vector3(0, 0, -0.05f);
lineMiddel = lineStart + new Vector3(-3f, 6f, -1f);
CalculatePath();
StartCoroutine(moveCardFollowLineWithToUsedCard());
}
public void SetDestinationWithDrawCard(Vector3 endPoint)
{
mainCaera = GameManager.Instance.mainCamera;
lineStart = transform.localPosition + new Vector3(395f, 0, 0);
lineEnd = endPoint;
StartCoroutine(moveCardFollowLineWithDrawCards());
}
private void Update()
{
this.transform.position = Vector3.Lerp(transform.position, destinationPos, time += Time.deltaTime * speed);
#region 计算贝塞尔曲线的拟合点
public void CalculatePath()
{
// lineRender.positionCount = (int)posCount;
Vector3 direction = destinationPos - transform.position;
float angle = Vector3.SignedAngle(transform.forward, direction, transform.up);
transform.eulerAngles = Vector3.Lerp(transform.eulerAngles,new Vector3 (0, angle, 0 ),Time.deltaTime *rotationSpeed );
linePath.Clear();
if (Vector3 .Distance (transform.position, destinationPos)<0.1)
for(int i=0;i<posCount;i++)
{
Destroy(this.gameObject);
Vector3 currentPoint = CalculateBezierPoint(lineStart, lineMiddel, lineEnd, i / posCount);
linePath.Add(currentPoint);
// lineRender.SetPosition(i, currentPoint);
}
}
public Vector3 CalculateBezierPoint(Vector3 p0,Vector3 p1,Vector3 p2, float t)
{
float u = 1 - t;
float tt = t * t;
return u * u * p0 + 2 * t * u * p1 + tt * p2;
}
#endregion
}

27
ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs

@ -41,6 +41,7 @@ public class TurnMaster : Singleton<TurnMaster>
banAction
}
public void Start()
{
/*totalCost = Usermanager.Instance.totalCost;
@ -180,7 +181,7 @@ public class TurnMaster : Singleton<TurnMaster>
Debug.Log("真正抽卡数:"+tureDrawCardsNum);
// 等待直到当前帧结束
yield return new WaitForEndOfFrame();
drawCards(tureDrawCardsNum);
StartCoroutine( drawCards(tureDrawCardsNum));
}
public IEnumerator MoveCards()
@ -233,21 +234,32 @@ public class TurnMaster : Singleton<TurnMaster>
handCard.cardEntityList.RemoveAt(cardIndex);
}
public void drawCards(int drawNum)
public IEnumerator drawCards(int drawNum)
{
GameManager.Instance.onDraw = true;
int handCardCount = handCard.cardEntityList.Count;
int actualCardsToDraw = Mathf.Min(handCard.maxHandCard - handCardCount, drawNum);
CardActiveSort.Instance.drawCardCount = actualCardsToDraw;
CardActiveSort.Instance.StartCoroutine(CardActiveSort.Instance.ReflashCardPointWithDrawCards());
yield return new WaitUntil(() => CardActiveSort.Instance.canDrawCard == true);
for (int i = handCardCount; i < handCardCount + actualCardsToDraw; i++)
{
{
if (cardDeck.cardList.Count > 0)
{
var a = Instantiate(cardDeck.cardPrefab,handCard .cardPanle .transform );
a.GetComponent<RectTransform>().localEulerAngles = new Vector3(0, 0, 0);
CardEntity cardEntity = a.GetComponent<CardEntity>();
cardEntity .createCard(cardDeck.cardList[cardDeck.cardList.Count - 1], i);
cardDeck.cardList.RemoveAt(cardDeck.cardList.Count - 1);
handCard.cardEntityList.Add(cardEntity);
//添加卡牌移动脚本
CardSmall cardSmall = a.AddComponent<CardSmall>();
cardSmall.SetDestinationWithDrawCard(CardActiveSort.Instance.newPointList[i]);
}
else if (usedCard.usedCardList.Count > 0)
{
@ -261,14 +273,19 @@ public class TurnMaster : Singleton<TurnMaster>
usedCard.usedCardList.Clear();
var a = Instantiate(cardDeck.cardPrefab, handCard.cardPanle.transform);
a.GetComponent <RectTransform >().localEulerAngles = new Vector3(0, 0, 0);
CardEntity cardEntity = a.GetComponent<CardEntity>();
cardEntity.createCard(cardDeck.cardList[cardDeck.cardList.Count - 1], i);
cardDeck.cardList.RemoveAt(cardDeck.cardList.Count - 1);
handCard.cardEntityList.Add(cardEntity);
//添加卡牌移动脚本
CardSmall cardSmall = a.AddComponent<CardSmall>();
cardSmall.SetDestinationWithDrawCard(CardActiveSort.Instance.newPointList[i]);
}
}
CardActiveSort.Instance.ReflashCardPoint();
yield return new WaitForSeconds(0.2f);
}
}
}
/* public void ShuffleWithoutLosingCards()

4
ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs

@ -18,6 +18,7 @@ public class GameManager : Singleton<GameManager>
[Header("角色动作状态")]
public bool onDrag;//正在拖动卡牌
public bool onDraw;//正在抽卡
[Header("角色状态数据UI")]
public Text textMaxCost;
@ -43,6 +44,9 @@ public class GameManager : Singleton<GameManager>
public int cardRewardsCounter = 0;
[Header("主摄像机")]
public Camera mainCamera;
private void Start()
{
//生成空地图列表

144
ColorlessWorld-2024-4-2/Assets/Scripts/UI/CardActiveSort/CardActiveSort.cs

@ -1,24 +1,34 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class CardActiveSort : Singleton <CardActiveSort>
{
public int cardCount;
public GameObject targrtPoint;//Ô²ÐÄ
public Vector3 targrtPoint;//圆心
public float radius;//半径
public float angleIncrement;//起始角度增量
public GameObject preparePoint;
Camera mainCamera;
[Header("抽卡")]
public int drawCardCount;//抽卡数量
public List<GameObject> prepareHandCard = new List<GameObject>();//正在飞还没到手里的卡牌
public List<Vector3> newPointList = new List<Vector3>();//预先计算好的新位置
public float drawMoveSpeed=4;
public bool canDrawCard;
[Header ("¿¨ÅÆÎ»ÖÃ")]
public List<CardPointData> cardOringinPointDataList= new List<CardPointData>();
private void Start()
{
targrtPoint = transform.localPosition - new Vector3(0, radius, 0);
Debug.Log(targrtPoint);
mainCamera = FindObjectOfType<Camera>();
}
void Update()
{
if(transform .childCount > cardCount && transform .childCount >1)
/* if(transform .childCount > cardCount && transform .childCount >1)
{
ReflashCardPoint();
cardCount = this.transform.childCount;
@ -26,7 +36,7 @@ public class CardActiveSort : Singleton <CardActiveSort>
if(transform.childCount < cardCount)
{
cardCount = this.transform.childCount;
}
}*/
}
public void ReflashCardPoint()
{
@ -59,46 +69,129 @@ public class CardActiveSort : Singleton <CardActiveSort>
{
currentangle += angleIncrement ;
cardEntitieList[i].transform.position = new Vector3(targrtPoint.transform.position.x-radius * Mathf.Cos(currentangle * Mathf.Deg2Rad), targrtPoint.transform.position.y+ radius * Mathf.Sin(currentangle * Mathf.Deg2Rad), 0);
cardEntitieList[i].transform.localPosition = new Vector3(targrtPoint.x - radius * Mathf.Cos(currentangle * Mathf.Deg2Rad), targrtPoint.y + radius * Mathf.Sin(currentangle * Mathf.Deg2Rad), 0);
Vector3 direction = targrtPoint - cardEntitieList[i].transform.localPosition;
Vector3 direction = targrtPoint.transform.position- cardEntitieList[i].transform.position;
float angle = Vector3.SignedAngle(-cardEntitieList[i].transform.up, direction, cardEntitieList[i].transform.forward);
cardEntitieList[i].transform.Rotate(0, 0, angle);
float angle = Vector3.SignedAngle(-transform.InverseTransformDirection(cardEntitieList[i].transform.up), direction, transform.InverseTransformDirection(cardEntitieList[i].transform.forward));
cardEntitieList[i].GetComponent<RectTransform>().Rotate(0, 0, angle);
Debug .Log (angle);
}
//重置初始位置
foreach (var card in cardEntitieList)
{
CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>();
cardOnMouseEnte.originPoint= cardOnMouseEnte.transform.position ;
cardOnMouseEnte.originRotation = cardOnMouseEnte.GetComponent <RectTransform >().eulerAngles;
cardOnMouseEnte.originPoint= cardOnMouseEnte.transform.localPosition;
cardOnMouseEnte.originRotation = cardOnMouseEnte.GetComponent <RectTransform >().localEulerAngles;
cardOnMouseEnte.oringinIndex = cardOnMouseEnte.transform.GetSiblingIndex();
}
}
public void ReflashCardPointWithSave()
public IEnumerator ReflashCardPointWithDrawCards()
{
prepareHandCard.Clear();
canDrawCard = false;
List<RectTransform> cardEntitieList = new List<RectTransform>();
//将已有的手牌加入列表
for (int i = 0; i < transform.childCount; i++)
{
cardEntitieList.Add(transform.GetChild(i).GetComponent<RectTransform>());
}
int cardCount = cardEntitieList.Count + drawCardCount;
//停止移动
foreach (var card in cardEntitieList)
{
CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>();
cardOnMouseEnte.StopAllCoroutines();
cardOnMouseEnte.StopAllCoroutines();
}
Debug.Log("抽卡排序");
float currentangle = 0;
if (cardCount % 2 == 0)
{
currentangle = 90 - (angleIncrement * (cardCount / 2 + 0.5f));
}
else
{
currentangle = 90 - (angleIncrement * (cardCount / 2 + 1));
}
newPointList.Clear();
//计算所有卡牌的新位置,包括将要抽取的
for (int i = 0; i < cardCount; i++)
{
currentangle += angleIncrement;
newPointList .Add ( new Vector3(targrtPoint.x - radius * Mathf.Cos(currentangle * Mathf.Deg2Rad), targrtPoint.y + radius * Mathf.Sin(currentangle * Mathf.Deg2Rad), 0));
}
Debug.Log("ÅÅÐò-Save");
//移动已有卡牌到新位置
for (int i = 0; i < cardEntitieList.Count; i++)
{
cardEntitieList[i].transform.position = cardOringinPointDataList[i].originPoint;
cardEntitieList[i].transform.eulerAngles = cardOringinPointDataList[i].originRotation;
bool move = true;
Vector3 startpos = cardEntitieList[i].transform.localPosition;
float time = 0;
while (move)
{
Vector3 direction = targrtPoint - cardEntitieList[i].transform.localPosition;
float angle = Vector3.SignedAngle(-transform.InverseTransformDirection(cardEntitieList[i].transform.up), direction, transform.InverseTransformDirection(cardEntitieList[i].transform.forward));
cardEntitieList[i].GetComponent<RectTransform>().Rotate(0, 0, angle);
cardEntitieList[i].transform.localPosition = Vector3.Lerp(startpos, newPointList[i], time += Time.deltaTime * drawMoveSpeed);
if (Vector3.Distance(cardEntitieList[i].transform.localPosition, newPointList[i]) < 0.01f)
{
move = false;
}
yield return null;
}
}
canDrawCard = true;//标识已经移动完成,让抽卡方法生成新卡牌
yield return new WaitUntil(() => prepareHandCard.Count == drawCardCount);//等待新抽的卡牌移动到位
//将新加进来的卡牌加入列表
for (int i = 0; i < prepareHandCard.Count; i++)
{
cardEntitieList.Add(prepareHandCard[i].GetComponent<RectTransform>());
}
/* for (int i = cardEntitieList.Count-drawCardCount; i < cardCount; i++)
{
bool move = true;
Vector3 startpos = cardEntitieList[i].transform.localPosition;
float time = 0;
while (move)
{
Vector3 direction = targrtPoint - cardEntitieList[i].transform.localPosition;
float angle = Vector3.SignedAngle(-transform.InverseTransformDirection(cardEntitieList[i].transform.up), direction, transform.InverseTransformDirection(cardEntitieList[i].transform.forward));
cardEntitieList[i].GetComponent<RectTransform>().Rotate(0, 0, angle);
cardEntitieList[i].transform.localPosition = Vector3.Lerp(startpos, newPointList[i], time += Time.deltaTime * drawMoveSpeed);
if (Vector3.Distance(cardEntitieList[i].transform.localPosition, newPointList[i]) < 0.01f)
{
move = false;
}
yield return null;
}
}*/
//重置初始位置
foreach (var card in cardEntitieList)
{
CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>();
cardOnMouseEnte.originPoint = cardOnMouseEnte.transform.localPosition;
cardOnMouseEnte.originRotation = cardOnMouseEnte.GetComponent<RectTransform>().localEulerAngles;
cardOnMouseEnte.oringinIndex = cardOnMouseEnte.transform.GetSiblingIndex();
}
GameManager.Instance.onDraw = false;
}
[System .Serializable ]
public class CardPointData
{
@ -113,4 +206,13 @@ public class CardActiveSort : Singleton <CardActiveSort>
currentCardPointData.originRotation = originRotation;
return currentCardPointData;
}
public Vector3 ScreenPointToWorldPoint(Vector2 screenPoint, float planeZ)
{
// Camera.main 世界摄像机
Vector3 position = new Vector3(screenPoint.x, screenPoint.y, planeZ);
Vector3 worldPoint = Camera.main.ScreenToWorldPoint(position);
return worldPoint;
}
}

2
ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs

@ -132,7 +132,7 @@ public class SettlementManager : Singleton<SettlementManager>
}
else
{
TurnMaster.Instance.drawCards(int.Parse(kvp.Value));
StartCoroutine( TurnMaster.Instance.drawCards(int.Parse(kvp.Value)));
yield return StartCoroutine(TurnMaster.Instance.MoveCards());
}
break;

2
ColorlessWorld-2024-4-2/ProjectSettings/DynamicsManager.asset

@ -18,7 +18,7 @@ PhysicsManager:
m_ClothInterCollisionDistance: 0.1
m_ClothInterCollisionStiffness: 0.2
m_ContactsGeneration: 1
m_LayerCollisionMatrix: fff0fffffff0fffffff0fffffffffffffff0fffffff0fffffff0fffffff1ffff88f2ffff08f1ffff08f0ffff08f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: ffe0ffffffe0ffffffe0ffffffffffffffe0ffffffe0ffffffe0ffffffe1ffff88e2ffff08e1ffff08e0ffff08e0ffff08e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_SimulationMode: 0
m_AutoSyncTransforms: 0
m_ReuseCollisionCallbacks: 0

2
ColorlessWorld-2024-4-2/ProjectSettings/TagManager.asset

@ -19,7 +19,7 @@ TagManager:
- Enemy
- EnemyUI
- Block
-
- BackGround
-
-
-

Loading…
Cancel
Save