个人主页:@元宇宙-秩沅
hallo 欢迎 点赞 收藏⭐ 留言 加关注✅!
本文由 秩沅 原创
收录于专栏:Unity游戏demo
–
️版本: Unity2021
️适合人群:Unity初学者
️学习目标:3D赛车游戏的基础制作
️技能掌握:
问题集结
问题1:放置模型时 为什么有紧贴地面和 随机再空中的两种情况——Mesh colider的存在
问题2:为啥会被弹飞——质量太小被车轮顶飞
问题3:车辆为啥会抖动——未添加BoxColider碰撞器或者四个车轮碰撞器的位置不一致
要加一个车身Bosch leader碰撞器就不会抖动了
知识百科:什么是扭矩?
扭矩是指发动机运转时从曲轴端输出的平均力矩,俗称为发动机的“转劲”,是 发动机性能 的一个重要参数,扭矩越大,发动机输出的“劲”越大,曲轴转速的变化也越快,汽车的爬坡能力、起步速度和加速性也越好。
public class WheelMove : MonoBehaviour
{
//四个轮子的碰撞器
public WheelCollider[] wheels ;
//扭矩力度
public float motorflaot = 200f;
//转向力度
public float steerflaot = 20f;
//初始化三维向量和四元数
private Vector3 wheelPosition = Vector3.zero;
private Quaternion wheelRotation = Quaternion.identity;
private void FixedUpdate()
{
wheelsAnimation();
//垂直轴不为0时
if (Input.GetAxis("Vertical") != 0) //当按下WS键时生效
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = Input.GetAxis("Vertical") *motorflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = 0;
}
}
//水平轴不为0时
if (Input.GetAxis("Horizontal") != 0) //当按下AD键时生效
{
for (int i = 0; i < wheels.Length - 2 ; i++) //只针对前轮
{
wheels[i].steerAngle = Input.GetAxis("Horizontal") * steerflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length - 2; i++) //只针对前轮
{
wheels[i].steerAngle = 0;
}
}
}
}
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
//车轮动画相关
public void wheelsAnimation()
{
for (int i = 0; i < wheels.Length ; i++)
{
//获取当前空间的车轮位置 和 角度
wheels[i].GetWorldPose(out wheelPosition, out wheelRotation);
//赋值给
wheelMesh[i].transform.position = wheelPosition;
print(wheelRotation);
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
}
}
将车轮的网格模型他的位置和车轮碰撞器的空间位置和空间旋转角度相同步。达到车轮的滚动和转向动画效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 车轮的运动和动画相关
//___________创建者:_______秩沅________
//_____________________________________
//-------------------------------------
public class WheelMove : MonoBehaviour
{
//四个轮子的碰撞器
public WheelCollider[] wheels ;
//网格的获取
public GameObject[] wheelMesh;
//扭矩力度
public float motorflaot = 200f;
//转向力度
public float steerflaot = 20f;
//初始化三维向量和四元数
private Vector3 wheelPosition = Vector3.zero;
private Quaternion wheelRotation = Quaternion.identity;
//辅助变量
private Vector3 off;
private void FixedUpdate()
{
wheelsAnimation();
//垂直轴不为0时
if (Input.GetAxis("Vertical") != 0) //当按下WS键时生效
{
for (int i = 0; i < wheels.Length; i++)
{
//扭矩力度
wheels[i].motorTorque = Input.GetAxis("Vertical") *motorflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = 0;
}
}
//水平轴不为0时
if (Input.GetAxis("Horizontal") != 0) //当按下AD键时生效
{
for (int i = 0; i < wheels.Length - 2 ; i++) //只针对前轮
{
//转向角度
wheels[i].steerAngle = Input.GetAxis("Horizontal") * steerflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length - 2; i++) //只针对前轮
{
wheels[i].steerAngle = 0;
}
}
}
//车轮动画相关
public void wheelsAnimation()
{
for (int i = 0; i < wheels.Length ; i++)
{
//获取当前空间的车轮位置 和 角度
wheels[i].GetWorldPose(out wheelPosition, out wheelRotation);
//赋值给
wheelMesh[i].transform.position = wheelPosition;
print(wheelRotation);
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
}
}
}
【Unity每日一记】摄像机相关代码API大全
摄像机需要实现跟随。车同步移动,旋转。并且滑动鼠标滑轮可以调节与车辆之间的摄影距离。
关键API:
Quaternion.AngleAxis
Quaternion.LookRotation
Mathf.Clamp
____________________
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 相机的跟随
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class CameraFllow : MonoBehaviour
{
//目标物体
public Transform target;
//鼠标滑轮的速度
public float ScrollSpeed = 4f;
//Y轴差距参数
public float Ydictance = 0f;
public float Ymin = 0f;
public float Ymax = 4f;
//Z轴差距参数
public float Zdictance = 4f;
public float Zmin = 4f;
public float Zmax = 8f;
//相机看向的角度 和最終位置
public float angle = -25 ;
public Vector3 lookPosition;
void LateUpdate()
{
//Z轴和Y轴的距离和鼠标滑轮联系
Ydictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;
Zdictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;
//設置Y軸和x轴的滚轮滑动范围
Ydictance = Mathf.Clamp(Ydictance , Ymin ,Ymax );
Zdictance = Mathf.Clamp(Zdictance , Zmin, Zmax );
//确定好角度,四元数 * 三维向量 = 三维向量
lookPosition = Quaternion.AngleAxis(angle, target .right) * -target.forward ;
//更新位置
transform.position = target.position + Vector3.up * Ydictance - lookPosition * Zdictance ;
//更新角度
transform.rotation = Quaternion.LookRotation(lookPosition);
}
}
调节车轮碰撞器的阻力__ 若不增大轮胎的阻力,主要当车辆速度过快时。会因为。车辆打滑而失控。也会因为惯性。从而无法。自动停下。
⭐【Unity3D赛车游戏制作】【一】初步导入,资源很哇塞
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞 收藏⭐ 留言 关注✅是我持续创作,输出优质内容的最大动力!、