文章目录

  • 一、实现效果
  • 二、实现过程
    • 1. 想法
    • 2. 创建对象
    • 3. 编写脚本ManaPool.cs
      • ① get、set访问器
      • ② 最大法力值
      • ③ 可用法力值
      • ④ update测试
    • 3. ManaPoolVisual.cs完整代码
  • 三、参考资料

素材来源:影之诗国服大百科

内容简介:本篇主要介绍法力池的创建以及如何实现视觉特效


一、实现效果

在大多数卡牌游戏中,都有法力值的设定:

  1. 分为最大法力值,和当前回合可用法力值。
  2. 最大法力值每回合都会增加1点,直到10点为止。
  3. 使用卡牌消耗相应当前回合法力值,每回合会回复所有。

于是可以实现如下效果

二、实现过程

1. 想法

要实现该效果,分析需要的对象:

  1. 存放法力值的框(ManaPool)
  2. 法力值(Ball)
  3. 显示法力值的文字(ManaIcon)

2. 创建对象

① 创建ManaPool对象,并在其之下创建Canvas,将其调整到世界坐标。

② 在Canvas下创建Panel改变背景图片,创建表示法力值的文字

③ 创建Manas和Ball(用来放置法力球)

给Ball添加法力球图片

给Manas添加自动布局组件

将Child Alignment改为Middle Left

④ 将Ball对象复制到10个,最后效果为

⑤ 给ManaPool添加控制脚本ManaPool.cs

3. 编写脚本ManaPool.cs

主要需要改变的值为两个:最大法力值本回合可用法力值

关于法力球的显示效果,可以通过更改对象的RGBA来实现,即分为:clear(不显示)、gray(不可用)、white(可用)。

可以用get、set访问器来操作需要改变的两个值。

① get、set访问器

可以用get、set访问器来对值赋值取值操作时进行逻辑判断等操作

  • 1.get{}

    get 访问器,用于获取属性的值,需要在 get 语句最后使用 return 关键字返回一个与属性数据类型相兼容的值。

    若在属性定义中省略了该访问器,则不能在其他类中获取私有类型的字段值,因此也称为只写属性。

  • 2.set{}

    set 访问器用于设置字段的值,这里需要使用一个特殊的值 value,它就是给字段赋的值。

    在 set 访问器省略后无法在其他类中给字段赋值,因此也称为只读属性。

    通常属性名的命名使用的是 Pascal 命名法,单词的首字母大写,如果是由多个单词构成,每个单词的首字母大写。

    由于属性都是针对某个字段赋值的,因此属性的名称通常是将字段中每个单词的首字母大写。例如定义了一个名为 name 的字段,属性名则为 Name。

② 最大法力值

设置int型变量

 private int totalCrystals; // 总法力值

取值时,可以直接返回该值:

public int TotalCrystals
{...get{ return totalCrystals; }...
}

赋值时,需要判断法力值是否超过的临界值(可以用法力球对象的最大数量来表示):

 set{//Debug.Log("Changed total mana to: " + value);if (value > Crystals.Length) // 如果设置的法力值超过规定上限,则设置为上限totalCrystals = Crystals.Length;else if (value < 0) // 如果设置的法力值低于0,则设置为0totalCrystals = 0;elsetotalCrystals = value;...
}

数值调整完毕后,需要对法力球对象和文字进行操作使其正确显示:

for (int i = 0; i < Crystals.Length; i++){// clear:不显示状态,gray:不可用状态// 增长法力值(从(0,0,0,0)设置为(0.5,0.5,0.5,1))if (i < totalCrystals){if (Crystals[i].color == Color.clear)Crystals[i].color = Color.gray;}elseCrystals[i].color = Color.clear;}// 更新文字ProgressText.text = string.Format("{0}/{1}", availableCrystals.ToString(), totalCrystals.ToString());
}

③ 可用法力值

可用法力值的实现可以参考最大法力值

    private int availableCrystals; // 可用法力值public int AvailableCrystals{get{ return availableCrystals; }set{//Debug.Log("Changed mana this turn to: " + value);// 可用法力值不会超过总法力值if (value > totalCrystals)availableCrystals = totalCrystals;else if (value < 0)availableCrystals = 0;elseavailableCrystals = value;for (int i = 0; i < totalCrystals; i++){// white:可用状态 gray:不可用状态if (i < availableCrystals) // 激活可用法力值Crystals[i].color = Color.white;elseCrystals[i].color = Color.gray;}// 更新文字ProgressText.text = string.Format("{0}/{1}", availableCrystals.ToString(), totalCrystals.ToString());}}

④ update测试

最后在update中,只要对两个数值进行赋值操作,就会自动执行set访问器中的代码,从而达到相应效果。

void Update(){TotalCrystals = TestTotalCrystalsThisTurn;AvailableCrystals = TestFullCrystals;}

3. ManaPoolVisual.cs完整代码

