UnityStandardAsset工程、源码分析_2_赛车游戏[玩家控制]_车辆核心控制

使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (一)之赛车游戏总体介绍 我之前一直在做C# 的Winform多媒体软件开发。从去年十一月份开始转型自学Unity3D。发现对这个领域、这个方向更为喜爱。在经过两个多月的跟书自学、跟游戏实例教程练习之后,决定自己完成一款游戏,以融会贯通,让我对整体的Unity3D游戏开发有一个认识与提升。我最后选择了赛车游戏,其一是这个我更为喜欢、其二对当时的我来说,我觉得这个更具挑战性、却也容易入门。本文章先对游戏整体进行介绍。 阅读详情

上一章地址:UnityStandardAsset工程、源码分析_1_赛车游戏[玩家控制]_输入系统

在上一章里,我们了解了整个车辆控制的大体流程,并且分析了一下输入系统,也就是从玩家的手柄\手机倾斜输入作用到车辆核心控制逻辑的过程中,调用了那些类,这些类又是怎样协同工作的。那么这章我们来分析车辆最主要的核心控制逻辑,车辆如何使用调整好的输入数据,根据当前车辆状态,计算出下一帧的车辆状态。

核心控制逻辑

上一章里,我们了解到,车辆核心状态的控制一共使用了三个类,分别为CarController、CarUserControl、CarAudio。其中,CarController是核心控制逻辑,CarUserControl是用户输入接口,负责调用CarController中的Move方法进行状态更新。CarController调用CarAudio和车辆轮胎效果控件来实现各种效果。

private void FixedUpdate()
{
   
   
    float h = CrossPlatformInputManager.GetAxis("Horizontal");	// 上章分析的内容
    float v = CrossPlatformInputManager.GetAxis("Vertical");

#if !MOBILE_INPUT
    float handbrake = CrossPlatformInputManager.GetAxis("Jump");
    m_Car.Move(h, v, v, handbrake);	// 这章重点分析的内容
#else
    m_Car.Move(h, v, v, 0f);
#endif
}

分析完了CarUserControl的内容,可以发现它每一帧都从输入类中读取数据,再使用这些数据调用CarController的Move方法,我们这章就来分析CarController的最主要的方法Move,看看为了更新车辆状态,CarController都做了哪些工作。

先看Move的定义

public void Move(float steering, float accel, float footbrake, float handbrake);

steering是舵值,accel是加速值,footbrake脚刹,handbrake脚刹

函数首先调用了如下过程,用于同步Mesh与碰撞盒的转向状态:

// WheelCollider和轮胎的Mesh是两个东西
// 所以碰撞盒的Steer变化,也就是轮胎转向时,Mesh是不会发生转向的
// 所以需要再这里根据碰撞盒的转向数据重新设置Mesh的转向
// 使得外观上看起来轮胎旋转了一样
for (var i = 0; i < 4; i++)
{
   
   
    Quaternion quat;
    Vector3 position;
    m_WheelColliders[i].GetWorldPose(out position, out quat);   // 获取碰撞盒的世界坐标和世界转向
    m_WheelMeshes[i].transform.position = position; // 设置Mesh的转向和位置
    m_WheelMeshes[i].transform.rotation = quat;
}

再调用如下过程处理输入数据,使其符合规范:

// Steer直译为舵,也就是方向盘
// steering为[-1,1]上的值,而在WheelCollider上读取时需要将这个值映射到[-m_MaximumSteerAngle,m_MaximumSteerAngle]上
// 也就是以角度的形式来描述轮胎的转向程度,并且旋转的角度最大值为m_MaximumSteerAngle

// 在这里的一系列Clamp是在将输入数据调整到可接受的范围内
// clamp input values
steering = Mathf.Clamp(steering, -1, 1);    // 舵输入
AccelInput = accel = Mathf.Clamp(accel, 0, 1);  // 加速输入
BrakeInput = footbrake = -1*Mathf.Clamp(footbrake, -1, 0);  // 倒车输入
handbrake = Mathf.Clamp(handbrake, 0, 1);   // 手刹,暂时不知道输入来自哪里

根据输入的舵值让碰撞盒的舵值改变:

