unity学习笔记--day01

news2024/11/17 20:27:44

今天学习制作了一个简单的抽卡功能,学习结束后目录结构如下:
在这里插入图片描述
.mate文件是unity生成的配置文件,不用管

制作第一张卡片

  1. 创建一个空物体,改名为Card。
  1. 在Card下挂载以下UI组件:
    在这里插入图片描述
  2. 编写数据脚本并挂载,unity采用c#作为脚本语言。

3-1. 首先定义一个卡牌类,定义卡牌上通用的属性

public class Card {
    // 卡牌id
    public int id;
    // 卡牌名称
    public string cardName;
    // 卡牌描述
    public string direction;

    // 构造函数
    public Card(int _id, string _cardName, string _direction){
        this.id = _id;
        this.cardName = _cardName;
        this.direction = _direction;
    }
}

3-2. 定义一个怪物卡类,继承自卡牌类,添加独有的攻击力,最大生命和当前生命。同时定义一个魔法卡类,后续有魔法卡的专有属性时方便添加。

public class MonsterCard: Card {
    // 攻击力
    public int attack;
    // 当前生命值
    public int healthPoint;
    // 最大生命值
    public int healthPointMax;
    // 使用base调用父类的构造函数
    public MonsterCard(int _id, string _cardName, string _direction,int _attack, int _healthPointMax):base(_id, _cardName, _direction)
    {
        this.attack = _attack;
        this.healthPointMax = _healthPointMax;
        this.healthPoint = _healthPointMax;
    }

}

public class SpellCard: Card {
    // public string effect;

    public SpellCard(int _id, string _cardName, string _direction):base(_id, _cardName, _direction)
    {
        // this.effect = _effect;
    }
}
  1. 将数据类与视图想关联

定义一个脚本用于呈现数据,命名为CardDisPlay。
在类中定义相关的UI属性,并用Card中的数据对UI属性进行赋值。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CardDisplay : MonoBehaviour
{
    // UI相关的属性
    public Text nameText;
    public Text attackText;
    public Text healthText;
    // public Text effectText;
    public Text directionText;

    public Image backgroundImage;

    public Card card;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void ShowCard(){
        nameText.text = card.cardName;
        directionText.text = card.direction;
        if (card is MonsterCard)
        {
            var monster = card as MonsterCard;
            attackText.text = monster.attack.ToString();
            healthText.text = monster.healthPoint.ToString();

            // effectText.gameObject.SetActive(false);
        }
        else if (card is SpellCard)
        {
            var spell = card as SpellCard;
            // effectText.text = spell.effect;

            attackText.gameObject.SetActive(false);
            healthText.gameObject.SetActive(false);
        }
    }
}

  1. 将定义好的脚本组件挂载道卡片上,并将组件的属性与对应的UI关联。
    在这里插入图片描述
  1. 将做好的卡片保存为预制体。

抽卡场景

场景

unity通过划分场景来对游戏的页面进行划分,场景文件的后缀名为.sence

卡牌数据读取

