目录
特别感谢:
本文是凉鞋的QFramework-类幸存者 教程的学习笔记
https://qframework.cn/qfhttps://qframework.cn/qf QF官网:有详细免费入门教程
本节课完成的目标
升级弹窗
经验值获取
新建一个Global脚本,全局变量都放在里面。
using QFramework;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ProjectSurvivor
{
public class Global
{
/// <summary>
/// 经验值
/// </summary>
public static BindableProperty<int> Exp =new BindableProperty<int>();
}
}
新建一个UIGamePanel场景 界面 prefab然后在Assets-Art-UIprefab-UIGamePanel右键@Resikit-AssetBundle Mark再点一下alt+c生成代码-运行
更新经验值界面
using UnityEngine;
using UnityEngine.UI;
using QFramework;
namespace ProjectSurvivor
{
public class UIGamePanelData : UIPanelData
{
}
public partial class UIGamePanel : UIPanel
{
protected override void OnInit(IUIData uiData = null)
{
mData = uiData as UIGamePanelData ?? new UIGamePanelData();
// please add init code here
Global.Exp.RegisterWithInitValue(exp =>
{
EXP.text = "经验值:" + exp;
}).UnRegisterWhenGameObjectDestroyed(gameObject);
}
protected override void OnOpen(IUIData uiData = null)
{
}
protected override void OnShow()
{
}
protected override void OnHide()
{
}
protected override void OnClose()
{
}
}
}
在SamPleScene中新建GameUIController。游戏一开始就打开UIGamePanel界面。
using UnityEngine;
using QFramework;
namespace ProjectSurvivor
{
public partial class GameUIController : ViewController
{
void Start()
{
UIKit.OpenPanel<UIGamePanel>();
}
private void OnDestroy()
{
UIKit.ClosePanel<UIGamePanel>();
}
}
}
在Enemy脚本中更新敌人死亡经验值+1
using UnityEngine;
using QFramework;
namespace ProjectSurvivor
{
public partial class Enemy : ViewController
{
public float HP = 3;
public float MovementSpeed = 2.0f;
private void Update()
{
if (Player.Default)
{
var direction = (Player.Default.transform.position - transform.position).normalized;
transform.Translate(direction * Time.deltaTime * MovementSpeed);
}
if (HP<=0)
{
UIKit.OpenPanel<UIGamePassPanel>();
this.DestroyGameObjGracefully();
Global.Exp.Value ++;
}
}
}
}
持续生成敌人功能
场景上新建一个空物体EnemyGenerator,把enemy拖进去作为子物体。同时alt+v生成脚本
enemy上alt+B生成bind脚本。
EnemyGenerator脚本代码,随机生成enemy。
using UnityEngine;
using QFramework;
namespace ProjectSurvivor
{
public partial class EnemyGenerator : ViewController
{
private float mCurrentSeconds = 0;
private void Update()
{
mCurrentSeconds += Time.deltaTime;
if (mCurrentSeconds>=1)
{
mCurrentSeconds = 0;
var player = Player.Default;
var randomAngle = Random.Range(0, 360);
var randomRadius = randomAngle * Mathf.Deg2Rad;
var direction = new Vector3(Mathf.Cos(randomRadius), Mathf.Sin(randomRadius));
var generatePos = player.transform.position + direction * 10;
Enemy.Instantiate()
.Position(generatePos)
.Show();
}
}
}
}
敌人死亡不通关&每 5 个经验值升级
enemy脚本中,把敌人死亡就打开通关界面删掉,通关条件后面添加
添加经验值功能,在Global脚本中添加Level变量
using QFramework;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace ProjectSurvivor
{
public class Global
{
/// <summary>
/// 经验值
/// </summary>
public static BindableProperty<int> Exp =new BindableProperty<int>();
public static BindableProperty<int> Level =new BindableProperty<int>(1);
}
}
同时在UIGamePanel界面添加Level文本,快捷键alt+c,生成代码。
UIGamePanel 脚本代码中添加等级更新代码
using UnityEngine;
using UnityEngine.UI;
using QFramework;
namespace ProjectSurvivor
{
public class UIGamePanelData : UIPanelData
{
}
public partial class UIGamePanel : UIPanel
{
protected override void OnInit(IUIData uiData = null)
{
mData = uiData as UIGamePanelData ?? new UIGamePanelData();
// please add init code here
Global.Exp.RegisterWithInitValue(exp =>
{
EXPText.text = "经验值:" + exp;
}).UnRegisterWhenGameObjectDestroyed(gameObject);
Global.Level.RegisterWithInitValue(lv =>
{
LevelText.text="等级:"+lv;
}).UnRegisterWhenGameObjectDestroyed(gameObject);
Global.Exp.RegisterWithInitValue(exp =>
{
if (exp>=5)
{
Global.Exp.Value -= 5;
Global.Level.Value++;
}
}).UnRegisterWhenGameObjectDestroyed(gameObject);
}
protected override void OnOpen(IUIData uiData = null)
{
}
protected override void OnShow()
{
}
protected override void OnHide()
{
}
protected override void OnClose()
{
}
}
}
这里有一个BUG,猪脚死亡时,敌人一直在生成。在enemy脚本中添加一个限制,猪脚存在时再生成。UIPanel界面添加一个升级时弹出的选项按钮
UIGamePanel脚本更新
新增当Level发生变化时,弹出选项按钮代码
using UnityEngine;
using UnityEngine.UI;
using QFramework;
namespace ProjectSurvivor
{
public class UIGamePanelData : UIPanelData
{
}
public partial class UIGamePanel : UIPanel
{
protected override void OnInit(IUIData uiData = null)
{
mData = uiData as UIGamePanelData ?? new UIGamePanelData();
// please add init code here
Global.Exp.RegisterWithInitValue(exp =>
{
EXPText.text = "经验值:" + exp;
}).UnRegisterWhenGameObjectDestroyed(gameObject);
Global.Level.RegisterWithInitValue(lv =>
{
LevelText.text="等级:"+lv;
}).UnRegisterWhenGameObjectDestroyed(gameObject);
Global.Level.Register(lv=>{
Time.timeScale = 0;
BtnUpgrade.Show();
}).UnRegisterWhenGameObjectDestroyed(gameObject);
Global.Exp.RegisterWithInitValue(exp =>
{
if (exp>=5)
{
Global.Exp.Value -= 5;
Global.Level.Value++;
}
}).UnRegisterWhenGameObjectDestroyed(gameObject);
BtnUpgrade.Hide();
BtnUpgrade.onClick.AddListener(() =>
{
Time.timeScale=1;
BtnUpgrade.Hide();
});
}
protected override void OnOpen(IUIData uiData = null)
{
}
protected override void OnShow()
{
}
protected override void OnHide()
{
}
protected override void OnClose()
{
}
}
}
以上结束