main^2
Vinny 2026-04-22 20:19:15 +08:00
parent 4937ff8a84
commit 581f8036eb
5 changed files with 132 additions and 37 deletions

View File

@ -78,18 +78,26 @@ namespace KartGame.KartSystems
public ArcadeKart.Stats baseStats = new ArcadeKart.Stats
{
TopSpeed = 10f,
Acceleration = 5f,
TopSpeed = 22.5f,
Acceleration = 8f,
AccelerationCurve = 4f,
Braking = 10f,
Braking = 12f,
ReverseAcceleration = 5f,
ReverseSpeed = 5f,
Steer = 5f,
CoastingDrag = 4f,
Grip = .95f,
ReverseSpeed = 4f,
Steer = 2f,
CoastingDrag = 0.5f,
Grip = .9f,
AddedGravity = 1f,
};
[Header("扩展系统")]
[Tooltip("手动变速箱(可选)")]
public KartManualGearbox ManualGearbox;
[Tooltip("油量系统(可选)")]
public KartFuelSystem FuelSystem;
[Tooltip("是否启用档位对速度/加速度的影响")]
public bool UseGearboxModifiers = true;
[Header("车辆视觉")]
public List<GameObject> m_VisualWheels; // 视觉轮子列表
@ -135,11 +143,11 @@ namespace KartGame.KartSystems
[Header("悬挂系统")]
[Tooltip("车身与轮子之间允许的最大伸缩长度")]
[Range(0.0f, 1.0f)]
public float SuspensionHeight = 0.2f;
public float SuspensionHeight = 0.3f;
[Range(10.0f, 100000.0f), Tooltip("数值越高,悬挂越硬")]
public float SuspensionSpring = 20000.0f;
public float SuspensionSpring = 15000.0f;
[Range(0.0f, 5000.0f), Tooltip("数值越高,车辆平衡恢复得越快")]
public float SuspensionDamp = 500.0f;
public float SuspensionDamp = 2000.0f;
[Tooltip("调整轮子相对于车身垂直位置的偏移")]
[Range(-1.0f, 1.0f)]
public float WheelsPositionVerticalOffset = 0.0f;
@ -295,6 +303,9 @@ namespace KartGame.KartSystems
// 应用增益道具计算最终属性
TickPowerups();
// 应用档位修正在TickPowerups之后确保powerup已叠加
ApplyGearboxModifiers();
// 更新刚体重心
Rigidbody.centerOfMass = transform.InverseTransformPoint(CenterOfMass.position);
@ -350,6 +361,32 @@ namespace KartGame.KartSystems
m_FinalStats.Grip = Mathf.Clamp(m_FinalStats.Grip, 0, 1);
}
/// <summary>
/// 根据当前档位修正最终速度/加速度属性仅在FixedUpdate中临时应用
/// </summary>
void ApplyGearboxModifiers()
{
if (!UseGearboxModifiers || ManualGearbox == null) return;
var setting = ManualGearbox.GetCurrentSetting();
float speedMult = setting.SpeedMultiplier;
float accelMult = setting.AccelerationMultiplier;
// 倒车使用独立的倒车速度倍率
if (ManualGearbox.CurrentGear == GearMode.Reverse)
{
m_FinalStats.ReverseSpeed *= speedMult > 0f ? speedMult : 1f;
m_FinalStats.ReverseAcceleration *= accelMult;
}
else if (ManualGearbox.CurrentGear != GearMode.Neutral)
{
m_FinalStats.TopSpeed *= speedMult;
m_FinalStats.Acceleration *= accelMult;
m_FinalStats.ReverseAcceleration *= accelMult;
}
// Neutral: 不修改速度上限,但 MoveVehicle 中会把 accelerate 置 0
}
void GroundAirbourne()
{
// 在空中时下落得更快
@ -404,6 +441,22 @@ namespace KartGame.KartSystems
// 车辆移动核心逻辑
void MoveVehicle(float accelerate, bool brake, float turnInput)
{
// 引擎未启动或燃油耗尽:切断动力但保留滑行/刹车物理
bool engineCanDrive = Input.EngineOn && (FuelSystem == null || !FuelSystem.IsEmpty);
bool isNeutral = Input.CurrentGear == GearMode.Neutral;
if (!engineCanDrive)
{
accelerate = 0f;
isNeutral = true;
}
// 空挡时引擎动力不传递到车轮(仅保留滑行和刹车)
if (isNeutral)
{
accelerate = 0f;
}
// 合并加速和刹车输入
float accelInput = accelerate - (brake ? 1.0f : 0.0f);

View File

@ -11,11 +11,13 @@ namespace KartGame.KartSystems
Accelerate = this.Accelerate,
TurnInput = this.Turn,
Brake = this.Brake,
Handbrake = this.Handbrake,
CurrentGear = this.Gear,
CurrentDrive = this.DriveTrain,
LightsOn = this.Lights,
EngineOn = this.EngineActive
EngineOn = this.EngineActive,
Horn = this.Horn
};
}
}
}
}