定义一个空物体命名为CardStore,并定义一个名为CardStore的脚本文件,用来读取卡牌数据。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardStore : MonoBehaviour
{
    // 定义一个文本资源
    public TextAsset cardDate;
    // 定义链表,跟数组对比的好处是它不限制数量,添加和删除十分方便
    public List<Card> cardList = new List<Card>();
    // Start is called before the first frame update
    void Start()
    {
        LoadCardDate();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void LoadCardDate(){
        string[] dateRow = cardDate.text.Split('\n');
        foreach (var row in dateRow)
        {
            string[] rowArray = row.Split(',');
            if(rowArray[0] == "#"){
                continue;
            }
            else if(rowArray[0] == "monster"){
                // 新建怪兽卡
                int id = int.Parse(rowArray[1]);
                string name = rowArray[2];
                string direction = rowArray[3];
                int atk = int.Parse(rowArray[4]);
                int health  = int.Parse(rowArray[5]);

                MonsterCard monsterCard = new MonsterCard(id,name,direction,atk,health);
                cardList.Add(monsterCard);

                // Debug.Log("读取到怪兽卡:" + monsterCard.cardName);
            }
            else if(rowArray[0] == "spell"){
                // 新建魔法卡
                int id = int.Parse(rowArray[1]);
                string name = rowArray[2];
                string direction = rowArray[3];
                string effect = rowArray[4];
                SpellCard spellcard = new SpellCard(id,name,direction);
                cardList.Add(spellcard);

                // Debug.Log("读取到魔法卡:" + spellcard.cardName);
            }
        }
    }
	// 返回数据中的随机一张卡,后面抽卡时后用到
    public Card RandomCard(){
        Card card = cardList[Random.Range(0,cardList.Count)];
        return card;
    }
}

将脚本挂载到CardStore这个物体上,并将文本数据关联起来,就可以进行读取。
在这里插入图片描述

卡池

定义一个空物体并添加网格布局组件,用于展示抽到的卡。
在这里插入图片描述

抽卡脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OpenPackage : MonoBehaviour
{
    public GameObject cardPrefeb;

    CardStore CardStore;

    public GameObject cardpool;
    // Start is called before the first frame update
    void Start()
    {
        CardStore = GetComponent<CardStore>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void OnClickOpen(){
        for (int j = 0; j < cardpool.transform.childCount; j++) {
			Destroy (cardpool.transform.GetChild(j).gameObject);
		}
        for(int i = 0; i < 5; i++){
            

            // 使用预制体生成一个游戏对象
            GameObject newCard = GameObject.Instantiate(cardPrefeb, cardpool.transform);
            // 在这个预制体上挂载一个卡片属性,用来指代这张卡本身
            // GetComponent这个函数用来获取当前物体上的其他组件
            newCard.GetComponent<CardDisplay>().card = CardStore.RandomCard();
            newCard.GetComponent<CardDisplay>().ShowCard();
            // Debug.Log($"执行了");
        }
    }
}

按钮组件

按钮组件也是UI组件的一种,可以选择编写的组件中的方法作为点击事件。
在这里插入图片描述
将相关的物体关联好,这样在点击抽卡按钮时,就会随机在页面上展示5张卡片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx教程(4)—Keepalived

文章目录4.1 高可用集群架构Keepalived双机主备原理4.2 安装Keepalived4.3 Keepalived核心配置文件4.4 Keepalived实现双主机主备高可用测试4.5 高可用集群架构Keepalived双主热备原理Nginx教程一 Nginx教程二 Nginx教程三 4.1 高可用集群架构Keepalived双机主备原理 我们知道…

【计算机毕业设计】78.汽车租赁系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 目 录 摘 要 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术…

UnrealUBlueprintAsyncActionBase的使用

实现异步调用&#xff0c;之前我们介绍过一种FLatentActionInfo的方法&#xff0c;还有另外一种UBlueprintAsyncActionBase方法&#xff0c;可以实现异步节点&#xff0c;用于异步监听然后进行回调。按照如下步骤进行使用&#xff0c;我们同样以Delay一定帧数&#xff0c;并每帧…

面对新技术,必须找到与其发展相辅相成的长期主义的方法

从Meta股价的一路走低到扎克伯格发布的头显并不被用户买账&#xff0c;Facebook全力拥抱Meta正在经历一场过山车。   扎克伯格和他所带领下的Meta遭遇到的如此多的困境和难题&#xff0c;越来越多地让我们开始相信&#xff1a;所谓的元宇宙并非是一蹴而就的&#xff0c;它是一…

【云原生 Kubernetes】基于 Minikube 搭建第一个k8s集群

一、前言 对于k8s来说&#xff0c;搭建方式有多种&#xff0c;如果是生产环境&#xff0c;一般来说&#xff0c;至少需要3台节点确保服务的高可用性&#xff0c;常用的搭建方式列举如下&#xff08;提供参考&#xff09;&#xff1a; kubeadm搭建&#xff08;推荐&#xff09; …

postman测试环境的创建及发送请求方式

目录 一、创建工作环境 1、打开postman&#xff0c;点击工作区 2、点击新建 3、添加名字&#xff0c;点击创建 4、工作区可以自由切换工作区 5、点击创建发送请求 6、更换请求方式 7、保存测试 二、测试发送请求&#xff0c;使用的时候服务一定要启动 1、普通传参&…

C++ 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C&#xff1a;命名的强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c…

信息学奥赛一本通——1163:阿克曼(Ackmann)函数

文章目录1163&#xff1a;阿克曼(Ackmann)函数【题目描述】【输入】【输出】【输入样例】【输出样例】分析代码1163&#xff1a;阿克曼(Ackmann)函数 时间限制:1000ms内存限制:65536KB提交数:24804通过数:20247时间限制: 1000 ms 内存限制: 65536 KB 提交数: 24804 通过数: 202…

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现 文章目录第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现模块的文件格式EXPORT_SYMBOL的实现模块的文件格式 以内核模块形式存在的驱动程序&#xff0c;比如demodev.ko&#xff0c;其在文件的数据组织形式上是ELF&am…

数据结构---快速排序

快速排序分治法思想基准元素的选择元素交换双边循环法JAVA实现单边循环法JAVA实现快速排序也是从冒泡排序演化而来使用了 分治法&#xff08;快的原因&#xff09;快速排序和冒泡排序共同点&#xff1a;通过元素之间的比较和交换位置来达到排序的目的。 快速排序和冒泡排序不同…

JavaWeb核心:HTTPTomcatServlet

HTTP 概念: Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 HTTP-请求数据格式 HTTP-响应数据格式 响应状态码的大的分类 常见的响应状态码 Tomcat 简介 概念: Tomcat是Apache 软件基金会一个核心项目&#…

【云原生】Prometheus 自定义告警规则

文章目录一、概述二、告警实现流程三、告警规则1&#xff09;告警规则配置1&#xff09;监控服务器是否在线3&#xff09;告警数据的状态四、实战操作1&#xff09;下载 node_exporter2&#xff09;启动 node_exporter3&#xff09;配置Prometheus加载node_exporter4&#xff0…

这样也可以让图像正向扩散

🍿*★,*:.☆欢迎您/$:*.★* 🍿 怎样的扩散取决于b是不是随机噪声 是随机噪声 则是扩散模型 如stable diffision 如果是非噪声则是方向模型 方向模型是指 在已知几个连续的输入 后可以通过模型的辅助预测扩散的方向 而 stable diffision 是通过预测反扩散方向 本质就…

VS2017中OpenCV编程插件Image Watch安装和使用介绍

安装 下载适合vs2017最新版本的Image Watch(ImageWatch.vsix)&#xff0c;下载地址 安装ImageWatch&#xff0c;双击ImageWatch.vsix进行安装即可&#xff1b; 使用 打开一个OpenCV工程&#xff0c;在Debug下设置断点&#xff0c;通过view -> other windows -> Image W…

基于51单片机宠物自动投料喂食器控制系统仿真设计( proteus仿真+程序+讲解视频)

基于51单片机宠物自动投料喂食器控制系统仿真设计( proteus仿真程序讲解视频&#xff09; 仿真图proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0029 视频讲解 基于51单片机的宠物自动投料喂食器控制系统proteu…

数据结构—最小生成树

目录 一、生成树 二、最小生成树&#xff08;代价最小树&#xff09; 三、求最小生成树 1、Prim算法&#xff08;普里姆&#xff09; 2.Kruskal 算法&#xff08;克鲁斯卡尔&#xff09; 3.Prim算法和Kruskal算法对比 一、生成树 连通图的生成树是包含图中全部顶点的一个…

[附源码]Nodejs计算机毕业设计基于框架的秧苗以及农产品交易网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

算法分析专业工具——大O记法

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 写在前面 从之前的章节中我们了解到&#xff0c;影响算法性能的主要因素是其所需的步数。 然而&#xff0c;我们不能简单地把一个算法记为“…

Postman下载,安装,汉化,注册及登录教程

目录 一、Postman简介 二、Postman的注册 1、首先下载Postman&#xff0c;进入官网&#xff1a;Download Postman | Get Started for Free 2、安装Postman 3、下载汉化包 4、找到所下载的app.zip文件&#xff0c;将文件进行解压&#xff0c;放置到此路径下 Postman\app9…

代码随想录Day52|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

文章目录300.最长递增子序列674.最长连续递增序列718.最长重复子数组300.最长递增子序列 文章讲解&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整数数组 nums…