unity卡牌游戏开发记录(2)

有了卡牌,当然少不了卡组。为了创建一个卡组,首先当然是有一大堆卡。为了一个卡牌库,我原本打算用数据库,不过还是懒了,先用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);
        }
    }
}

运行截图:

预告一下,下一次做真正的卡组编辑。

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity卡牌游戏开发通常需要以下几个步骤。首先,需要确定需求,包括需要一个存放Sprite的数组用于赋值,并修改代码以随机生成卡牌的封面。其次,新建一个空物体并创建一个名为SceneController的脚本。在这个脚本中,我们可以定义卡牌的预制体和一些参数,如最大卡牌数、每行最大卡牌数和相邻卡牌的间隔。接着,在createCards()方法中使用Instantiate函数实例化卡牌预制体,并按照设定的间隔位置将卡牌分布在场景中。最后,在Start()方法中调用createCards()方法来生成卡牌[2]。 在这个过程中,我们选择了使用SceneController动态生成一个数组来给不同的卡牌赋值的方法。这样做的好处是不同的卡牌只有图片一个属性不同,通过动态生成数组来给卡牌赋值可以避免一个个手动拖拽预制体到对应的位置上赋值的麻烦。这种方法简化了开发过程,提高了开发效率。 总结起来,Unity卡牌游戏开发可以通过确定需求、修改代码以随机生成卡牌封面、创建一个SceneController脚本来管理卡牌的生成和赋值。这样的开发流程能够简化开发过程并提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Unity实现简单卡牌游戏框架](https://blog.csdn.net/LuLou_/article/details/115191300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值