using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class ManaPoolVisual : MonoBehaviour {public int TestFullCrystals; // 可用法力值public int TestTotalCrystalsThisTurn; // 本回合总法力值public Image[] Crystals; // 法力球数组public Text ProgressText; // 法力表示文字private int totalCrystals; // 总法力值public int TotalCrystals{get{ return totalCrystals; }set{//Debug.Log("Changed total mana to: " + value);if (value > Crystals.Length) // 如果设置的法力值超过规定上限,则设置为上限totalCrystals = Crystals.Length;else if (value < 0) // 如果设置的法力值低于0,则设置为0totalCrystals = 0;elsetotalCrystals = value;for (int i = 0; i < Crystals.Length; i++){// 增长法力值(从(0,0,0,0)设置为(0.5,0.5,0.5,1))if (i < totalCrystals){if (Crystals[i].color == Color.clear)Crystals[i].color = Color.gray;}elseCrystals[i].color = Color.clear;}// 更新文字ProgressText.text = string.Format("{0}/{1}", availableCrystals.ToString(), totalCrystals.ToString());}}private int availableCrystals; // 可用法力值public int AvailableCrystals{get{ return availableCrystals; }set{//Debug.Log("Changed mana this turn to: " + value);// 可用法力值不会超过总法力值if (value > totalCrystals)availableCrystals = totalCrystals;else if (value < 0)availableCrystals = 0;elseavailableCrystals = value;for (int i = 0; i < totalCrystals; i++){if (i < availableCrystals) // 激活可用法力值Crystals[i].color = Color.white;elseCrystals[i].color = Color.gray;}// 更新文字ProgressText.text = string.Format("{0}/{1}", availableCrystals.ToString(), totalCrystals.ToString());}}void Update(){TotalCrystals = TestTotalCrystalsThisTurn;AvailableCrystals = TestFullCrystals;}}

三、参考资料


1. C#值GET、 SET用法 —— 雨夜潇潇

2. Microsoft官方 C# 文档

2.2 法力池的创建和视觉特效———自制卡牌游戏之旅相关推荐

  1. 2.1 随从图标的创建———自制卡牌游戏之旅

    文章目录 一.实现效果 二.实现过程 1. 参考卡牌的创建 2. 还需要修改的部分 素材来源:影之诗国服大百科 内容简介:本篇主要介绍随从图标的建立 一.实现效果 当玩家将随从卡牌置入战场后,会诞生一 ...

  2. 1.1 卡牌对象的创建———自制卡牌游戏之旅

    文章目录 一.完整卡牌对象展示 二.创建过程(以技能卡为例) 素材来源:影之诗国服大百科 内容简介:本篇主要介绍卡牌基础对象的构成 一.完整卡牌对象展示 技能卡 随从卡 二.创建过程(以技能卡为例) ...

  3. Unity创建游戏VFX视觉特效-初级到中级

    MP4 |视频:h264,1280×720 |音频:AAC,44100 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.36 GB |时长:4h 17m 本课程是关于用Uni ...

  4. 谈谈java的线程池(创建、机制)

    目录 Executors创建线程池默认方法 自定义线程池 Executors创建线程池默认方法 newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当 ...

  5. java(线程池的创建方式,和线程池的原理)

    1.为什么要使用线程池:   减少资源消耗,通过重复的使用已创建好的线程,避免了线程的频繁创建和销毁所造成的消耗 提高响应速度,当任务到达的时候,不需要再去创建,可以直接使用已经创建好的线程就能立即执 ...

  6. Java同步—线程池的创建和使用

    线程池 构建一个新的线程是有一定代价的,因为涉及到与操作系统的交互.如果程序中需要使用大量生命周期很短的线程,就应该使用线程池. 将Runnable对象交给线程池来执行,就会有一个线程调用run方法, ...

  7. nodeJS+mysql+连接池——连接池的创建和使用

    nodeJS+mysql+连接池--连接池的创建和使用 https://www.cnblogs.com/shenlonghun/p/6133963.html 介绍 在 软件工程 , 连接池 是一个 高 ...

  8. 线程池的创建及参数设置详解

    一. 常见线程池 线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池. 首先我们来看通过Executors 创建的线程池 ...

  9. 【Cocos2d-x】视线和光线:如何创建 2D 视觉范围效果

    [Cocos2d-x]视线和光线:如何创建 2D 视觉范围效果 云里来.雾里去2014-10-20 12:10:383557 次阅读 Android客户端下载:sight_and_light-debu ...

最新文章

  1. cache老化时间的思考--以nat为例
  2. LaTeX技巧006:使用pdfLaTeX时,添加PDF文件属性的方法
  3. es索引的RestHighLevelClient实现
  4. 14/100. Merge Two Sorted Lists
  5. 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
  6. 【单片机实验】矩阵键盘
  7. 人是什么垃圾?AI识别功能用到垃圾分类上时 网友试了试“扫自己”
  8. 【LeetCode】15.Longest Common Prefix
  9. java连接数据库的基本操作
  10. 小程序 params_08. 小程序项目实战:设置首页轮播图(3)
  11. 爱普生l360扫描仪显示无法连接计算机,USB连接喷墨机,启动Epson scan提示无法与扫描仪连接如何解决?...
  12. MOV 和MOVS 这两条指令有什么区别?
  13. c语言文件指针重新定向,C语言rewind()函数:将文件指针重新指向文件开头
  14. mybatis学习4
  15. java毕业设计招聘管理系统Mybatis+系统+数据库+调试部署
  16. http:网易云音乐
  17. perl安装不全导致的Can't locate Time/HiRes.pm in @INC错误的处理方法
  18. Obsidian 插件(一):DataView 的使用
  19. 烤仔万花筒 | Bounty v2.0公测版上线
  20. 让div水平居中的7种方法

热门文章

  1. ADB修改mumu模拟器分辨率
  2. aftershokz蓝牙搜不到_硬核!小程序时怎么控制蓝牙设备的?
  3. matlab中双x轴,【转】MATLAB:双X轴曲线绘图
  4. python3的基本数据类型_python3基本数据类型
  5. 关于requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题
  6. 构建linux图形安装程序,Scientific Linux 5.5 图形安装教程
  7. 会议介绍:国际会议级别
  8. php 红包算法教程,php仿微信红包分配算法的实现方法
  9. 生活随记 - 清明时节特想老爸老妈
  10. 二分查找的左右逼近法