UnityStandardAsset工程、源码分析_6_第三人称场景[玩家控制]_工程组织

本文主要是介绍UnityStandardAsset工程、源码分析_6_第三人称场景[玩家控制]_工程组织,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在前几章(1-5),我们完整地分析了车辆场景,包括玩家控制和AI控制的全部机制。现在我们来分析StandardAsset里的下一个场景:第三人称场景
在这里插入图片描述
不过由于场景所用到的系统有很多是和车辆场景重复的,也就是说StandardAsset的各个场景共用一套包括输入系统在内的框架,所以我们对于接下来的场景的分析不会像车辆场景一样长达五章,我们仅分析每个场景内最特殊的部分,例如这个第三人称场景,我们将分析人物的控制逻辑,动画的播放等部分。
并且我反思了一下我在之前几章的分析过程中存在的问题,我决定先对场景的工程部分做彻底的分析,了解这个场景究竟做了些什么,实现了哪些功能,以及明晰游戏场景的组织结构,再根据这些结果结合代码去反推游戏实现的原理。而不是之前那样以代码作为分析入口,逐渐拼凑出游戏的架构,因为那样会导致我非常痛苦地边读边猜地过了一遍代码,却完全不知道这些运算有什么意义。采用这种新的自顶向下的方法可以大大提高我的分析速度。


第三人称场景

在这里插入图片描述
在这里插入图片描述
这两张动图展示了这个场景最主要的实现目标——人物控制:

  • 奔跑
  • 行走
  • 跳跃
  • 蹲伏
  • 蹲伏前行
  • 缓慢蹲伏前行
  • 遇到狭小空间自动蹲伏

明确了目标,我们接下来分析工程的组织结构:
在这里插入图片描述
这是其中的一部分:

  • GeometryStatic:场景中静态的部分
    在这里插入图片描述
    它本身和GroundObstacles是空物体,下属的三个对象有自己的Mesh和MeshCollider:
    • GroundExtends:最大的那个圆盘,在它的边缘有一圈突起,用于防止玩家跑出场景。
    • GroundLines:场景中方形的区域,边缘的白色部分虽然是突起,高度却较低,可以被玩家跨越。
    • GroundObstacles:和父对象重名,但是是场景中间的白色复杂几何体,单独一个,而不是多个对象拼接而成,作为玩家的“攀爬架”或者说是行走跳跃的平台,玩家可以在这上面走走跳跳。
  • GeometryDynamic:场景中动态的部分
    他的子物体BoxSmall就是那些动图中红色的盒子,拥有完全的物理效果,可以被玩家碰撞。
    Pickup比较特殊,是藏在攀爬架内的这个红色问号硬币:
    在这里插入图片描述
    有Mesh和MeshCollider,但不同于BoxSmall的是,它没有刚体,也就是不能在碰撞后自由移动,也没有什么控制脚本,我不是很明白这个物体存在的意义。不过它名为Pickup,又是个硬币的形状,很可能是设定为可以在碰撞后被拾取的对象,就像索尼克里的金币一样,而开发人与因为某种原因放弃了这个物体的脚本开发工作,使这个物体则被不明不白地留在了场景中。
  • Helpers:包含了两个系统
    • EventSystem:这是Unity原生的组件,我就不赘述了。
    • MainMenuLoader:这个物体上挂载的脚本会在游戏开始后,克隆一个MainMenuUI的预制件
      在这里插入图片描述
      克隆后只显示右上角的Menu按钮,按下就可以显示中间的菜单栏,然后玩家可以通过这些选项来切换场景,或是前往learn.unity.com,这些脚本相对简单,这里也不再分析。
  • UI:就是字面意义的UI
    其中的DualTouchControls是用于手机操作的一套交互UI,可以实现滑动来控制人物移动的功能,移动平台控制的部分我不太想分析,因为测试起来有点麻烦,大体也与键盘控制相同。
  • Camera:摄像机
    很显然,其下属物体FreeLookCameraRig表示这个场景使用了自由摄像机来观察人物,上面的两张动图也可以看到,而自由摄像机的实现我在第四章分析过了,这里的实现完全相同,有需要请查阅第四章。
  • Lights:灯光
    这个场景使用了两个平行光
    在这里插入图片描述
    • LightMainDirectional:主要光源,ShadowType为SoftShadows,用于主要的场景照明和制造阴影。
    • LightFillDirectional:辅助光源,方向几乎与主光源相反,没有Shadow,仅给予一个蓝光,用于补光,照亮主光源照不到的部分。

