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

这篇具有很好参考价值的文章主要介绍了unity卡牌游戏开发记录(4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

咕咕咕,鸽了好久,今天来继续我们的游戏开发

今天实现的内容是把卡牌加入卡组,从文件读取卡组,从卡组删除卡牌,把卡组保存到文件中。

---------------------------------------------------分割线---------------------------------------------------------------------

首先是卡牌加入卡组。上一期我们实现了加载所有卡牌列表,现在我想要点击某张卡牌时它能够加入到卡组中。那么我们先新建一个卡组ui,用来显示卡组中的卡牌。

卡牌游戏开发,unity,游戏引擎

大概这样。我们需要卡牌按一定的规则排列好,方便检查卡组,所以在卡组对象下挂一个空对象,给它加一个Grid Layout Group组件,这样可以让它的子对象以表格的显示显示。

卡牌游戏开发,unity,游戏引擎卡牌游戏开发,unity,游戏引擎

约束计数就是一行放多少个子对象。上面的数据自己看着填就行。

接下来要做的事情很简单:点击卡牌列表的卡牌时,新建一个子对象挂在deck_parent上。首先我们把card_inlist预制体复制一下,后面还得做个卡组中的卡牌。因为需要增加点击事件,所以在预制体中增加一个空对象,在上面挂一个脚本,脚本里写一个public的函数,然后给预制体增加点击事件,把这个空对象放到点击事件中,右侧选择刚刚写的函数即可。我写的函数名字是PushCard

卡牌游戏开发,unity,游戏引擎卡牌游戏开发,unity,游戏引擎卡牌游戏开发,unity,游戏引擎

可以在PushCard函数中写个debug测试一下能不能正常触发事件。

思考一下,我们要往卡组里增加卡牌,如何表示卡组中的卡牌数量呢,有两种方法,一是有多少张就显示多少张,二是在卡牌上显示一个数字,表示卡组里面的这张卡牌已经有多少张了。为了方便,我选择了第二种。因此,我们要用到刚刚复制出来的预制体。

把复制出来的预制体改名为Card_indeck,表示这个卡牌预制体是用来在卡组中显示的。给它添加一个新的空对象名为nums,方便管理卡牌数量。其实在随便一个预制体的脚本增加一个public的变量也行,只要会调用就行。在nums下面挂一个text组件,用来存储和显示数量。

接下来回到PushCard函数,首先获取所有卡牌列表,方便添加卡牌到卡组中。然后获取卡组当前卡牌列表,如果点击的卡牌的id不存在于卡组中,那么新建一个卡牌对象放入卡组;如果存在,就传入id,调用Card_indeck的脚本把对应id的卡牌的nums加一。(这个函数等下讲)

 public void PushCard()
 {
     Cardlist = GameObject.Find("parent").GetComponent<showcard>().card_informations_list;
     //把卡牌加入卡组,按下按钮后再保存

     //Debug.Log(transform);
     //Debug.Log("PushCard");
     //首先读取DeckScript的卡牌列表
     int id = transform.parent.GetComponent<saveCardInformation>().id;//踩坑,这个脚本放在了子物体上,导致一开始找不到指定的脚本
     
     if (GameObject.Find("deck_parent").GetComponent<DeckScript>().deck[id] != null)
     {
         //获取卡牌数量,转为int类型然后加一
         string nums_string = GameObject.Find("deck_parent").GetComponent<DeckScript>().deck[id].transform.Find("nums").GetComponent<TextMeshProUGUI>().text;
         int.TryParse(nums_string, out int nums);
         nums++;
         GameObject.Find("deck_parent").GetComponent<DeckScript>().deck[id].transform.Find("nums").GetComponent<TextMeshProUGUI>().text=nums.ToString();
     }
     else
     {
         //如果当前卡组没有这张卡牌,调用函数新建卡牌
         GameObject.Find("deck_parent").GetComponent<DeckScript>().AddToParent(id,Cardlist,true);
     }

 }

好了,让我们回到卡组。为了读取卡组文件,在deck对象下挂一个脚本,读取卡组文件并生成卡牌显示在卡组框中。

private int[] Cards=new int[100];//下标就是卡牌编号,数组数字就是下标id的卡牌的数量
public TextAsset DeckText;//卡组文件
public GameObject card_indeck;//卡组卡牌预制件
public GameObject[] deck;//卡组卡牌数组

首先是读取文件。这里我用的是public的textassest变量,可以在unity中把文本文件放到上面。根据逗号来分割每一行的内容。卡组文件只需要存储id和数量num就行。csv文件最后有一个回车,如果读取到最后一行,说明item的长度是0,直接跳过。id和num已经存入数组Cards,可以在其他函数直接调用。

void GetDeckFile()
{
    //string path_root = Directory.GetCurrentDirectory()+ "/Assets/deck/deck.csv";
    string[] datarow = DeckText.text.Split("\n");
    foreach (var item in datarow)
    {
        if (item.Length == 0)
        {
            continue;
        }
        string[] carddata = item.Split(',');
        if (carddata[0] == "id")
        {
            continue;
        }

        int.TryParse(carddata[0], out int id);
        int.TryParse(carddata[1], out int num);

        Cards[id] = num;
    }
}

然后是把刚刚拿到的数组变成ui显示出来,函数根据id来读取之前初始化好的卡牌列表,把每一张卡牌的信息存入实例化的卡牌中,这样子就可以让卡牌信息显示出来。其中的bool isadd用来判断是添加卡牌还是卡牌数量加一。添加卡牌就是上面写的,点击卡牌往卡组添加。

void LoadDeck()
{
    //先读取所有卡牌的文件
    List<Card_information> Cardlist = new();
    Cardlist = GameObject.Find("parent").GetComponent<showcard>().card_informations_list;
    //遍历卡组列表
    for (int id = 1; id < Cards.Length; id++)
    {
        //如果卡牌数量为0则不显示
        if (Cards[id] == 0)
        {
            continue;
        }
        //生成卡牌并作为子对象放在deck下
        AddToParent(id, Cardlist,false);
    }
}
 //把卡牌显示在卡组中额外写一个函数,方便其他脚本调用
 public void AddToParent(int id, List<Card_information> Cardlist,bool IsAdd)
 {
     
     GameObject a = Instantiate(card_indeck, transform.position, Quaternion.identity);//实例化物体
     a.transform.Find("name").GetComponent<TextMeshProUGUI>().text = Cardlist[id - 1].name;
     a.transform.Find("attack").GetComponent<TextMeshProUGUI>().text = Cardlist[id - 1].attack.ToString();
     a.transform.Find("defense").GetComponent<TextMeshProUGUI>().text = Cardlist[id - 1].defense.ToString();
     a.transform.Find("fakang").GetComponent<TextMeshProUGUI>().text = Cardlist[id - 1].fakang.ToString();
     a.transform.Find("health").GetComponent<TextMeshProUGUI>().text = Cardlist[id - 1].health.ToString();
     a.transform.Find("Character_image").GetComponent<Image>().sprite = Cardlist[id - 1].Character.sprite;//因为cardlist是从零开始,所以减一
     if(IsAdd)
     {
         Cards[id]++;
     }
     a.transform.Find("nums").GetComponent<TextMeshProUGUI>().text = Cards[id].ToString();
     a.transform.parent = this.transform;
     //把实例化的物体加入数组,方便修改
     //UnityEngine.Debug.Log(deck.Length);
     deck[id] = a;
     
     Saveinformation(a, Cardlist[id - 1].id, Cardlist[id - 1].cost, Cardlist[id - 1].name, Cardlist[id - 1].attack, Cardlist[id - 1].defense, Cardlist[id - 1].health, Cardlist[id - 1].fakang, Cardlist[id - 1].birth, Cardlist[id - 1].career, Cardlist[id - 1].force, Cardlist[id - 1].race, Cardlist[id - 1].description, Cardlist[id - 1].Character);
 }
//用来保存卡牌信息,方便显示
void Saveinformation(GameObject a, int _id, int _cost, string _name, double _attack, double _defense, float _health, double _fakang, string _birth, string _career, string _force, string _race, string _des, UnityEngine.UI.Image _ch)
{
    a.GetComponent<saveCardInformation>().id = _id;
    a.GetComponent<saveCardInformation>().cost = _cost;
    a.GetComponent<saveCardInformation>().cardname = _name;
    a.GetComponent<saveCardInformation>().attack = _attack;
    a.GetComponent<saveCardInformation>().defense = _defense;
    a.GetComponent<saveCardInformation>().health = _health;
    a.GetComponent<saveCardInformation>().fakang = _fakang;
    a.GetComponent<saveCardInformation>().birth = _birth;
    a.GetComponent<saveCardInformation>().career = _career;
    a.GetComponent<saveCardInformation>().force = _force;
    a.GetComponent<saveCardInformation>().race = _race;
    a.GetComponent<saveCardInformation>().description = _des;
    a.GetComponent<saveCardInformation>().Character = _ch;
}
   

然后是删除卡牌,这个很简单,点击卡组中的卡牌触发删除函数,num-1,如果num=0,就销毁卡牌实例。随便在卡牌的脚本中写一个简单的销毁函数。

public void deleteself()
{
    Destroy(gameObject);
}

如法炮制,给卡组的卡牌弄一个删除按钮函数

public void DeleteButton()
{
    Debug.Log(transform.parent);
    string num=transform.parent.Find("nums").GetComponent<TextMeshProUGUI>().text;
    int.TryParse(num, out int num_int);
    num_int--;
    if(num_int == 0)
    {
        transform.parent.GetComponent<show_in_deckedit>().deleteself();
    }
    else
    {
        transform.parent.Find("nums").GetComponent<TextMeshProUGUI>().text=num_int.ToString();
    }
}

最后就是保存卡组。

public void SaveDeckFuntion()
{
    //根据tag获取卡组中的卡牌对象
    GameObject[] CardDeckList = GameObject.FindGameObjectsWithTag("CardInDeck");
    using (StreamWriter sw = new(@"Assets\deck\deck.csv"))
    {
        foreach (GameObject card in CardDeckList)
        {
            //获取每一张卡牌的id和nums
            string num_str = card.transform.Find("nums").GetComponent<TextMeshProUGUI>().text;
            int id = card.transform.GetComponent<saveCardInformation>().id;


            //把id和nums写入csv文件
            string csv_str = id.ToString() + "," + num_str;
            sw.WriteLine(csv_str);
        }

    }
    
}

至此,卡组编辑界面已经差不多完成。检索卡牌还没做,以后有机会再实现吧。接下来就是实现战斗了。文章来源地址https://www.toymoban.com/news/detail-860094.html

到了这里,关于unity卡牌游戏开发记录(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(72)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(62)
  • 【用unity实现100个游戏之7】从零开始制作一个仿杀戮尖塔卡牌回合制游戏(附项目源码)

    参考原视频链接: 【视频】:https://www.bilibili.com/video/BV1eF41177hu/ 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月08日
    浏览(110)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(76)
  • 吐槽laya:H5小游戏开发应该用什么引擎好?laya、cocos还是unity?

    我看有人推荐laya,放在H5小游戏的前三排名,这压根不靠谱。 laya只能算个半成品,整体非常垃圾,如果是首次选择游戏引擎,至少转去cocos,实在选laya,那也没办法了。 下面说说laya有什么问题,如果只是一些简单的bug什么的,我是不会花这个时间吐槽的,但是如下的问题实

    2024年02月13日
    浏览(60)
  • 游戏开发常用引擎工具介绍对比区别(UE4,Unity,Cocos,LayaAir,[egret-白鹭])

    是一套为开发实时技术而存在的引擎工具。目前广泛应用于3D建模渲染、游戏开发中。它完善的工具套件以及简易的工作流程能够使开发者快速修改或查看成果,对于代码的依赖性很低。而完整公开的源代码则能让使用者自由修改和扩展引擎功能。 是面向开发人员的 3D/2D 游戏

    2024年02月13日
    浏览(62)
  • Unity微信小游戏使用微信云开发记录

    最近项目上架微信小游戏,首先使用了微信官方sdk转成微信小游戏,官方地址如下: https://github.com/wechat-miniprogram/minigame-unity-webgl-transform 官方给了各种指导,虽然都有但是都不太精哈哈 因为要做排行榜,云存档,而我司没服务器,那只能用微信云开发了。具体开通啥的初始

    2023年04月09日
    浏览(52)
  • C语言与游戏引擎插件开发:Unity、Unreal Engine中C插件的编写与集成(四)

    目录 一、C插件开发最佳实践与常见问题解析 性能优化: 跨平台兼容性: 版本管理与升级: 二、结论 C语言在游戏引擎插件开发中的关键作用与优势: 对开发者提出建议: 性能优化: 内存管理: 智能指针 :利用UE的 TSharedPtr 、 TWeakPtr 等智能指针管理动态内存,确保资源释

    2024年04月27日
    浏览(52)
  • C语言与游戏引擎插件开发:Unity、Unreal Engine中C插件的编写与集成(一)

    目录 一、引言 C语言在游戏开发中的重要地位与优势 游戏引擎插件机制与C语言的价值 二、C语言基础与游戏开发特性 C语言核心特性及其在游戏开发中的应用 游戏引擎API对接关键概念与技巧 C语言在游戏开发领域占据着无可替代的重要地位,尤其在应对高性能计算需求与底层

    2024年04月29日
    浏览(68)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包