127 lines
5.1 KiB
C#
Raw Normal View History

2025-11-18 02:08:07 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
2025-11-19 01:27:15 +08:00
using TMPro;
2025-11-18 02:08:07 +08:00
using UnityEngine;
using UnityEngine.Splines;
2025-11-19 01:27:15 +08:00
using UnityEngine.UI;
2025-11-18 02:08:07 +08:00
public class TurnHandlerDealCard : MonoBehaviour
{
// ======== serializeField ========
2025-11-18 16:43:59 +08:00
[SerializeField] private List<GameObject> cardPrefabs;
[SerializeField] private SplineContainer splineContainer;
[SerializeField] private RectTransform dealCardPlace;
[SerializeField] private Camera mainCamera;
[SerializeField] private Transform cardContainer;
2025-11-20 02:23:07 +08:00
[SerializeField] private Collider2D areaCollider;
2025-11-18 02:08:07 +08:00
// ======== private ========
private Vector3 deal_card_point_world_position;
2025-11-18 18:53:06 +08:00
private TurnEventManagement turnManager;
2025-11-18 22:26:13 +08:00
private TurnSingleton turnSingleton;
2025-11-18 02:08:07 +08:00
2025-11-19 01:27:15 +08:00
2025-11-18 02:08:07 +08:00
private void Awake()
{
2025-11-18 18:53:06 +08:00
turnManager = GetComponent<TurnEventManagement>();
2025-11-18 22:26:13 +08:00
turnSingleton = TurnSingleton.Instance;
2025-11-18 02:08:07 +08:00
}
private void Start()
{
if (mainCamera == null) mainCamera = Camera.main;
RectTransformUtility.ScreenPointToWorldPointInRectangle(
rect: dealCardPlace,
screenPoint: dealCardPlace.position,
cam: mainCamera,
out deal_card_point_world_position);
}
2025-11-18 19:22:47 +08:00
public void DealCard(STRUCT_TURN_OS.LET_OS_DEAL_CARD args) // 系统发牌事件
2025-11-18 02:08:07 +08:00
{
2025-11-20 14:43:50 +08:00
List<RequestsMethods> verificationList = new() { RequestsMethods.POST };
2025-11-18 22:26:13 +08:00
if (!turnSingleton.VerificationRequestsMethods(args.METHOD, verificationList)) return;
if (!turnSingleton.VerificationActionStatus(turnManager.GetActionState(), TURN_ACTION_STATE.DEAL_REQUEST)) return;
if (!turnSingleton.VerificationSystemStatus(turnManager.GetState(), TURN_OS_STATE.ENTER_SELF_TURN)) return;
if (turnSingleton.GetNeedDebugLog()) print("系统发牌");
int handCardCount = args.DEFAULT_HAND_CARD_COUNT;
2025-11-18 18:12:49 +08:00
int deckCardCount = args.DECK_CARD_COUNT;
2025-11-18 22:26:13 +08:00
float move_duration = args.MOVE_ANIMATION_DURATION;
float drag_duration = args.DRAG_ANIMATION_DURATION;
turnManager.SetActionState(TURN_ACTION_STATE.DEAL_RUNNING);
turnManager.SetState(TURN_OS_STATE.STAY_SELF_TURN);
2025-11-18 18:12:49 +08:00
StartCoroutine(coroutine());
2025-11-18 02:08:07 +08:00
return;
2025-11-18 18:12:49 +08:00
IEnumerator coroutine()
2025-11-18 02:08:07 +08:00
{
2025-11-18 18:12:49 +08:00
for (var i = 0; i < handCardCount; i++)
2025-11-18 17:43:30 +08:00
{
2025-11-18 22:26:13 +08:00
create_a_card(move_duration, drag_duration);
yield return new WaitForSeconds(move_duration);
2025-11-18 17:43:30 +08:00
}
2025-11-18 22:26:13 +08:00
turnManager.SetActionState(TURN_ACTION_STATE.WAIT);
2025-11-18 02:08:07 +08:00
}
}
2025-11-18 22:26:13 +08:00
private void create_a_card(float move_duration, float drag_duration) // 创建卡牌实例
2025-11-18 02:08:07 +08:00
{
GameObject _card = Instantiate<GameObject>(
cardPrefabs[UnityEngine.Random.Range(0, cardPrefabs.Count)],
position: deal_card_point_world_position,
rotation: Quaternion.identity,
parent: cardContainer);
2025-11-18 18:53:06 +08:00
_card.gameObject.name = $"Card_{turnManager.GetHandCardCount()}";
2025-11-20 14:43:50 +08:00
Card1 cardComponent = _card.GetComponent<Card1>();
2025-11-18 18:53:06 +08:00
cardComponent.SetID(turnManager.GetHandCardCount());
2025-11-18 22:26:13 +08:00
cardComponent.SetTurnManager(turnManager);
cardComponent.SetHoverDuration(drag_duration);
2025-11-20 02:23:07 +08:00
cardComponent.SetCollider2D(areaCollider);
2025-11-18 18:53:06 +08:00
turnManager.AddHandCard(cardComponent);
2025-11-18 22:26:13 +08:00
readjust_card_card_position(move_duration);
2025-11-18 02:08:07 +08:00
}
2025-11-18 22:26:13 +08:00
private void readjust_card_card_position(float move_duration) // 调整卡牌位置
2025-11-18 02:08:07 +08:00
{
2025-11-18 18:53:06 +08:00
int handCardListCount = turnManager.GetHandCardCount();
2025-11-18 02:08:07 +08:00
if (handCardListCount == 0) return;
float cardSpacing = handCardListCount switch // 动态调整卡牌间距
{
<= 4 => 0.5f / (handCardListCount + 1),
<= 5 => 0.75f / (handCardListCount + 1),
_ => 1f / (handCardListCount + 1)
};
float firstCardPosition = 0.5f - (handCardListCount - 1) * cardSpacing / 2; // 获取第一个卡牌的位置
Spline spline = splineContainer.Spline; // 获取曲线
draw_card();
return;
void draw_card()
{
for (int i = 0; i < handCardListCount; i++)
{
float position = firstCardPosition + i * cardSpacing;
Vector3 card_world_position = spline.EvaluatePosition(position); // 获取曲线指定位置的坐标
card_world_position += cardContainer.position;
Vector3 forward = spline.EvaluateTangent(position); // 获取曲线指定的切线方向
Vector3 up = spline.EvaluateUpVector(position); // 获取曲线指定的UP向量
Vector3 upwards = Vector3.Cross(up, forward).normalized; // 切线和向上的夹角计算方向
Quaternion rotation = Quaternion.LookRotation(up, upwards);
2025-11-18 19:22:47 +08:00
turnManager.GetHandCard(i).DrawCard(new STRUCT_TURN_CARD.LET_CARD_DEAL_SELF
2025-11-18 16:43:59 +08:00
{
ID = i,
POSITION = card_world_position,
ROTATION = rotation,
2025-11-18 22:26:13 +08:00
DURATION = move_duration,
2025-11-18 16:43:59 +08:00
LAYER_SORT_ORDER = i + 1,
SCALE = Vector3.one,
});
2025-11-18 02:08:07 +08:00
}
}
}
}