上面这些分析是“其中的一部分”,那剩下的呢?剩下的当然是人物模型了:
在这里插入图片描述
如果有相关经验的话,应该立刻就能明白这下属的三个物体都是什么:

  • EthanBody:人物的主要模型。
  • EthanGlasses:人物的眼镜,就是这玩意:
    在这里插入图片描述
    不是很懂为什么要分开,这个物体也没什么独立的动画。
  • EthanSkeleton:骨骼对象,层数很复杂的节点。因为上面两个都是Mesh,使用了SkinMeshRenderer,而它们使用的骨骼集合就是这个EthanSkeleton。

这三个子物体没什么好说的,是通用的组织结构,而特殊的部分则在他们的父对象ThirdPersonController中,我们来看一下它的组件挂载情况:
在这里插入图片描述

  • Transform:没什么好说的。
  • Animator:这个人物的动画状态机,等下分析。
  • Rigidbody:刚体组件,没什么好说的。
  • CapsuleCollider:胶囊碰撞盒,人物的碰撞盒,在类人型对象中用的比较多,用来与场景内的其他碰撞体交互。
  • ThirdPersonUserControl:用户输入接口,类似于赛车场景中的CarUserControl,用于读取原始的输入数据,并且调用ThirdPersonCharacter的Move方法。
  • ThirdPersonCharacter:人物的核心控制逻辑,类似于CarController,用于更新人物的各类状态和设置Animator的参数。

这个场景中最重要的物体就是它,我们的分析也聚焦在这个物体的两个脚本上。不过这章我并不打算分析脚本,而是放在下一章。这章我们先来看看Animator这个组件,它接收了哪些数据,又怎么通过这些数据来播放动画。


Animator

在这里插入图片描述

  • Controller:动画状态机,等会分析。
  • Avatar:模型自带的Avatar,提供了一套类人的骨骼,可用于骨骼动画,与EthanSkeleton对应,具体的说明可以百度。
  • ApplyRootMotion:根动画。在模型动画的制作过程中,可以定义模型的移动状态。例如一个人的跑步动画,它可以由美术人员来定义人物跑动的速度,也就是人物坐标的变化状况。否则奔跑动画只会包含跑步的动作,播放时人物会原地奔跑而不是前进。这里的Apply就是决定是否启用,不过这里设置成了Handled by Script,由脚本控制,也就是ThirdPersonCharacter,关于怎么控制,下一章分析。
  • UpdateMode:动画的更新模式,有三种选项:
    • Normal:在Update内进行更新。
    • AnimatePhysics:在FixedUpdate内进行更新。
    • UnscaledTime:无视timescale进行更新,用于UI动画。
  • CullingMode:剔除模式,用于表示在摄像机看不到的情况下的剔除原则,也有三种选项:
    • AlwaysAnimate:始终播放动画,不剔除。
    • CullUpdateTransforms:在摄像机看不到时不更新动画,但是根动画会更新。
    • CullCompletely:完全剔除,根动画也不更新。

看完了Animator组件,我们来看看之前提到的状态机Controller的结构:
在这里插入图片描述

  • Airborne:在空中的动画。
    在这里插入图片描述
    可以看到这个动画是一个混合树,由多个动画混合而成。有两个参数Jump和JumpLeg,用于在二维坐标上进行混合,这个机制的原理可以百度。这里说明一下这两个参数的意义:

    • Jump:人物速度在y轴上分量,映射到范围[-5,5],人物在跳跃的时候,起跳、滞空、下落的动画是不同的,需要通过这个参数来混合。
    • JumpLeg:跳跃的起跳腿,因为用左脚起跳和用右脚起跳的动画也是不同的,用以决定该播放哪条腿的动画。
  • Crouching:蹲伏的动画。
    在这里插入图片描述

    • Turn:混合左右转向的动画,范围[-1,1],负值为左转,正值为右转。
    • Forward:前进或停止,范围[0,1],0为完全停止,1为最高速向前,中间值进行混合。
  • Grounded:在地面上的一系列动画。
    在这里插入图片描述
    在地面上的动画比较多,但是有规律,集合表示为:
    {原地,行走,奔跑} + {原地,行走,奔跑} X {左转,右转} X {普通,快速}
    一共15个动画,适用于不同的情况。它的参数和蹲伏的参数基本一致:

    • Turn:旋转的程度,范围[-1,1]
    • Forward:前进的程度,范围[0,1]

    通过这两个参数来混合动画。


总结

至此这个场景的工程结构就分析完了,并且我们明确了接下来的分析目标:

  1. 弄清楚ThirdPersonUserControl是怎样处理输入数据的。
  2. 分析ThirdPersonCharacter如何使用处理好的输入数据,如何更新人物对象的运动状态,如何计算出动画的参数并将其赋给Animator。

这些事情下一章来做。

这篇关于UnityStandardAsset工程、源码分析_6_第三人称场景[玩家控制]_工程组织的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/794732

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、