Unity 工具 之 简单引用计数器的封装整理,继承即可使用,便于简单计数使用及相关计算事件触发
2023-09-11 14:20:50 时间
Unity 工具 之 简单引用计数器的封装整理,继承即可使用,便于简单计数使用及相关计算事件触发
目录
Unity 工具 之 简单引用计数器的封装整理,继承即可使用,便于简单计数使用及相关计算事件触发
一、简单介绍
Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。
本节介绍,在 Unity 开发中,进行计数器的封装,与使用,方便后期开发,如果你有更好的方法,欢迎留言,多谢。
二、实现原理
1、接口,基类实现基本的计数功能,并添加相关的事件触发
2、本节案例,介绍一个房间进人开灯,没人关灯的案例,来介绍简单介绍计数器的使用
三、注意事项
1、接口,和基类不唯一,可以根据自己的需要重新整理
2、OnRetainFromZero() 和 OnReleaseToZero() 函数根据自己需要可以抽象,也可以虚有,或者也可以增加其他数量监控的事件
四、效果预览
五、实现步骤
1、打开 Unity,新建一个空工程
2、简单布置一下场景,添加一个 Plane,作为房间地面,并先关闭 Ligiht
3、在工程中添加脚本,BaseRefCounter 构建计数器的接口和基类,LightSwitch 等的开关类,RoomLightManager 管理房间进人的灯开关,TestRoomLightManager 模拟人进入和离开情景
4、把脚本 TestRoomLightManager 挂载到场景中,并对应赋值
5、运行场景,效果如上
六、关键代码
1、BaseRefCounter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Tool_XAN {
public interface IRefCounter {
int RefCount { get; }
void Retain(object refOwner=null);
void Release(object refOwner=null);
}
public class BaseRefCounter: IRefCounter
{
public int RefCount { get; private set; }
public void Retain(object refOwner = null)
{
if (RefCount==0)
{
OnRetainFromZero();
}
RefCount++;
}
public void Release(object refOwner = null)
{
RefCount--;
if (RefCount==0)
{
OnReleaseToZero();
}
}
protected virtual void OnRetainFromZero() { }
protected virtual void OnReleaseToZero() { }
}
}
2、LightSwitch
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Example_XAN
{
public class LightSwitch
{
private Light mLight;
public LightSwitch(Light light) {
mLight = light;
}
public void Open() {
mLight.enabled = true;
Debug.Log("灯打开了……");
}
public void Close()
{
mLight.enabled = false;
Debug.Log("灯关闭了……");
}
}
}
3、RoomLightManager
using System.Collections;
using System.Collections.Generic;
using Tool_XAN;
using UnityEngine;
namespace Example_XAN {
public class RoomLightManager : BaseRefCounter
{
LightSwitch mLightSwitch;
List<GameObject> peopleLst;
public RoomLightManager(LightSwitch lightSwitch) {
mLightSwitch = lightSwitch;
peopleLst = new List<GameObject>();
}
public void EnterPeople() {
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
go.transform.position = RandomPos();
peopleLst.Add(go);
Retain();
Debug.Log("有人进入房间,目前房间人数为:"+RefCount);
}
public void LeavePeople() {
GameObject go = peopleLst[Random.Range(0, peopleLst.Count)];
peopleLst.Remove(go);
GameObject.Destroy(go);
Release();
Debug.Log("有人离开房间,目前房间人数为:" + RefCount);
}
protected override void OnRetainFromZero()
{
mLightSwitch.Open();
}
protected override void OnReleaseToZero()
{
mLightSwitch.Close();
}
private Vector3 RandomPos() {
int x = Random.Range(-3,3);
int z = Random.Range(-3,3);
return new Vector3(x,1,z);
}
}
}
4、TestRoomLightManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Example_XAN
{
public class TestRoomLightManager : MonoBehaviour
{
public Light Light;
// Start is called before the first frame update
IEnumerator Start()
{
RoomLightManager room = new RoomLightManager(new LightSwitch(Light));
yield return new WaitForSeconds(0.5f);
room.EnterPeople();
yield return new WaitForSeconds(0.5f);
room.LeavePeople();
yield return new WaitForSeconds(1f);
room.EnterPeople();
yield return new WaitForSeconds(0.5f);
room.EnterPeople();
yield return new WaitForSeconds(0.5f);
room.LeavePeople();
yield return new WaitForSeconds(0.5f);
room.LeavePeople();
}
}
}
相关文章
- 演练:实现支持基于事件的异步模式的组件
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
- cocos2d-x触摸事件优先级
- JavaScript事件冒泡和事件捕获
- uni-app - 实现监听路由跳转,每次跳转的时候都能触发的事件(当页面路由发生变化时,触发一个封装好的请求接口或普通功能函数)全端兼容,高效简洁无 BUG 详细教程
- React事件绑定的几种方式对比
- Android:30分钟弄明白Touch事件分发机制
- js 监听ios手机键盘弹起和收起的事件
- 浅析DOM事件中target和currentTarget的区别
- Unity 进阶 之 UGUI 实现动态数据动态翻页显示效果的简单封装(动态更新数据动态更新显示,包括页码和按钮事件等功能)
- Web 前端 之 html 移动端/PC端元素长按功能的简单封装,实现元素长按事件的触发
- 详解 QT 源码之 Qt 事件机制原理