有了卡牌,当然少不了卡组。为了创建一个卡组,首先当然是有一大堆卡。为了一个卡牌库,我原本打算用数据库,不过还是懒了,先用excel撑着先。当然,一开始肯定没多少卡,姑且做个十来张再说。配套的还有对应的ui界面,先做一个先
--------------------------------------------------------分割线----------------------------------------------------------------
捣鼓了一会,大概整出来这么个东西,明白的朋友想必已经明白我做的是谁的同人了()
记得管理好场景文件,在左上角文件-生成设置中把当前场景加入编辑器
接下来给卡组编辑按钮添加一个点击事件,用来转到卡组编辑界面。为了方便管理,我们可以新建一个空对象,取名为changescene,给这个对象挂载一个脚本,里面根据场景的不同写不同的场景加载函数,这样就能仅仅使用一个对象来放到任意切换场景的按钮上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class changescene : MonoBehaviour
{
public void change_scene_deck()
{
SceneManager.LoadScene("deck_scene");
}
public void change_scene_start() {
SceneManager.LoadScene("start_scene");
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
-----------------------------------------------分割线-------------------------------------------------------------------------
既然要编辑卡组,当然要做一个能检索所有卡牌的列表。设想是进入卡组编辑界面后,卡牌列表读取卡牌文件信息,以卡牌的形式显现。对之前做的card预制体做一下修改,让它更方便地显示在列表中。
然后是做一个列表。找各种资料找了两天才做出来一个稍微满意的,这也是拖更的原因(X)
在Canvas中添加一个面板(Panel),命名为all_cards。面板中添加两个组件,分别是Scroll Rect和Mask。Scroll用来做滚动列表,Mask用来做遮罩,让超出列表的部分隐藏起来。
之后在面板上添加一个空物体,命名为content,用来规定卡牌显示范围,再在content下添加一个空物体,命名为parent,这个parent就是所有卡牌的父物体。另外再在面板上添加一个滚动条方便查看卡牌。注意下图,修改scroll rect中的内容,水平,viewport,垂直滚动条等属性
之后在parent中加入一个vertical layout group组件,可以把所有子物体作为一个列表排列。可以多加几个子物体试试,找到适合自己的位置和大小。
这就是我的卡牌列表。接下来就是写脚本,读取文件然后显示在列表中。
首先是被读取的数据形式,为了方便新建卡牌和管理,我使用excel创建,然后转csv格式来读取。
导出为带逗号的csv文件
注意csv格式最后有个回车,记得删掉,或者自己在写代码的时候注意。为了方便还是选择public的变量。卡牌文件名是card。
public GameObject parent;
public GameObject card_indeck;
public GameObject content;
public TextAsset all_card;
void GetCard()
{
int height = 562;
string[] datarow = all_card.text.Split("\n");
foreach (var item in datarow)
{
string[] carddata = item.Split(',');
if(carddata[0] == "id") {
continue;
}
//根据读取的数据新建卡牌
int.TryParse(carddata[0], out int id);
int.TryParse(carddata[1], out int cost);
string name = carddata[2];
int.TryParse(carddata[3], out int attack);
int.TryParse(carddata[4], out int defense);
int.TryParse(carddata[5], out int health);
int.TryParse(carddata[6], out int fakang);
string birth = carddata[7];
string career = carddata[8];
string force = carddata[9];
string race = carddata[10];
string skill = carddata[11];
GameObject a = Instantiate(card_indeck, transform.position, Quaternion.identity);//实例化物体
a.transform.Find("name").GetComponent<TextMeshProUGUI>().text = name;
a.transform.Find("attack").GetComponent<TextMeshProUGUI>().text = attack.ToString();
a.transform.Find("defense").GetComponent<TextMeshProUGUI>().text = defense.ToString();
a.transform.Find("fakang").GetComponent<TextMeshProUGUI>().text = fakang.ToString();
a.transform.Find("health").GetComponent<TextMeshProUGUI>().text = health.ToString();
a.transform.parent = parent.transform;//把实例化的物体放到父物体之下
//增加框框高度
height += 120;
content.GetComponent<RectTransform>().sizeDelta = new Vector2(125, height);
}
}
注意增加卡牌同时要增加content的高度,不然游戏中列表拖不下去。
贴一下整个文件的代码
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class showcard : MonoBehaviour
{
public GameObject parent;
public GameObject card_indeck;
public GameObject content;
public TextAsset all_card;
// Start is called before the first frame update
void Start()
{
GetCard();
}
// Update is called once per frame
void Update()
{
}
//读取所有卡片文件
void GetCard()
{
int height = 562;
string[] datarow = all_card.text.Split("\n");
foreach (var item in datarow)
{
string[] carddata = item.Split(',');
if(carddata[0] == "id") {
continue;
}
//根据读取的数据新建卡牌
int.TryParse(carddata[0], out int id);
int.TryParse(carddata[1], out int cost);
string name = carddata[2];
int.TryParse(carddata[3], out int attack);
int.TryParse(carddata[4], out int defense);
int.TryParse(carddata[5], out int health);
int.TryParse(carddata[6], out int fakang);
string birth = carddata[7];
string career = carddata[8];
string force = carddata[9];
string race = carddata[10];
string skill = carddata[11];
GameObject a = Instantiate(card_indeck, transform.position, Quaternion.identity);//实例化物体
a.transform.Find("name").GetComponent<TextMeshProUGUI>().text = name;
a.transform.Find("attack").GetComponent<TextMeshProUGUI>().text = attack.ToString();
a.transform.Find("defense").GetComponent<TextMeshProUGUI>().text = defense.ToString();
a.transform.Find("fakang").GetComponent<TextMeshProUGUI>().text = fakang.ToString();
a.transform.Find("health").GetComponent<TextMeshProUGUI>().text = health.ToString();
a.transform.parent = parent.transform;//把实例化的物体放到父物体weizhi之下
//增加框框高度
height += 120;
content.GetComponent<RectTransform>().sizeDelta = new Vector2(125, height);
}
}
}
运行截图:
文章来源:https://www.toymoban.com/news/detail-842002.html
预告一下,下一次做真正的卡组编辑。文章来源地址https://www.toymoban.com/news/detail-842002.html
到了这里,关于unity卡牌游戏开发记录(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!