当前位置: 首页 > news >正文

Unity游戏环境交互系统

概述

交互功能使用同一个按钮或按钮列表,在不同情况下显示不同的内容,按下执行不同的操作。

按选项个数分类

环境交互系统可分为两种,单选项交互,一般使用射线检测;多选项交互,一般使用范围检测。第一人称游戏单选多选都可以用,因为第一人称人物背对一个可交互对象时显示交互选项让玩家疑惑,所以第一人称使用射线检测或使用人物面前的触发器进行范围检测。第三人称因为人物一般在或者接近画面中心,基本上必须用以人物为中心的范围检测。

本质上,单选项交互让玩家通过转动视角选择交互选项,在可交互对象很密集的情景,玩家很难准确瞄准交互对象,但开发简单。多选项交互玩家选择想要的交互选项更容易,开发复杂。

按输入方式分类

电脑通过键盘按键(一般是F)交互,滑轮选选项;手机通过按屏幕交互,上下滑动选选项,这导致二者的实现方式又不一样。电脑通过InputManager或PlayerInput,手机通过按钮回调。就是说电脑上的多个选项可以只是Image,手机上的选项有Button。

环境交互系统由这几个部分构成:

  1. 环境检测;
  2. 交互类型判断;
  3. UI显示和回调添加;
  4. 执行;

对于玩家,他能直接感觉到的只有UI显示和按下执行,环境检测、根据类型判断UI显示的内容、根据类型判断执行的类型完全由程序完成,所以玩家感觉不到交互系统的复杂性。

数据结构

一个游戏的交互类型选项是确定的,有限的,适合用枚举表示。把游戏支持的所有交互类型定义为枚举的选项:

public enum ActionOption{None,TakeGun,SwapGun,TakeItem,Talk,CheckPack
}

如果是单选项交互,就声明一个交互枚举变量,如果是多选项交互,就声明一个交互枚举列表。

环境检测

环境交互函数通过射线检测或范围检测得到可交互对象,使用分类函数得到这个交互的类型、对象名称,以此得到显示在界面上的文本、按下需要执行的操作。

可交互对象可能是一个物品、一个NPC、一扇门,交互对象类型毫不相干,但是都有“可交互”的特征。这很符合接口的设计初衷,所以可以定义接口:

public interface Interactive
{public abstract void InterAct();
}

所有的可交互对象继承可交互接口。射线或范围检测只要在检测到的碰撞体上尝试获得接口,就能得到所有可交互对象。

if(Physics.Raycast(rayOrigin,rayVector,out raycastHit,10,interactionLayerMask)&&Vector3.Distance(player.transform.position,raycastHit.point)<interactionRange){if(raycastHit.collider.TryGetComponent(out interactive)){}
}

再把这个接口变量交给一个函数使用里氏转换判断它的具体类型 。

用滚轮改变选中的交互选项:

void Update(){GetScrollInput();}public void GetScrollInput(){float delta=Mouse.current.scroll.ReadValue().y;if(delta<0){selectedInteraction++;}else if(delta>0){selectedInteraction--;}selectedInteraction=Mathf.Clamp(selectedInteraction,0,actionOptions.Count-1);UpdateSelectedInteraction();}

http://www.lryc.cn/news/511389.html

相关文章:

  • TOP K问题:利用堆排序找出数组中最小的k个数
  • 《信息传播:人工智能助力驱散虚假信息阴霾》
  • 数据权限和角色权限区别
  • Flink的多流转换(分流-侧输出流、合流-union、connect、join)
  • DirectUI属性表
  • RBAC权限控制
  • STM32高级物联网通信之以太网通讯
  • 【小程序】全局配置window和tabBar
  • 详解VHDL如何编写Testbench
  • 冥想的实践
  • STM32F103RCT6学习之四:定时器
  • 如何在网页端使用 IDE 高效地阅读 GitHub 源码?
  • 易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med
  • 欢迪迈手机商城设计与实现基于(代码+数据库+LW)
  • 数据库基础与应用:从概念到实践
  • jenkins集成工具(一)部署php项目
  • 17_HTML5 Web 存储 --[HTML5 API 学习之旅]
  • GCP Cloud Architect exam - PASS
  • 【Sentinel】初识Sentinel
  • java常见类库
  • Wordly Wise 3000 国际背单词01 介绍 + 测词汇量
  • Unity Dots理论学习-2.ECS有关的模块(1)
  • 2021.12.28基于UDP同信的相关流程
  • 使用 Docker 搭建 Hadoop 集群
  • optuna和 lightgbm
  • Android 设置铃声和闹钟
  • 自动化测试模型(一)
  • 解决nuxt3下载慢下载报错问题
  • Ubuntu修改swap大小
  • [C#] 复数乘法的跨平台SIMD硬件加速向量算法(不仅支持X86的Sse、Avx、Avx512,还支持Arm的AdvSimd)