15. 创建卡牌布局
1.02. 创建房间的 Prefab2.03. 设计地图配置表3.04. 生成地图上的房间4.07. 泛型事件框架5.08. 场景加载6.09. 保存地图场景7.10. 房间进出逻辑8.11. 制作卡牌 Prefab9.12. 创建卡牌数据类10.13. 对象池11.14. 制作卡牌库实现抽卡
12.15. 创建卡牌布局
13.16. 抽卡动画14.17. 实现卡牌扇形布局15.18. 实现鼠标事件16.19. 卡牌拖拽17.20. 攻击牌的拖拽指针18.21. 实现洗牌逻辑19.22. 导入Spine人物素材20.23. 人物基类代码21.24. 执行卡牌效果22.25. 制作血条的 UI Document23.26. 绑定血条数据24.27. 创建USS血条样式25.28. 制作 Gameplay Panel26.29. 绑定 Gameplay Panel 数据27.30. 回合转换28.31. 出牌能量判断29.32. 防御牌及 UI30.33. 回血的苹果牌及特效31.34. 增加力量牌及 UI32.35. 更多卡牌33.36. 人物动画34.37. 敌人意图 AI 逻辑35.38. 敌人的动画执行逻辑36.39. 对战胜负逻辑37.40. 制作胜利和抽卡面板38.41. 抽卡面板的实际逻辑39.42. GameOver 及 Menu 面板40.43. 实现休息房间的逻辑41.44. Boss 制作和整体流程42.45. 淡入淡出及打包游戏在项目中添加 CardLayoutManager
代码如下
using System.Collections.Generic;
using UnityEngine;
public class CardLayoutManager : MonoBehaviour
{
public bool isHorizontal;
// 摄像机的大小是6,分辨率是1920x1080,也就是说摄像机可以看到(-10.7,-6)~(10.7,6)的物体,这里让手牌的位置从-3.5~3.5
public float maxWidth = 7f;
// 卡牌与卡牌之间最大的间隔是2
public float cardSpacing = 2f;
// 中心点位置,表示卡牌在屏幕中的位置
public Vector3 centerPoint;
[SerializeField]
private List<Vector3> cardPositions = new List<Vector3>();
private List<Quaternion> cardRotations = new List<Quaternion>();
/// <summary>
/// 当一共有 totalCards 张卡牌的时候,计算出第 index 张卡牌的坐标和旋转
/// </summary>
/// <param name="index"></param>
/// <param name="totalCards"></param>
/// <returns></returns>
public CardTransform GetCardTransform(int index, int totalCards)
{
CalculatePositoin(totalCards, isHorizontal);
return new CardTransform(cardPositions[index], cardRotations[index]);
}
/// <summary>
/// 计算卡牌的位置
/// </summary>
/// <param name="numberOfCards">当前有多少张卡牌</param>
/// <param name="horizontal">横向还是扇形</param>
private void CalculatePositoin(int numberOfCards, bool horizontal)
{
// 首先要清理一下之前算好的位置
cardPositions.Clear();
cardRotations.Clear();
if (horizontal)
{
// 卡牌是横向排列的
// 一共有 numberOfCards 张卡牌,卡牌与卡牌之间的间距是 cardSpacing,那么它们之间的总间距是 currentWidth
float currentWidth = cardSpacing * (numberOfCards - 1);
// 如果卡牌太多超过 maxWidth 的话,就需要将最大宽度设置为 maxWidth
float totalWidth = Mathf.Min(currentWidth, maxWidth);
// 算出当前卡牌与卡牌之间的间距
float currentSpacing = totalWidth > 0 ? totalWidth / (numberOfCards - 1) : 0;
for (int i = 0; i < numberOfCards; i++)
{
// 让卡牌从最左边以此排过来
float xPos = 0 - totalWidth / 2 + currentSpacing * i;
var pos = new Vector3(xPos, centerPoint.y, 0);
var rotation = Quaternion.identity;
// 然后记录它们的位置和旋转
cardPositions.Add(pos);
cardRotations.Add(rotation);
}
}
}
}
其中使用CardTransform
来存储卡牌的位置和旋转
抽卡并调整位置
从牌堆中抽取一张卡牌之后,需要调整它们的位置
最终效果
抽一张牌之后变成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?