文章目录

  • 一、前言
  • 二、导入游戏界面UI素材
  • 三、制作游戏界面UI预设
  • 四、事件管理器
  • 五、编写GameMainPanel.cs脚本
  • 六、游戏管理器添加金币逻辑
  • 七、加金币
  • 八、跳跃事件
  • 九、运行测试

一、前言

嗨,大家好,我是新发。
我打算写一篇使用Unity制作像天天酷跑一样的游戏的教程,会按功能点分成多篇文章来讲,希望可以帮助一些想学Unity的同学。
注:我使用的Unity版本是2020.1.14f1c1。

文章目录:
第一篇:人物动画序列帧
第二篇:使用Animator控制跑酷角色的动画状态切换
第三篇:跑酷地面制作
第四篇:使用脚本控制跑酷角色
第五篇:游戏结束与重新开始
第六篇:金币创建与吃金币
第七篇:游戏界面的基础UI

本工程的Demo工程,我已上传到GitHub,感兴趣的同学可以自己下载下来学习。
https://github.com/linxinfa/UnityParkourGameDemo

本节我将讲下游戏界面的基础UI的实现,本节的效果:

二、导入游戏界面UI素材

把游戏界面UI素材导入到工程中。

三、制作游戏界面UI预设

制作游戏界面UI预设:GameMainPanel.prefab

四、事件管理器

为了方便逻辑与UI之间的控制,我们弄一个事件管理器,通过事件来降低逻辑与UI之间的耦合度。

using UnityEngine;
using System.Collections.Generic;public delegate void MyEventHandler(params object[] objs);public class EventManager
{/// <summary>/// 注册事件/// </summary>/// <param name="evt">事件名</param>/// <param name="handler">响应函数</param>public void Regist(string evt, MyEventHandler handler){if (handler == null)return;if (listeners.ContainsKey(evt)){//这里涉及到Dispath过程中反注册问题,必须使用listeners[type]+=..listeners[evt] += handler;}else{listeners.Add(evt, handler);}}/// <summary>/// 注销事件/// </summary>/// <param name="evt">事件名</param>/// <param name="handler">响应函数</param>public void UnRegist(string evt, MyEventHandler handler){if (handler == null)return;if (listeners.ContainsKey(evt)){//这里涉及到Dispath过程中反注册问题,必须使用listeners[type]-=..listeners[evt] -= handler;if (listeners[evt] == null){//已经没有监听者了,移除.listeners.Remove(evt);}}}/// <summary>/// 抛出事件/// </summary>/// <param name="evt">事件名</param>/// <param name="objs">参数</param>public void DispatchEvent(string evt, params object[] objs){//try{if (listeners.ContainsKey(evt)){MyEventHandler handler = listeners[evt];if (handler != null)handler(objs);}}// catch (System.Exception ex)// {//     Debug.LogErrorFormat(szErrorMessage, evt, ex.Message, ex.StackTrace);// }}public void ClearEvents(string key){if (listeners.ContainsKey(key)){listeners.Remove(key);}}private Dictionary<string, MyEventHandler> listeners = new Dictionary<string, MyEventHandler>();private readonly string szErrorMessage = "DispatchEvent Error, Event:{0}, Error:{1}, {2}";private static EventManager s_instance;public static EventManager instance{get{if (null == s_instance)s_instance = new EventManager();return s_instance;}}
}

接着,我们定义一些事件。

/// <summary>
/// 事件定义
/// </summary>
public class EventNameDef
{/// <summary>/// 跳跃事件/// </summary>public const string EVENT_JUMP = "EVENT_JUMP";/// <summary>/// 吃金币事件/// </summary>public const string EVENT_ADD_COIN = "EVENT_ADD_COIN";
}

事件的订阅和触发调用,在下面讲。

五、编写GameMainPanel.cs脚本

创建GameMainPanel.cs脚本,挂到GameMainPanel预设上。
这个脚本主要做两件事:
1 点击跳跃按钮,抛出跳跃事件;
2 监听加金币事件,当收到加金币事件时,同步金币数值到UI上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class GameMainPanel : MonoBehaviour
{/// <summary>/// 跳跃按钮/// </summary>public Button jumpBtn;/// <summary>/// 金币文本/// </summary>public Text coinLbl;private void Awake(){EventDispatcher.instance.Regist(EventNameDef.EVENT_ADD_COIN, OnEventAddCoin);jumpBtn.onClick.AddListener(() =>{// 抛出事件EventDispatcher.instance.DispatchEvent(EventNameDef.EVENT_JUMP);});}private void OnDestroy(){EventDispatcher.instance.UnRegist(EventNameDef.EVENT_ADD_COIN, OnEventAddCoin);}/// <summary>/// 加金币事件,同步数值到UI/// </summary>/// <param name="args"></param>private void OnEventAddCoin(params object[] args){coinLbl.text = ((int)args[0]).ToString();}
}

六、游戏管理器添加金币逻辑

在之前创建的游戏管理器脚本GameMgr.cs中添加金币逻辑,当金币发生变化时,抛出EVENT_ADD_COIN事件。

public int score
{get { return m_score; }set {if (value != m_score)EventDispatcher.instance.DispatchEvent(EventNameDef.EVENT_ADD_COIN, value);m_score = value; }
}
private int m_score;

七、加金币

上一节讲了金币碰撞的检测,现在可以写上加金币逻辑了。

