想要制作卡牌游戏,实现游戏基本功能的脚本是不可或缺的。接下来我将就实现卡牌游戏的一些基本脚本进行分析,以便于更好地理清逻辑思路。
卡牌游戏的基础功能之一——抽卡(Draw Cards)
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawCards : MonoBehaviour
{
public GameObject Card1; // 卡牌预制体
public GameObject PlayerArea1; // 玩家区域
public float cardSpacing = 0.3f; // 卡牌间距
void Start()
{
// 在这里可以放置任何你可能需要的初始化代码
}
public void OnClick()
{
int totalCards = 3; // 总卡牌数
float middleCardX = 0f; // 中轴线上的卡牌的X坐标
// 计算第一张卡牌的起始位置
float startX = middleCardX - ((totalCards - 1) * cardSpacing) / 2;
for (int i = 0; i < totalCards; i++)
{
// 计算当前卡牌的位置
float cardX = startX + i * cardSpacing;
Vector3 cardPosition = new Vector3(cardX, 0f, 0f);
// 实例化卡牌预制体,并设置其位置和旋转
GameObject playerCard = Instantiate(Card1, cardPosition, Quaternion.identity);
// 将卡牌的父级设置为玩家区域
playerCard.transform.SetParent(PlayerArea1.transform, false);
}
}
}
这个脚本的功能简述如下:
1.实例化预先设置好的Card1预制件
2.实现预制件Card1和预制件PlayerArea1的父级转换
3.通过计算使得卡牌保持正确的间距一字铺开
接下来我们将这三个功能逐步分析。
一、预制件Card1的实例化
当你尝试将两个预制件做父级转化时,你会发现由于unity独特的机制(即防止预制件数据异常),直接的父级转换是不被允许的,因此想要实现预制件的父级转换,必须要绕开unity的限制。此时将预制件实例化是一个不错的选择,通过代码
// 实例化卡牌预制体,并设置其位置和旋转
GameObject playerCard = Instantiate(Card1, cardPosition, Quaternion.identity);
// 将卡牌的父级设置为玩家区域
playerCard.transform.SetParent(PlayerArea1.transform, false);
我们可以正常地进行预制件之间的父级转换,当然凡事总有例外,如果这样做依然无法绕开unity的限制,我们还有另一种方法来绕开限制:在想要设置为该预制件的父级对象下创建一个空对象并将该空对象设置为该预制件的父级对象,此时由于该预制体已经实例化,且其父级对象是预制体下的空对象,再进行父级转换就不会报错。
二、卡牌的一字铺开
这个步骤与上面解决预制件的父级转换的方式有关,如果只需要实例化Card1脚本就可以绕开unity的限制,那么想要令生成的三张卡牌一字铺开只需要在Card1的父级对象中添加一个组件(Grid Layout Group)并进行简单设置如下
其中单元格大小即为卡牌大小,间距即为卡牌间距。此时卡牌就会按照你所设置的间距进行一字铺开。如果你非常不幸地采用了上述解决unity预制件限制的法二,那么令卡牌呈一字铺开达到法一的过程就会相对复杂,我们就需要通过脚本设置来实现我们的功能。
int totalCards = 3; // 总卡牌数
float middleCardX = 0f; // 中轴线上的卡牌的X坐标
// 计算第一张卡牌的起始位置
float startX = middleCardX - ((totalCards - 1) * cardSpacing) / 2;
for (int i = 0; i < totalCards; i++)
{
// 计算当前卡牌的位置
float cardX = startX + i * cardSpacing;
Vector3 cardPosition = new Vector3(cardX, 0f, 0f);
该部分程序的思路如下:
通过手动输入获取生成的卡牌数量,同时获得第二张卡牌在x轴上的位置从而以此为中轴线。接着,通过计算,确定了第一张卡牌的起始位置(startX
)。这里的计算是基于间距和总卡牌数量来的,目的是让卡牌能够在中轴线的两侧按照一定的间距排开。在接下来的循环中,程序针对每一张卡牌,计算了当前卡牌的X坐标(cardX
)。这是通过在起始位置上逐步增加间距得到的,以确保卡牌能够平均地排列在中轴线的两侧。然后,程序使用计算得到的卡牌位置(cardPosition
)以及恒定的Y和Z坐标,实例化了一个卡牌对象(playerCard
)。最后,将新生成的卡牌的父级设置为玩家区域(PlayerArea1
),这样卡牌就会显示在指定的区域内。
三、总结
通过上面的脚本设置,我们就能实现最基础的有关于卡牌游戏的抽卡功能实现。