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

不止于移动:为你的Unity第一人称角色添加环境交互与状态管理(FSM入门)

不止于移动为你的Unity第一人称角色添加环境交互与状态管理FSM入门在完成基础的第一人称移动和视角控制后许多开发者会发现角色仍然缺乏真实感和可玩性。本文将带你从能动升级到能玩通过环境交互和状态管理让角色真正活起来。1. 环境交互系统设计1.1 射线检测基础实现交互系统的核心是射线检测Raycast。在Player的Camera位置向前发射一条不可见的射线当射线碰到特定物体时触发交互逻辑。public class InteractionSystem : MonoBehaviour { [SerializeField] private float interactDistance 3f; [SerializeField] private LayerMask interactableLayer; private void Update() { if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out RaycastHit hit, interactDistance, interactableLayer)) { // 显示交互提示UI if (Input.GetKeyDown(KeyCode.E)) { hit.collider.GetComponentIInteractable().Interact(); } } } }关键参数说明interactDistance最大交互距离interactableLayer可交互物体的层级避免所有物体都可交互1.2 可交互物体接口设计使用接口规范所有可交互物体的行为public interface IInteractable { string InteractionPrompt { get; } void Interact(); } // 示例可拾取物品 public class PickableItem : MonoBehaviour, IInteractable { public string InteractionPrompt 拾取 [E]; public void Interact() { // 添加到玩家背包或销毁物体 Destroy(gameObject); } }2. 有限状态机FSM基础架构2.1 状态机核心类设计有限状态机是管理角色复杂行为的神器。以下是精简版实现public abstract class PlayerState { protected PlayerController player; public PlayerState(PlayerController player) { this.player player; } public virtual void Enter() {} public virtual void Update() {} public virtual void Exit() {} } public class PlayerStateMachine { private PlayerState currentState; public void ChangeState(PlayerState newState) { currentState?.Exit(); currentState newState; currentState.Enter(); } public void Update() { currentState?.Update(); } }2.2 基础状态实现示例空闲状态public class IdleState : PlayerState { public override void Update() { if (player.MoveInput.magnitude 0.1f) { player.StateMachine.ChangeState(new WalkState(player)); } if (player.IsInteracting) { player.StateMachine.ChangeState(new InteractState(player)); } } }交互状态public class InteractState : PlayerState { public override void Enter() { player.Animator.SetTrigger(Interact); } public override void Update() { if (player.Animator.GetCurrentAnimatorStateInfo(0).normalizedTime 1f) { player.StateMachine.ChangeState(new IdleState(player)); } } }3. 高级交互功能实现3.1 多类型交互处理通过枚举定义不同的交互类型public enum InteractionType { Pickup, Door, Switch, Dialogue } // 在交互系统中添加类型判断 if (hit.collider.TryGetComponent(out IInteractable interactable)) { switch (interactable.InteractionType) { case InteractionType.Door: // 播放开门动画 break; case InteractionType.Switch: // 触发机关逻辑 break; } }3.2 交互冷却与优先级避免连续快速交互导致的问题[System.Serializable] public class InteractionSettings { public float cooldown 0.5f; public InteractionPriority priority InteractionPriority.Normal; } public enum InteractionPriority { Low, Normal, High, Critical }4. 状态扩展与行为组合4.1 复合状态设计某些行为需要组合多个基础状态public class CombatState : PlayerState { private WalkState walkState; public override void Enter() { walkState new WalkState(player); player.WeaponSystem.Equip(); } public override void Update() { walkState.Update(); if (Input.GetMouseButtonDown(0)) { player.WeaponSystem.Attack(); } } }4.2 状态间数据传递通过上下文对象共享状态数据public class PlayerStateContext { public float MoveSpeedMultiplier 1f; public bool CanInterrupt true; // 其他共享数据... } // 在状态基类中引用 public abstract class PlayerState { protected PlayerStateContext context; // ... }5. 性能优化与调试技巧5.1 射线检测优化避免每帧多次检测private IEnumerator InteractionCheckCoroutine() { while (true) { PerformRaycastCheck(); yield return new WaitForSeconds(0.1f); // 降低检测频率 } }5.2 状态机调试工具添加调试信息输出public class DebugStateMachine : PlayerStateMachine { public string CurrentStateName currentState?.GetType().Name; public void LogStateChange(PlayerState newState) { Debug.Log($State changed: {CurrentStateName} - {newState.GetType().Name}); } }在Unity编辑器中创建自定义窗口实时显示状态信息[CustomEditor(typeof(PlayerController))] public class PlayerControllerEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); var player (PlayerController)target; EditorGUILayout.LabelField(Current State, player.StateMachine.CurrentStateName); } }6. 实战案例密室逃脱交互系统结合上述技术我们实现一个包含多种交互类型的密室场景门禁系统需要钥匙卡才能开启播放开门动画和音效谜题机关可旋转的齿轮拼图压力板触发机制物品组合拾取电池放入手电筒纸条碎片拼合成密码关键实现代码public class DoorController : MonoBehaviour, IInteractable { public bool requiresKey true; public ItemType requiredKeyType; public void Interact() { if (requiresKey !PlayerInventory.HasItem(requiredKeyType)) { ShowPrompt(需要钥匙卡); return; } StartCoroutine(OpenDoorAnimation()); } private IEnumerator OpenDoorAnimation() { // 播放动画和音效 yield return new WaitForSeconds(1f); GetComponentCollider().enabled false; } }在项目中使用这些技术时建议先从简单的交互开始逐步增加复杂度。比如先实现基础的物品拾取再添加状态管理最后组合成复杂的交互系统。

相关文章:

不止于移动:为你的Unity第一人称角色添加环境交互与状态管理(FSM入门)

不止于移动:为你的Unity第一人称角色添加环境交互与状态管理(FSM入门) 在完成基础的第一人称移动和视角控制后,许多开发者会发现角色仍然缺乏真实感和可玩性。本文将带你从"能动"升级到"能玩",通过…...

终极指南:30天无限续杯!简单三步重置JetBrains IDE试用期

终极指南:30天无限续杯!简单三步重置JetBrains IDE试用期 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾因JetBrains IDE试用期到期而中断开发工作?ide-eval-resetter…...

p,np,np难问题

文章目录1.预备知识1.1多项式1.3约化1.4Hamilton回路2.p类问题(polynominal,多项式)2.1定义:一个可以在多项式时间复杂度内解决的问题。2.2举例:n个数的排序问题(不超过O(n2))3.np问题&#xff…...

QColor实战:从基础到高级的色彩应用

1. QColor基础入门:从零开始玩转色彩 第一次接触Qt开发时,我被QColor的灵活性惊艳到了。这个看似简单的颜色处理类,实际上藏着不少玄机。记得当时为了给按钮设置一个漂亮的渐变色,折腾了好几个小时,现在回头看&#xf…...

如何让旧iPhone/iPad重获新生?Legacy iOS Kit完全指南

如何让旧iPhone/iPad重获新生?Legacy iOS Kit完全指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

【WinForm UI控件系列】散点图/折线图控件 (支持数值型、时间型、字符串型)

前言:c# winform UI控件系列(Net6),纯GDI绘图无依赖,虽然做不到最好,争取做好更好用!一、效果图 (x轴三种类型:数值、时间、字符串)支持五种颜色风格。标题&a…...

MCP 2026细粒度权限配置最后窗口期:Gartner认证工程师亲授——3类业务系统(SaaS/混合云/边缘IoT)差异化配置矩阵

更多请点击: https://intelliparadigm.com 第一章:MCP 2026细粒度权限控制配置全景认知 MCP 2026(Multi-Cloud Policy Engine v2026)引入了基于属性的动态权限模型(ABACRBAC Hybrid),支持资源级…...

VSCode 2026远程同步漏洞预警(CVE-2026-XXXXX):未打补丁将导致增量同步静默失效——附热修复脚本

更多请点击: https://intelliparadigm.com 第一章:VSCode 2026远程同步漏洞预警(CVE-2026-XXXXX)概述 CVE-2026-XXXXX 是一个高危远程代码执行漏洞,影响 VSCode 1.86–1.92 版本中内置的 Remote Sync(远程…...

长提示词优化5大技巧,让AI大模型更稳定可控

随着Sora、Gen-3、Midjourney V6等AI大模型的飞速发展,我们对AI生成内容的需求和期待已发生质的飞跃。从最初简单的“生成一张符合要求的图片”,升级为“创作一段有逻辑、有分镜、有质感的完整剧情”。随之而来的是Prompt的不断拉长。 长提示词带来的副…...

【数据分析】基于二维多面体模板匹配2D-PTM方法分析原子分辨率电子显微镜图像matlab代码

🔥 内容介绍原子分辨率电子显微镜 (Atomic Resolution Transmission Electron Microscopy, AR-TEM) 技术能够提供材料在原子尺度上的结构信息,为材料科学、纳米科技等领域的研究提供了强有力的手段。然而,从AR-TEM图像中提取准确的原子结构信…...

EspoCRM完整安装指南:5步快速部署免费开源客户关系管理系统

EspoCRM完整安装指南:5步快速部署免费开源客户关系管理系统 【免费下载链接】espocrm EspoCRM – Open Source CRM Application 项目地址: https://gitcode.com/GitHub_Trending/es/espocrm 想要免费、开源的客户关系管理解决方案吗?EspoCRM正是您…...

如何用curatedMetagenomicData快速分析人类微生物组数据:完整指南

如何用curatedMetagenomicData快速分析人类微生物组数据:完整指南 【免费下载链接】curatedMetagenomicData Curated Metagenomic Data of the Human Microbiome 项目地址: https://gitcode.com/gh_mirrors/cu/curatedMetagenomicData 你是否曾经面对海量的微…...

【路径规划】基于融合改进A星-麻雀搜索算法求解六边形栅格地图路径规划

​✅作者简介:热爱数据处理、数学建模、仿真设计、论文复现、算法创新的Matlab仿真开发者。🍎更多Matlab代码及仿真咨询内容点击主页 🔗:Matlab科研工作室🍊个人信条:格物致知,期刊达人。&#…...

WinUtil终极指南:5分钟掌握Windows系统一键优化与批量安装

WinUtil终极指南:5分钟掌握Windows系统一键优化与批量安装 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 还在为Windows系统卡顿…...

OMC - 09 oh-my-claudecode 的多 Agent 编排实战

文章目录Pre一、问题背景:为什么需要“团队流水线编排”二、总体架构:两条运行时、一个调度内核2.1 双运行时:V1 Watchdog 与 V2 Event-Driven2.2 上层抽象:Skill 层与统一接口三、分阶段流水线:从“先干活”到“先规划…...

CAD导入ansys失败解决方案

笔者亲试,文件中的方案走一遍可以解决大部分此类问题1.炸开图块:选中所有图形,输入 EXPLODE(快捷键 X)并回车。建议连续执行 2-3 次,确保所有嵌套的块和面域都被彻底打散为基础线条。2.清理重叠&#xff1a…...

重新定义地图创作:如何通过TEdit实现泰拉瑞亚世界的无限可能

重新定义地图创作:如何通过TEdit实现泰拉瑞亚世界的无限可能 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets …...

SMAPI安卓安装器:如何让星露谷物语在手机上玩出PC版MOD体验?

SMAPI安卓安装器:如何让星露谷物语在手机上玩出PC版MOD体验? 【免费下载链接】SMAPI-Android-Installer SMAPI Installer for Android 项目地址: https://gitcode.com/gh_mirrors/smapi/SMAPI-Android-Installer 你是否曾经羡慕PC玩家能在星露谷物…...

AI证书备考时间别低估:很多人准备时间完全不够

在AI技术快速普及、职场竞争日益激烈的当下,AI证书已成为很多人提升自身价值的重要选择。其中,CAIE注册人工智能工程师认证作为聚焦人工智能领域的主流技能等级认证,受到了零基础小白、职场赋能者及专业技术人士的关注。但一个常见的误区是&a…...

告别钢网!手把手教你用热风枪和普通焊锡丝搞定QFN芯片焊接(附温度曲线详解)

极简工具下的QFN芯片焊接实战:热风枪与焊锡丝的完美配合 在电子制作和维修领域,QFN封装芯片因其体积小、性能优而广受欢迎,但它的焊接过程却让不少爱好者望而却步。专业回流焊设备和定制钢网固然理想,但当你手头只有一把热风枪、普…...

IBM P570小机更换电源步骤

在HMC里查看报错:本次HMC里有一个电源相关报错,但是没有具体的sn号和位置码,查看电源后面的状态灯,不是两个常亮状态,而是一个不亮,一个闪烁,判断故障损坏,位置:----2z7t…...

实战复盘:一次内网渗透中,如何利用旧版向日葵客户端获取远程控制权限

内网渗透实战:旧版向日葵客户端的远程控制漏洞分析与防御 当你在一次内网渗透测试中发现多台主机仍在使用旧版向日葵远程控制软件时,这可能是一条通往域控的捷径。去年的一次红队行动中,我们正是通过一台边缘服务器的SunloginClient 10.3.0.2…...

二叉树先序线索化及先序线索二叉树找后继

#include <stdio.h> #include <stdlib.h>// 线索二叉树结点 typedef struct ThreadNode {int data;struct ThreadNode *lchild, *rchild;int ltag, rtag; } ThreadNode, *ThreadTree;ThreadNode *pre NULL;void create(ThreadTree &T) {T (ThreadNode *)mal…...

GetQzonehistory:一键永久备份QQ空间说说的完整解决方案

GetQzonehistory&#xff1a;一键永久备份QQ空间说说的完整解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间中那些记录着青春点滴的说说会随着时间流逝而消失&…...

阶跃 StepAudio 2.5 ASR 上线!500TPS 极速推理,30分钟语音“秒级转写”

语音 Agent 首字响应慢&#xff0c;很多人以为是 LLM 的锅。其实真正的延时瓶颈常在 ASR&#xff08;自动语音识别&#xff09;&#xff1a;传统的逐 token 串行输出——一段 5 分钟音频&#xff0c;要等几十秒才能拿到完整转写结果&#xff0c;整条链路卡在这一步。 StepAudi…...

别再用记事本了!手把手教你用Python+010 Editor高效解决CTF中的编码乱序问题(以GKCTF签到题为例)

告别记事本&#xff1a;Python与010 Editor打造CTF编码乱序处理流水线 在CTF竞赛中&#xff0c;编码转换和乱序处理类题目往往消耗大量时间在重复性操作上。传统做法是手动复制粘贴到各种在线解码工具&#xff0c;不仅效率低下&#xff0c;还容易在多次转换中丢失关键数据。这次…...

选嵌入式培训,到底在选什么?

一文看懂核心底层逻辑当下嵌入式技术飞速迭代&#xff0c;新能源、汽车电子、具身智能等热门赛道持续爆发&#xff0c;专业嵌入式工程师需求激增。不少入行、转行、进阶者选择培训作为捷径&#xff0c;但市面上机构五花八门&#xff0c;同质化、纸上谈兵等问题突出&#xff0c;…...

sfy recommand

sfy...

高级前端需要学习那些东西?

一、JavaScript 深度&#xff08;这是分水岭&#xff09;高级前端必须对 JS 有“语言级理解”&#xff0c;而不是 API 使用者。必须掌握执行机制事件循环&#xff08;Event Loop&#xff1a;宏任务 / 微任务&#xff09;调用栈 / 执行上下文作用域 & 闭包this 绑定规则&…...

上网行为监控软件哪个好?推荐六款优秀的上网行为监控软件,快码住

在企业管理中&#xff0c;如何平衡员工的上网自由与办公效率&#xff0c;始终是管理者面临的一大挑战。王先生是一家外贸公司的负责人&#xff0c;他最近发现公司的出口业务增长缓慢&#xff0c;但每月的网络带宽费用却居高不下。经过排查&#xff0c;他才意识到部分员工利用公…...