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

若依(RuoYi)项目里,Quartz定时任务踩坑实录:并发控制、事务回滚与异常处理

本文深入解析若依(RuoYi)项目中Quartz定时任务的并发控制、事务回滚与异常处理三大核心问题。通过实战案例揭示@DisallowConcurrentExecution注解的局限性和Redis分布式锁的应用,详细讲解Spring事务集成方案及多数据源事务管理,并提供生产级监控体系搭建指南,帮助开发者规避Quartz在生产环境中的常见陷阱。

weixin_28731223的博客 409

虚拟机安装Centos8.5

Centos8.5

weixin_63604047的博客 958

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3451

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 465

如何使用PostgreSQL数据库进行数据仓库的ETL操作

本文旨在为数据工程师、数据库管理员和分析师提供使用PostgreSQL进行数据仓库ETL操作的全面指南。ETL流程的基本原理PostgreSQL在ETL中的独特优势实际ETL实现的技术细节性能优化和最佳实践常见问题的解决方案首先介绍ETL和PostgreSQL的基本概念然后深入探讨核心技术和实现方法接着提供实际案例和代码示例最后讨论优化技巧和未来趋势ETL:提取(Extract)、转换(Transform)、加载(Load)的缩写,描述数据从源系统移动到目标数据仓库的过程。

2502_91592937的博客 873

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 552

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1524

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值