81 lines
2.9 KiB
C#
81 lines
2.9 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public class CardLayout : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
public List<GameObject> cardPrefabs; // 卡片预制体
|
|||
|
|
public Vector2 centerPosition = new Vector2(0, 100);
|
|||
|
|
public int cardNumber = 0;
|
|||
|
|
public float cardRotationAngle = 1f;
|
|||
|
|
public float fanShapeMaxRadius = 800f;
|
|||
|
|
public float fanShapeMaxAngle = 60f;
|
|||
|
|
private RectTransform card_container;
|
|||
|
|
private readonly string card_container_name = "CardContainer";
|
|||
|
|
private List<RectTransform> card_list = new List<RectTransform>(); // 存储当前所有卡片
|
|||
|
|
|
|||
|
|
private void Start()
|
|||
|
|
{
|
|||
|
|
card_container = transform.Find(card_container_name).GetComponent<RectTransform>();
|
|||
|
|
m_self_debug_create_card();
|
|||
|
|
m_self_set_card_layout_with_single();
|
|||
|
|
// m_self_debug_set_card();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void m_self_set_card_layout_with_single()
|
|||
|
|
{
|
|||
|
|
if (cardNumber / 2 == 0) return;
|
|||
|
|
if (cardNumber == 0) return;
|
|||
|
|
float halfAngle = fanShapeMaxAngle / 2f;
|
|||
|
|
for (int i = 0; i < cardNumber; i++)
|
|||
|
|
{
|
|||
|
|
// 均匀角度分布
|
|||
|
|
float t = (cardNumber == 1) ? 0.5f : (float)i / (cardNumber - 1);
|
|||
|
|
float angleDeg = -halfAngle + t * fanShapeMaxAngle;
|
|||
|
|
float angleRad = angleDeg * Mathf.Deg2Rad;
|
|||
|
|
|
|||
|
|
// 弧线坐标计算
|
|||
|
|
float x = fanShapeMaxRadius * Mathf.Sin(angleRad);
|
|||
|
|
float y = fanShapeMaxRadius * (1 - Mathf.Cos(angleRad));
|
|||
|
|
|
|||
|
|
// 应用到 UI 坐标
|
|||
|
|
Vector2 pos = centerPosition + new Vector2(x, y);
|
|||
|
|
card_list[i].anchoredPosition = pos;
|
|||
|
|
|
|||
|
|
// 设置旋转(Z 轴)
|
|||
|
|
float rotZ = -angleDeg * cardRotationAngle;
|
|||
|
|
card_list[i].localRotation = Quaternion.Euler(0, 0, rotZ);
|
|||
|
|
card_list[i].gameObject.SetActive(true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void m_self_set_card_layout_with_double()
|
|||
|
|
{
|
|||
|
|
if (cardNumber / 2 != 0) return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void m_self_debug_create_card()
|
|||
|
|
{
|
|||
|
|
// 从卡片预制体中随机选择卡牌按照数量插入到当前手牌中
|
|||
|
|
for (var i = 0; i < cardNumber; i++)
|
|||
|
|
{
|
|||
|
|
GameObject _game_object = Instantiate(cardPrefabs[UnityEngine.Random.Range(0, cardPrefabs.Count)]);
|
|||
|
|
RectTransform _rect_transform = _game_object.GetComponent<RectTransform>();
|
|||
|
|
_rect_transform.name = "Card" + i;
|
|||
|
|
_rect_transform.SetParent(card_container);
|
|||
|
|
_game_object.SetActive(false);
|
|||
|
|
card_list.Add(_rect_transform);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void m_self_debug_set_card()
|
|||
|
|
{
|
|||
|
|
GameObject _game_object = Instantiate(cardPrefabs[0]);
|
|||
|
|
RectTransform _rect_transform = _game_object.GetComponent<RectTransform>();
|
|||
|
|
_rect_transform.name = "Card0";
|
|||
|
|
_rect_transform.SetParent(card_container);
|
|||
|
|
_rect_transform.anchoredPosition = centerPosition;
|
|||
|
|
// _rect_transform.localRotation = Quaternion.Euler(0, 0, 0);
|
|||
|
|
}
|
|||
|
|
}
|