Unity 基于eventTriggers的3D场景交互系统

Unity里的3D项目有时候需要大量的交互,而且是无UI的交互。
这时候可以像UI系统里,使用eventTrigger去制作交互系统。但是这个缺少自定义功能,所以我写了个自定义交互系统。这个交互系统可以做到什么呢?直接上图(仅为演示DEMO)。

  1. 点击触发事件

  2. 移动并且事件

  3. 复杂的交互

该系统采用的工厂设计模式,将你需要的功能写入EventTriggersDemo,将你的功能码和相关设置写入(需继承TriggerHelper抽象类)你的类。
使用时将根据设置触发事件。以下代码仅为框架,无具体实现代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Game
{[Flags]public enum THcode:int   //添加TH时可以使用&一次添加多个{_null=0,one=1,two=2,three=4,_virtual=8}
}
using System.Collections.Generic;
using UnityEngine;namespace Game
{public abstract class TriggerHelper{public THcode Code;public GameObject cardObject;public abstract void DefaultHelp();public abstract void CloseHelp();}
} 
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;namespace Game
{public class VirtualTH : TriggerHelper{public VirtualTH(){Code = THcode._virtual;}public VirtualTH(GameObject gameObject):this(){cardObject = gameObject;}public override void CloseHelp(){CardEventTriggers.RemoveEventTriggersListener(cardObject, EventTriggerType.PointerDown,cardObject.GetComponent<CardEventTriggers>().Click);}public override void DefaultHelp(){CardEventTriggers.AddEventTriggersListener(cardObject, EventTriggerType.PointerDown,cardObject.GetComponent<CardEventTriggers>().Click);}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using System;namespace Game
{public class EventTriggersDemo : MonoBehaviour{public  Dictionary<int, TriggerHelper> THdic = new Dictionary<int, TriggerHelper>();private THcode Oncode;private THcode Offcode;[HideInInspector]public THcode showCode;protected void Start(){showCode = THcode._null;InitDic();}#region Checkpublic bool Check(THcode hcode){if ((showCode & hcode) == hcode)return true;else return false;}[ContextMenu("ShowCode")]private void ShowCode(){Debug.Log(showCode);}#endregion#region Set or Deletepublic void SetOncode(THcode hcode){Oncode = hcode;UpdateHelp();}public void DelTrigger(THcode hcode){Offcode = hcode;RemoveHelp();}#endregion/// <summary>/// 必须调用,注意更新/// </summary>private void InitDic(){VirtualTH virtualTH = new VirtualTH(this.gameObject);THdic.Add((int)THcode._virtual, virtualTH);}/// <summary>/// 更新卡牌挂载 (算法可优化,请自行优化)/// </summary>public void UpdateHelp(){foreach (KeyValuePair<int, TriggerHelper> kvp in THdic){DefaultMultiHelp(kvp, Oncode);}}public void RemoveHelp(){foreach (KeyValuePair<int, TriggerHelper> kvp in THdic){CloseMultiHelp(kvp, Offcode);}}private void DefaultHelp(KeyValuePair<int, TriggerHelper> kvp , THcode oncode,THcode target){if(((THcode)kvp.Key & oncode)== target){showCode = showCode | target;kvp.Value.DefaultHelp();}}private void DefaultMultiHelp(KeyValuePair<int, TriggerHelper> kvp, THcode oncode){Array enum_array = Enum.GetValues(typeof(THcode));foreach (THcode _enum in enum_array){if (_enum != THcode._null)DefaultHelp(kvp, oncode, _enum);}}private void CloseHelp(KeyValuePair<int, TriggerHelper> kvp, THcode offcode, THcode target){if(((THcode)kvp.Key & offcode)== target){showCode = showCode & (~target);kvp.Value.CloseHelp();}}private void CloseMultiHelp(KeyValuePair<int, TriggerHelper> kvp, THcode offcode){Array enum_array= Enum.GetValues(typeof(THcode));foreach(THcode _enum in enum_array){if(_enum != THcode._null)CloseHelp(kvp,offcode,_enum);}}#region EventData :书写我需要的EventTrigger功能//以下为虚方法形式的功能自定义,也可直接自定义(不开源,请自行研究)//除了鼠标交互系统,按键交互也可以制作。#region Virtual  public void Click(BaseEventData baseEventData){Click();}public virtual void Click(){Debug.LogWarning("Don't Override!Or it wasn't invoked!");}#endregion#endregion/// <summary>/// 添加事件(不能识别是否重复添加事件,重复添加,触发时将多次运行自定义功能。这是我要的功能,不想要重复添加,需要修改)/// </summary>/// <param name="object"></param>/// <param name="type">事件类型</param>/// <param name="action">事件方法</param>public static void AddEventTriggersListener(GameObject @object, EventTriggerType type, UnityAction<BaseEventData> action){EventTrigger.Entry entry=null;EventTrigger eventTrigger = @object.GetComponent<EventTrigger>();if (eventTrigger == null){@object.AddComponent<EventTrigger>();eventTrigger = @object.GetComponent<EventTrigger>();}foreach (EventTrigger.Entry existingEntry in eventTrigger.triggers){if (existingEntry.eventID == type){entry = existingEntry;}}if (NeedNew(entry)){entry = new EventTrigger.Entry();entry.eventID = type;entry.callback.AddListener(action);eventTrigger.triggers.Add(entry);return;}Debug.Log(@object.transform.name + String.Format(" Add {0} ETListener!",type.ToString()));entry.callback.AddListener(action);}/// <summary>/// 删除事件(不是删除一个,而是相同的全删)/// </summary>/// <param name="object"></param>/// <param name="type">事件类型</param>/// <param name="action">事件方法</param>public static void RemoveEventTriggersListener(GameObject @object, EventTriggerType type,UnityAction<BaseEventData> action){if (@object.GetComponent<EventTrigger>()){EventTrigger eventTrigger = @object.GetComponent<EventTrigger>();foreach (EventTrigger.Entry _entry in eventTrigger.triggers){// Debug.Log(_entry.eventID.ToString());if (_entry.eventID == type){Debug.Log(@object.transform.name + String.Format(" Remove {0} ETListener!", type.ToString()));_entry.callback.RemoveListener(action);}}}}private static bool NeedNew(EventTrigger.Entry entry){if (entry == null)return true;else return false;}}
}

Unity 基于eventTriggers的3D场景交互系统相关推荐

  1. 诊断网络层和应用层交互_基于SoC的数据采集与交互系统解决方案

    引言 Internet的快速发展和成功促进了以太网(Ethernet)技术的发展和应用的扩展,所涉及的领域十分广泛,如传统的工业控制.信息家电.智能家居.安全监控.楼宇自动化.医疗.环境监测等.大多数 ...

  2. 基于DNN-ML的3D全息交互

    基于ML的3D全息交互 前言 DNN/ML Face-ID A-R SOT ASR SLAM 音视频 3D全息投影 交互系统设计 Updating 前言 :Hi ~ J. A. R. V. I. S. ...

  3. 基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  4. 【Unity】OnTriggerStay2D无法触发问题,物体跟随鼠标等背包系统以及UI场景交互系统技术总结

    背包系统以及交互 交互实现 技术总结 OnTriggerStay2D无法碰撞 检测跟随鼠标移动 跟着麦扣老师学习的背包系统之后,因为参加GameJam后现在码了背包和场景交互,但是都有些bug,最近重 ...

  5. 基于AIGC的3D场景创作引擎概述

    通过改变3D场景制作流程复杂.成本高.门槛高.流动性差的现状,让商家像玩转2D一样去玩转3D,让普通消费者也能参与到3D内容创作和消费中,真正实现内容生产模式从PGC/UGC过渡到AIGC,是我们3D ...

  6. 基于HTML5气3D仿真培训系统

    根据最近的上线HTML5的燃气3D培训仿真系统.曾经的老系统是採用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但由于这次新产品需求要求能 ...

  7. 【Unity】UI或3D场景自动设置渐变色背景

       给定一组色值(或者多组色值,每次随机取一组),初始化时创建图片并赋值给UI的Image或3D场景的Sprite.从下/左往上/右,按曲线渐变 using System.Collections; ...

  8. SimLab Composer 9 for Mac(3D场景制作渲染工具)附破解补丁

    SimLab Composer 9 for Mac是Mac平台上一款功能十分强大,模型重多的3D场景制作渲染工具.可以轻松构建出完美的室内模型,以帮助您在电脑上设计模型,你需要的模型都可以在这款软件上 ...

  9. 一种基于UE4平台多人交互3D家装设计系统及使用方法与流程

    本发明涉及一种基于UE4平台多人交互3D家装设计系统及使用方法,属虚拟现实技术领域. 背景技术: 目前随着虚拟现实技术的飞速发展,当前在进行家装实际工作中,为了提高设计方案对用户展示的便捷性和准确性, ...

最新文章

  1. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
  2. 在 Shell 脚本里使用数组
  3. [转移]安装 BugZilla 时 Perl 模块的安装
  4. 通过TA binary查看TA的uuid和stack
  5. 10套华丽的 Windows 8 Metro 风格图标【2000+免费图标】
  6. python删除字符串中的字母_在Python中删除字符串中的大写字母
  7. 欧洲最权威的12星座分析①
  8. SQL Server Query界面不能录入中文
  9. 电脑二维码怎么扫描_扫描模组方案是如何满足多种应用场景需求?
  10. python批量下载网页文件夹_Python实现批量从不同的Linux服务器下载文件
  11. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  12. python编程代码画画_分享给大家几段有趣的代码,学会python画画可以不用自己动手啦...
  13. 数论 day 2 试题解析
  14. Update 语法全介绍
  15. 印象最深的一次服务器维护中,与服务器最深的羁绊,你有着怎样的闯荡大荒的故事?...
  16. JAVA byte[]数组转long
  17. 埋在大学时光里的那些人
  18. oracle输出实心三角型,C语言帕斯卡三角形打印示例
  19. 制作 Linux mint 20.2 随身系统
  20. VB.NET版机房收费系统---组合查询

热门文章

  1. 青源Seminar丨NAACL专场:Language Modeling Summarization
  2. Mac M1 nvm install失败问题
  3. 退而求其次(4)——椭圆中的最大矩形
  4. 2020年计算机领域(人工智能、数据库、计算机理论、系统软件、计算机网络等)会议截稿日期大全!(2020年3月份更新)
  5. 电子商务网站开发流程
  6. android立体3D效果_PS教程:铝膜气球字制作的完整教程,3D立体效果字体的制作...
  7. android高仿京东快报(垂直循环滚动新闻栏)
  8. 我的2013——学习生活总结
  9. word流程图怎么做虚线框_如何在visio中画虚线框以及将visio图形复制到word文档
  10. iphone闹铃的稍后提醒什么意思