// 这里就是上面所说的将值[-1,1]映射到角度上
// Set the steer on the front wheels.
// Assuming that wheels 0 and 1 are the front wheels.
m_SteerAngle = steering*m_MaximumSteerAngle;
m_WheelColliders[0
UnityStandardAsset工程、源码分析_3_赛车游戏[玩家控制]_特效、声效 上一章地址:UnityStandardAsset工程、源码分析_2_赛车游戏[玩家控制]_车辆核心控制 在上一章的分析中,有这么一段代码: // 播放轮胎烟雾,粒子效果等脚本下章分析 m_WheelEffects[i].EmitTyreSmoke(); // 避免有多个轮胎同时播放声音,如果有轮胎播放了,这个轮胎就不播放了 // avoiding all four tires screeching at the same time // if they do it can lead to some str 阅读详情

相关推荐

UnityStandardAsset工程、源码分析_1_赛车游戏[玩家控制]_输入系统

前言   好久没写博客了。最近在做demo,感觉在游戏架构设计方面遇到了瓶颈。在大学这几年里我基本是在全程造轮子,没有去阅读和分析别人写的源码,导致我缺少横向比较,甚至不知道自己的设计是否存在问题。这几天终于能沉下心来读一读别人的代码,查缺补漏,并且吸取一下别人的经验。   不过好的unity开源项目还挺难找的,要么就是像这样设计得过于简陋,要么就是像OpenRA那样有点杂七杂八。最后还是选定了Unity的StandardAsset,简略看了一下,还是有点东西的。   不知道能写到什么程度,反正写一点是一点

t61789的博客 1677

UnityStandardAsset工程、源码分析_4_赛车游戏[玩家控制]_摄像机控制

上一章地址:UnityStandardAsset工程、源码分析_3_赛车游戏[玩家控制]_特效、声效 经过前几章的分析,我们已经大致地了解了车辆控制相关的脚本。现在还有最后一个与玩家体验息息相关的部分——摄像机。 Unity一共设计了三种类型的摄像机,通过左上角的摄像机按钮切换: 跟踪摄像机 自由摄像机 闭路电视(CCTV)摄像机 而在场景中的摄像机分布是这样的: 可见,这三个摄像机同时存在于场景中,而切换的方式是将其他两个不需要的摄像机设为非活动,而独开启需要的摄像机。用于切换的脚本Simpl

t61789的博客 1582

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

在前几章(1-5),我们完整地分析了车辆场景,包括玩家控制和AI控制的全部机制。现在我们来分析StandardAsset里的另一个场景:第三人称场景 不过由于场景所用到的系统有很多是和车辆场景重复的,也就是说StandardAsset的各个场景共用一套包括输入系统在内的框架,所以我们对于接下来的场景的分析不会像车辆场景一样长达五章,我们仅分析每个场景内最特殊的部分,例如这个第三人称场景,我们将分析人物的控制逻辑,动画的播放等部分 第三人称场景 ...

t61789的博客 860

飞车-源代码UNITY

using System.Collections;using System.Collections.Generic;using UnityEngine;using DG.Tweening;using RGSK;public class TestCar_Controller : MonoBehaviour{ public Rigidbody rigidBody; public Camera cam_Car; public Collider car_Collider; public Tr

xdpcxq1029的博客 1678

使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (六)之自动寻路及优化

一.综述赛车游戏的敌人赛车自动寻路一般有两种方式,一种是路点寻路,另外一种就是使用Unity自带组件NavMeshAgent进行寻路了,我介绍的是后者,另外后者在水平面上的汽车寻路导航还不错,但是一旦有Y方向的爬坡、下坡等,汽车就会因为角度依然保持水平显得很不自然,并且轮胎也不会旋转,我对此进行了优化二.NavMeshAgent这个和NavMesh是一对,用来设置寻路的游戏对象。关于属性,我不再一一

narutojzm1的博客 1万+

UnityStandardAsset工程、源码分析_5_赛车游戏[AI控制]_AI机制

上一章地址: UnityStandardAsset工程、源码分析_4_赛车游戏[玩家控制]_摄像机控制 前几章我们已经将赛车游戏的绝大多数机制分析过了,而Unity还提供了不同的操控模式——AI控制。正如其名,是由AI来代替玩家进行控制,车辆自动绕场地行驶。AI控制的场景大体与玩家控制的场景相似,所以重复的部分不再赘述,我们着重分析AI相关的机制。 AI控制 ...

t61789的博客 2697

Unity赛车游戏资源+源码

赛车游戏资源加源码,多个场景,多个赛车,多种模式,可以学习

Unity赛车游戏源码

Unity 赛车游戏 工程源码

Unity赛车游戏资源+源码 多个场景,多个赛车,多种模式

Unity赛车游戏资源+源码 多个场景,多个赛车,多种模式 赛车游戏资源加源码,多个场景,多个赛车,多种模式,可以学习

Unity 搭建一款联网多人 VR 赛车游戏1

(4)使用 RealisticCarController 实现真实的赛车行为 (5)使用 SmartAI 实现电脑赛车对手 (6)使用智能硬件 Ardunio

Livox-avia+FAST-LIO麻瓜使用教程

激光雷达 SLAM Fastlio 安装

aaaaaaaaaww12的博客 3676

液态神经网络系列(四) | 一条 PyTorch 从零搭建 LTC 细胞

本文详细介绍了如何从零开始用PyTorch实现Liquid Time-constant Networks(LTC)神经元模型。首先将LTC的核心微分方程拆解为输入电导、系统时间常数和数值积分器三个模块,然后逐步构建LTCCell类,包括物理参数初始化、突触参数设置和前向演化过程。文章还展示了如何封装LTCModel处理不规则时间序列,并通过正弦波抗干扰实验验证了LTC模型的优越性。最后讨论了数值稳定性、计算代价等实现细节,并预告了下一篇将探讨使用伴随灵敏度算法优化显存占用的方法。

wyj333333的博客 2067

无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误怎么解决

本文的内容是无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误的解决办法。

西岸贤 1万+

M×N扫描序列图像拼接、大视场图像拼接、全景图像拼接、2D网格拼图方法、累计误差消除(显微图像/航拍图像等)

M×N序列图像完整拼接方法前言一、最朴实的一般方法二、广度优先搜索算法1.引入库2.读入数据整体路径优化算法 前言 1、网上有很多介绍图像两两拼接的算法,但是缺少对M×N张子图两两相对位置关系获得整体误差较小,肉眼下无明显错位的完整图像的算法实现。 2、由于拼接算法的不稳定可能会产生不同程度的误差,那么如何需要选择(搜索)误差较小拼接路径。 一、最朴实的一般方法 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、广度优先搜索算法 1.引入库 代码如下(示

qq_37764141的博客 5407

uniapp - 超详细实现播放 svg / svga 格式动画组件插件,用于直播间赠送礼物特效动画或项目动画特效较多的应用(新手小白保姆级教程,提供插件+详细运行示例+使用文档+注意事项+格式说明)

uniappsvga,uniapp播放svga动画,uniapp中使用svga动画详细教程,uniapp播放svga的插件,uniapp有没有调用svga格式动画的组件插件,uinappH5App小程序全端兼容的svga播放器免费好用插件,uniapp好用的svga格式动画插件,在uniapp中使用SVGAPlayer播放svga动画,uniapp中使用svga动画,编译到apph5,uniapp运行svg动画,uniapp怎么使用svga文件格式,uniapp播放svg格式的动画教程,un

🏆 前端领域优质创作者 1万+

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1629

Android11车机系统海外项目资源包RRO方案优化

本文介绍了汽车设置应用如何通过Android RRO(运行时资源叠加)方案实现多车型差异化资源管理。针对不同车型(国内/海外、轿车/SUV)和配置(方向盘、轮毂等),采用产品变体(productFlavors)构建不同APK版本,并通过JSON配置文件动态启用对应资源包。系统根据车辆下线配置自动匹配适用的资源叠加包,解决了硬编码判断带来的维护问题。该方案实现了资源的高效复用,同时支持灵活配置多种车型组合,为汽车行业多车型共平台开发提供了可扩展的技术实现。

shusuanly的博客 469

企业第三方应用开发概述_测试第三方应用对接企业_以及如何使用流程_Demo演示---企业微信开发002

那么第三方公司开发了应用,做为服务提供商,如果,一个企业想使用这个应用,我开发的这个应用的话,那么。其实就是给我们的应用,安装一个,使用他的企业,分配一共企业 允许这个企业使用我们的应用的功能,可以看到其实就是多了运营规范,因为,第三方应用,其实就相当于,是第三方公司开发的,程序,首先来看一下。然后再来看,这里我们选择这个公司,其实可以,选择到具体的,部门,或者是。然后我们使用一个企业的管理员账号进行,扫码,来授权,这个应用,可以。其实就是指定,我这个企业中,哪个部门,或者哪些员工,可以使用。

添柴程序猿的专栏 414

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: UnityStandardAsset工程、源码分析_1_赛车游戏[玩家控制]_输入系统
下一篇: UnityStandardAsset工程、源码分析_3_赛车游戏[玩家控制]_特效、声效
北国少年
博客等级 码龄16年 23粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值