1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【游戏开发实战】(完结)使用Unity制作像天天酷跑一样的跑酷游戏——第七篇:游戏界

【游戏开发实战】(完结)使用Unity制作像天天酷跑一样的跑酷游戏——第七篇:游戏界

时间:2020-09-10 15:15:50

相关推荐

【游戏开发实战】(完结)使用Unity制作像天天酷跑一样的跑酷游戏——第七篇:游戏界

文章目录

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

一、前言

嗨,大家好,我是新发。

我打算写一篇使用Unity制作像天天酷跑一样的游戏的教程,会按功能点分成多篇文章来讲,希望可以帮助一些想学Unity的同学。

注:我使用的Unity版本是.1.14f1c1。

文章目录:

第一篇:人物动画序列帧

第二篇:使用Animator控制跑酷角色的动画状态切换

第三篇:跑酷地面制作

第四篇:使用脚本控制跑酷角色

第五篇:游戏结束与重新开始

第六篇:金币创建与吃金币

第七篇:游戏界面的基础UI

本工程的Demo工程,我已上传到GitHub,感兴趣的同学可以自己下载下来学习。

/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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。