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. 10300
      ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity
  6. 20
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/ArrowManager.cs
  7. 45
      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. 125
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardSmall/CardSmall.cs
  11. 25
      ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs
  12. 4
      ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs
  13. 138
      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} originalParent: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0} originalpoint: {x: 0, y: 0, z: 0}
eventSystem: {fileID: 0} eventSystem: {fileID: 0}
canUse: 1
ainPanle: {fileID: 4722556306121517745} ainPanle: {fileID: 4722556306121517745}
currentNode: {fileID: 0} currentNode: {fileID: 0}
influencePreviewPool: [] dragState: 3
ready: 0
castingPool: []
layerMask:
serializedVersion: 2
m_Bits: 0
cardOnMouseEnter: {fileID: 0}
smallCardPrefab: {fileID: 0}
--- !u!114 &6042570540965326076 --- !u!114 &6042570540965326076
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -237,9 +245,11 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
cardId: 0 cardId: 0
originalParent: {fileID: 0} cost: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0} cardIndex: 0
eventSystem: {fileID: 0} cardDescription: {fileID: 0}
ainPanle: {fileID: 0} cardName: {fileID: 0}
currentNode: {fileID: 0} cardImage: {fileID: 0}
influencePreviewPool: [] 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} cardName: {fileID: 5281579542142419986}
cardImage: {fileID: 5399218162963011116} cardImage: {fileID: 5399218162963011116}
canUse: 1 canUse: 1
smallCardPrefab: {fileID: 3615574969851259241, guid: 2f88da2f5ca2fbc438b76c3faf2ea9db,
type: 3}
--- !u!114 &5066967261904071208 --- !u!114 &5066967261904071208
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -905,13 +907,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 80971e1d1b78104439c3472d4276e502, type: 3} m_Script: {fileID: 11500000, guid: 80971e1d1b78104439c3472d4276e502, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
follow: 0
originalParent: {fileID: 0} originalParent: {fileID: 0}
originalpoint: {x: 0, y: 0, z: 0} originalpoint: {x: 0, y: 0, z: 0}
eventSystem: {fileID: 0} eventSystem: {fileID: 0}
canUse: 1
ainPanle: {fileID: 1075869202937435496} ainPanle: {fileID: 1075869202937435496}
currentNode: {fileID: 0} currentNode: {fileID: 0}
dragState: 3 dragState: 3
ready: 0
castingPool: [] castingPool: []
layerMask: layerMask:
serializedVersion: 2 serializedVersion: 2
@ -941,14 +944,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 523596fd7703bbe44a0c37d83fd5c880, type: 3} m_Script: {fileID: 11500000, guid: 523596fd7703bbe44a0c37d83fd5c880, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
oringinIndex: 0
cardDrag: {fileID: 0} cardDrag: {fileID: 0}
targetScale: {x: 0, y: 0, z: 0} targetScale: {x: 0, y: 0, z: 0}
originScale: {x: 0, y: 0, z: 0} originScale: {x: 0, y: 0, z: 0}
speed: 4 speed: 4
moveOffset: 100 moveOffset: 50
thisIndexInIndex: 0
originPoint: {x: 0, y: 0, z: 0} 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} originRotation: {x: 0, y: 0, z: 0}
--- !u!1 &3523919461092501418 --- !u!1 &3523919461092501418
GameObject: GameObject:

10300
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() public void Update()
{ {
//p0ÊÇÆðʼλÖà //p0ÊÇÆðʼλÖÃ
this.controlPoints[0] = new Vector2(this.origin.position.x, this.origin.position.y); Vector3 worldstart = transform.parent.TransformPoint(transform.position);
//p3ÊÇÊó±êλÖà this.controlPoints[0] = new Vector2(worldstart.x, worldstart.y);
this.controlPoints[3] = new Vector2(Input .mousePosition .x,Input .mousePosition .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¼ÆËã //p1p2ͨ¹ýp0p3¼ÆËã
this.controlPoints[1] = this.controlPoints[0] + (this.controlPoints[3] - this.controlPoints[0] )* this.controlPointFactors[0]; 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]; 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); 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] + Mathf.Pow(1 - t, 3) * this.controlPoints[0] +
3 * Mathf.Pow(1 - t, 2) * t * this.controlPoints[1] + 3 * Mathf.Pow(1 - t, 2) * t * this.controlPoints[1] +
3 * (1 - t) * Mathf.Pow(t, 2) * this.controlPoints[2] + 3 * (1 - t) * Mathf.Pow(t, 2) * this.controlPoints[2] +
Mathf.Pow(t, 3) * this.controlPoints[3]; 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) if (i > 0)
{ {
var euler = new Vector3 (0,0,Vector2.SignedAngle(Vector2.up,this.arrowNodes[i].position-this.arrowNodes[i-1].position)); 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].rotation = Quaternion.Euler(euler); this.arrowNodes[i].localRotation = Quaternion.Euler(euler);
} }
var scale = this.scaleFactor * (1f - 0.03f * (this.arrowNodes.Count - 1 - i)); var scale = this.scaleFactor * (1f - 0.03f * (this.arrowNodes.Count - 1 - i));

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