// Player.cs/// <summary>
/// 触发器事件
/// </summary>
private void OnTriggerEnter2D(Collider2D collision)
{if ("Coin" == collision.gameObject.tag){// 吃到金币Destroy(collision.gameObject);// 加金币GameMgr.instance.score++;}
}

八、跳跃事件

为了响应跳跃事件,Player.cs中订阅EVENT_JUMP事件。

// Player.csprivate void Awake()
{EventDispatcher.instance.Regist(EventNameDef.EVENT_JUMP, OnEventJump);
}private void OnDestroy()
{EventDispatcher.instance.UnRegist(EventNameDef.EVENT_JUMP, OnEventJump);
}void OnEventJump(params object[] args)
{if (0 == m_jumpCount)   //一段{m_ani.SetBool("IsJumping1", true);m_rig.velocity = new Vector2(0, JumpSpeed);++m_jumpCount;}else if (1 == m_jumpCount)  //二段{m_ani.SetBool("IsJumping2", true);m_rig.velocity = new Vector2(0, SecondJumpSpeed);++m_jumpCount;}}

九、运行测试

运行Unity,测试效果如下:

【游戏开发实战】(完结)使用Unity制作像天天酷跑一样的跑酷游戏——第七篇:游戏界面的基础UI相关推荐

  1. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第一篇:人物动画序列帧

    文章目录 一.前言 二.创建工程 三.导入序列帧图片素材 四.设置图片格式 五.切割序列帧 六.制作序列帧动画 七.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初一,大家牛年快乐,牛气冲天. ...

  2. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第三篇:跑酷地面制作

    文章目录 一.前言 二.导入地面素材 三.制作地面预设 四.使用脚本控制地面移动 五.起始和结束位置 六.复制多个地面预设 七.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初三,大家牛年快乐, ...

  3. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第二篇:使用Animator控制跑酷角色的动画状态切换

    文章目录 一.前言 二.制作一段跳.二段跳动画 三.编辑动画控制器 四.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初二,大家牛年快乐,牛气冲天. 我打算写一篇使用Unity制作像天天酷跑一样 ...

  4. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第六篇:金币创建与吃金币

    文章目录 一.前言 二.导入金币图片素材 三.制作金币预设 四.制作多个形状的金币阵列 五.金币创建器 六.运行测试 一.前言 嗨,大家好,我是新发. 我打算写一篇使用Unity制作像天天酷跑一样的游 ...

  5. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第四篇:使用脚本控制跑酷角色

    文章目录 一.前言 二.给角色添加碰撞器 三.给地面设置Tag 四.创建Player脚本 五.运行测试 一.前言 嗨,大家好,我是新发,今天是大年初五,大家牛年快乐,牛气冲天. 我打算写一篇使用Uni ...

  6. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第五篇:游戏结束与重新开始

    文章目录 一.前言 二.制作边界碰撞体 三.制作游戏结束界面 四.游戏结束界面脚本 五.游戏管理器 六.碰撞检测逻辑 七.运行测试 一.前言 嗨,大家好,我是新发. 我打算写一篇使用Unity制作像天 ...

  7. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(二):随机生成水果

    文章目录 一.前言 二.导入水果图片素材 三.制作水果预设 四.水果生成器 五.挂FruitSpawner脚本 六.运行测试 一.前言 嗨,大家好,我是新发.下班坐地铁的时候,好几次看到其他人在玩消消 ...

  8. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(八):游戏得分加分效果

    文章目录 一.前言 二.使用TextMeshPro显示得分 1.导入TTF字体到工程中 2.创建字源txt文件 3.生成字体asset 4.制作得分预设 三.得分数字动画 四.得分代码 五.运行测试 ...

  9. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(三):水果拖动与交换逻辑

    文章目录 一.前言 二.事件管理器 三.水果点击事件 四.水果拖动交换 五.运行测试 一.前言 嗨,大家好,我是新发.下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个Un ...

最新文章

  1. SQL中declare申明变量
  2. 知道第一章计算机基础知识作业答案,大学计算机基础作业答案
  3. MySQL源码解读之数据结构-LF_DYNARRAY
  4. 创建Variant数组
  5. 每日算法系列【LeetCode 121】买卖股票的最佳时机
  6. 设计模式17---设计模式之模板方法模式(Template Method)(行为型)
  7. SQL经典练习题及答案
  8. 关于STM32Flash详解
  9. 【Axure原型分享】会议管理原型模板
  10. R语言将两个矩阵数据进行相乘、抽取矩阵的正对角线元素值
  11. selenium模拟登录某宝
  12. Solidworks速成——仿人机械手设计
  13. 实现链表的插入——头插/尾插
  14. 5G通信技术解读|波束成形如何为5G添翼?
  15. Sentinel -- sentinel控制台的简单应用
  16. 爱盛科技于中国电子展演示穿戴式装置地磁传感器方案
  17. 无法达成目标的五个关键因素
  18. 分析黑客入侵 PostgreSQL 数据库
  19. 什么是哈希?哈希的模拟实现
  20. Java Web实验(二) JSP应用

热门文章

  1. 对n个数进行排序(空间复杂度O(1))
  2. QGIS之二拓扑检查
  3. 虚拟服务器 vmotion,vSphere vMotion能够同时迁移多少台虚拟机?
  4. android21是什么手机,三星S21成安卓新王者?详细对比发现,OPPO小米才是真厚道...
  5. php无闪动刷新,简单的无闪动刷新页面/部分内容
  6. 设置IE浏览器文本模式为IE8或IE7
  7. python对mp3格式文件标题专辑封面等信息修改
  8. 能源系统建模:GCAM碳中和情景设置
  9. opencv打开相机获取图像并保存
  10. PTA 盲盒包装流水线 (25 分)