View File

@ -1,20 +1,53 @@
using UnityEngine;
using UnityEngine;
namespace KartGame.KartSystems
{
public enum GearMode { Automatic, Manual, Neutral, Reverse }
/// <summary>
/// 车辆驱动模式(前驱/后驱/四驱)
/// </summary>
public enum DriveTrainMode { ForwardWheelDrive, RearWheelDrive, AllWheelDrive }
/// <summary>
/// 手动档位R倒车, N空挡, 1~5前进档
/// </summary>
public enum GearMode
{
Reverse = -1,
Neutral = 0,
First = 1,
Second = 2,
Third = 3,
Fourth = 4,
Fifth = 5
}
/// <summary>
/// 车辆运行状态与Animator状态机对应
/// </summary>
public enum VehicleState
{
Off = 0, // 熄火
Ignition = 1, // 点火中
Idle = 2, // 怠速
IdleAccelerate = 3,// 怠速加油(空挡轰油门)
Cruise = 4, // 巡航
CruiseBrake = 5, // 巡航刹车
Reverse = 6, // 倒车
Stuck = 7 // 陷地
}
[System.Serializable]
public struct InputData
{
public float Accelerate;
public float TurnInput;
public bool Brake;
public GearMode CurrentGear;
public float Accelerate; // 油门输入 0~1
public float TurnInput; // 转向输入 -1~1
public bool Brake; // 脚刹
public bool Handbrake; // 手刹
public GearMode CurrentGear; // 当前档位
public DriveTrainMode CurrentDrive;
public bool LightsOn; //灯光状态
public bool EngineOn; //引擎状态
public bool LightsOn; // 大灯开关
public bool EngineOn; // 引擎开关
public bool Horn; // 喇叭
}
public interface IInput
@ -24,23 +57,26 @@ namespace KartGame.KartSystems
public abstract class BaseInput : MonoBehaviour, IInput
{
[Header("Basic Controls")]
[Header("基础移动")]
public float Accelerate;
public float Turn;
public bool Brake;
public bool Handbrake;
[Header("Advanced Simulation")]
public GearMode Gear = GearMode.Automatic;
[Header("高级模拟")]
public GearMode Gear = GearMode.Neutral;
public DriveTrainMode DriveTrain = DriveTrainMode.AllWheelDrive;
public bool Lights;
public bool EngineActive = true;
public bool Horn;
// --- 基础移动控制 ---
public void SetMovement(float accel, float turn, bool brake)
public void SetMovement(float accel, float turn, bool brake, bool handbrake = false)
{
this.Accelerate = accel;
this.Turn = turn;
this.Brake = brake;
this.Handbrake = handbrake;
}
// --- 档位控制 ---
@ -67,6 +103,12 @@ namespace KartGame.KartSystems
this.EngineActive = state;
}
// --- 喇叭控制 ---
public void SetHorn(bool state)
{
this.Horn = state;
}
public abstract InputData GenerateInput();
}
}
}

View File

@ -1,3 +1,4 @@
#if ENABLE_INPUT_SYSTEM
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
@ -31,4 +32,5 @@ namespace NLD.Nodes
outputY.value = pos.y;
}
}
}
}
#endif

View File

@ -1,18 +1,18 @@
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using KartGame.KartSystems; // 确保指向你的载具命名空间
using KartGame.KartSystems;
namespace NLD.Nodes
{
[Category("VehicleControl")]
[Description("将 NodeCanvas 黑板中的数据实时同步到 BaseInput 抽象层")]
[Description("将 NodeCanvas 黑板中的数据实时同步到 BaseInput 抽象层(含手动档、手刹、喇叭)")]
public class SetVehicleInput : ActionTask<BaseInput>
{
[RequiredField]
public BBParameter<float> accelerate;
public BBParameter<float> turn;
public BBParameter<bool> brake;
public BBParameter<bool> handbrake;
[Header("档位和传动")]
public BBParameter<GearMode> gear;
@ -21,21 +21,17 @@ namespace NLD.Nodes
[Header("电气与启停")]
public BBParameter<bool> headlights;
public BBParameter<bool> engineOn;
public BBParameter<bool> horn;
// OnUpdate 会在行为树运行到该节点时每帧执行
protected override void OnUpdate() {
if (agent == null) return;
// 1. 同步基础移动
agent.SetMovement(accelerate.value, turn.value, brake.value);
// 2. 同步档位与驱动
agent.SetMovement(accelerate.value, turn.value, brake.value, handbrake.value);
agent.SetGear(gear.value);
agent.SetDriveMode(driveMode.value);
// 3. 同步其他系统
agent.SetLights(headlights.value);
agent.SetEngineStatus(engineOn.value);
agent.SetHorn(horn.value);
}
}
}
}