@ -82,10 +82,12 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
} }
} }
if (GameManager.Instance.onDraw ==false )
{
switch (dragState) switch (dragState)
{ {
case CardDragState.onBeginDrag: case CardDragState.onBeginDrag:
if(choosed ==false ) if (choosed == false)
{ {
TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.useCard; TurnMaster.Instance.playerAction = TurnMaster.PlayerAction.useCard;
CardChoose(eventData); CardChoose(eventData);
@ -123,6 +125,8 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
} }
break; break;
} }
}
} }
@ -144,7 +148,8 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
originalpoint = this.transform.localPosition; originalpoint = this.transform.localPosition;
transform.SetParent(transform.parent.parent); transform.SetParent(transform.parent.parent);
transform.position = eventData.position; transform.localPosition = cardOnMouseEnter.originPoint;
GetComponent<RectTransform>().localScale = cardOnMouseEnter.targetScale; GetComponent<RectTransform>().localScale = cardOnMouseEnter.targetScale;
//根据卡牌数据决定是否调用曲线 //根据卡牌数据决定是否调用曲线
@ -172,7 +177,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
eventData.position = Mouse.current.position.value; eventData.position = Mouse.current.position.value;
eventSystem.RaycastAll(eventData, result); eventSystem.RaycastAll(eventData, result);
Debug.Log(result[0].gameObject.name); // Debug.Log(result[0].gameObject.name);
if (result.Count > 0) if (result.Count > 0)
{ {
if(result[0].gameObject.name == "TotalPanel") if(result[0].gameObject.name == "TotalPanel")
@ -181,9 +186,10 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
{ {
ready = true; ready = true;
} }
transform.position = cardOnMouseEnter.originPoint; transform.localPosition = cardOnMouseEnter.originPoint;
if (cardEntity.cardOriginalData.CastingRange != 0) if (cardEntity.cardOriginalData.CastingRange != 0)
{ {
Debug.Log("12123123");
ainPanleWork(eventData); ainPanleWork(eventData);
} }
else else
@ -199,28 +205,17 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
} }
else 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;
// }
} }
//卡牌释放 //卡牌释放
@ -353,6 +348,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
GetComponent<CanvasGroup>().blocksRaycasts = true; GetComponent<CanvasGroup>().blocksRaycasts = true;
transform.localScale = new Vector3(1f, 1f, 1f); transform.localScale = new Vector3(1f, 1f, 1f);
CardActiveSort.Instance.ReflashCardPoint();
return; return;
} }
@ -375,11 +371,10 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
{ {
//射线检测瞄准的地图节点,判断是否可放置和改变放置影响区 //射线检测瞄准的地图节点,判断是否可放置和改变放置影响区
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.value); 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); Debug.Log(raycastHit.collider.gameObject.name);
//检测到跟上次瞄准地方不同,更新 //检测到跟上次瞄准地方不同,更新
if (currentNode == null || raycastHit.collider.transform.gameObject != currentNode.gameObject) if (currentNode == null || raycastHit.collider.transform.gameObject != currentNode.gameObject)
{ {
@ -409,7 +404,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag
} }
} }
}
} }
private void setCastingRangePreview(string effectRange) 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; public bool canUse = true;
[Header("¿¨ÅÆÊͷźóЧС¿¨")]
public GameObject smallCardPrefab;
public void Start() public void Start()
{ {
@ -69,10 +71,17 @@ public class CardEntity : MonoBehaviour
//卡牌效果的结算 //卡牌效果的结算
public IEnumerator settle(int settleTurn) public IEnumerator settle(int settleTurn)
{ {
CreateSmallCard();
yield return StartCoroutine(DestructionManager.Instance.startDestoryAndUseCard(this.gameObject, cardOriginalData, influencePreviewPool, cardIndex)); 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);
}
//获取卡牌图片 //获取卡牌图片
public void createCardImage() public void createCardImage()
{ {

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

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

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

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

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

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

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

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

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

@ -1,24 +1,34 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
public class CardActiveSort : Singleton <CardActiveSort> public class CardActiveSort : Singleton <CardActiveSort>
{ {
public int cardCount; public int cardCount;
public GameObject targrtPoint;//Ô²ÐÄ public Vector3 targrtPoint;//圆心
public float radius;//半径 public float radius;//半径
public float angleIncrement;//起始角度增量 public float angleIncrement;//起始角度增量
public GameObject preparePoint; Camera mainCamera;
[Header ("¿¨ÅÆÎ»ÖÃ")] [Header("抽卡")]
public List<CardPointData> cardOringinPointDataList= new List<CardPointData>(); public int drawCardCount;//抽卡数量
public List<GameObject> prepareHandCard = new List<GameObject>();//正在飞还没到手里的卡牌
public List<Vector3> newPointList = new List<Vector3>();//预先计算好的新位置
public float drawMoveSpeed=4;
public bool canDrawCard;
private void Start()
{
targrtPoint = transform.localPosition - new Vector3(0, radius, 0);
Debug.Log(targrtPoint);
mainCamera = FindObjectOfType<Camera>();
}
void Update() void Update()
{ {
if(transform .childCount > cardCount && transform .childCount >1) /* if(transform .childCount > cardCount && transform .childCount >1)
{ {
ReflashCardPoint(); ReflashCardPoint();
cardCount = this.transform.childCount; cardCount = this.transform.childCount;
@ -26,7 +36,7 @@ public class CardActiveSort : Singleton <CardActiveSort>
if(transform.childCount < cardCount) if(transform.childCount < cardCount)
{ {
cardCount = this.transform.childCount; cardCount = this.transform.childCount;
} }*/
} }
public void ReflashCardPoint() public void ReflashCardPoint()
{ {
@ -59,46 +69,129 @@ public class CardActiveSort : Singleton <CardActiveSort>
{ {
currentangle += angleIncrement ; 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(-transform.InverseTransformDirection(cardEntitieList[i].transform.up), direction, transform.InverseTransformDirection(cardEntitieList[i].transform.forward));
float angle = Vector3.SignedAngle(-cardEntitieList[i].transform.up, direction, cardEntitieList[i].transform.forward); cardEntitieList[i].GetComponent<RectTransform>().Rotate(0, 0, angle);
cardEntitieList[i].transform.Rotate(0, 0, angle); Debug .Log (angle);
} }
//重置初始位置 //重置初始位置
foreach (var card in cardEntitieList) foreach (var card in cardEntitieList)
{ {
CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>(); 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(); cardOnMouseEnte.oringinIndex = cardOnMouseEnte.transform.GetSiblingIndex();
} }
} }
public IEnumerator ReflashCardPointWithDrawCards()
public void ReflashCardPointWithSave()
{ {
prepareHandCard.Clear();
canDrawCard = false;
List<RectTransform> cardEntitieList = new List<RectTransform>(); List<RectTransform> cardEntitieList = new List<RectTransform>();
//将已有的手牌加入列表
for (int i = 0; i < transform.childCount; i++) for (int i = 0; i < transform.childCount; i++)
{ {
cardEntitieList.Add(transform.GetChild(i).GetComponent<RectTransform>()); cardEntitieList.Add(transform.GetChild(i).GetComponent<RectTransform>());
} }
int cardCount = cardEntitieList.Count + drawCardCount;
//停止移动 //停止移动
foreach (var card in cardEntitieList) foreach (var card in cardEntitieList)
{ {
CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>(); CardOnMouseEnter cardOnMouseEnte = card.GetComponent<CardOnMouseEnter>();
cardOnMouseEnte.StopAllCoroutines(); cardOnMouseEnte.StopAllCoroutines();
} }
Debug.Log("ÅÅÐò-Save");
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));
}
//移动已有卡牌到新位置
for (int i = 0; i < cardEntitieList.Count; i++) for (int i = 0; i < cardEntitieList.Count; i++)
{ {
cardEntitieList[i].transform.position = cardOringinPointDataList[i].originPoint; bool move = true;
cardEntitieList[i].transform.eulerAngles = cardOringinPointDataList[i].originRotation; 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 ] [System .Serializable ]
public class CardPointData public class CardPointData
{ {
@ -113,4 +206,13 @@ public class CardActiveSort : Singleton <CardActiveSort>
currentCardPointData.originRotation = originRotation; currentCardPointData.originRotation = originRotation;
return currentCardPointData; 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 else
{ {
TurnMaster.Instance.drawCards(int.Parse(kvp.Value)); StartCoroutine( TurnMaster.Instance.drawCards(int.Parse(kvp.Value)));
yield return StartCoroutine(TurnMaster.Instance.MoveCards()); yield return StartCoroutine(TurnMaster.Instance.MoveCards());
} }
break; break;

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

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

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

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

Loading…
Cancel
Save