73 lines
1.4 KiB
C#
73 lines
1.4 KiB
C#
|
using Godot;
|
||
|
using System;
|
||
|
|
||
|
[Tool]
|
||
|
public class TrainCar : Spatial
|
||
|
{
|
||
|
public float Length => Box.Depth;
|
||
|
|
||
|
[Export]
|
||
|
private NodePath _boxNode;
|
||
|
|
||
|
[Export]
|
||
|
private NodePath[] _bogiePaths;
|
||
|
|
||
|
[Export]
|
||
|
private float Wheelbase
|
||
|
{
|
||
|
get => _wheelbase;
|
||
|
set
|
||
|
{
|
||
|
_wheelbase = value;
|
||
|
if (Engine.EditorHint)
|
||
|
{
|
||
|
SetBogeyPositions();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
private float _wheelbase;
|
||
|
|
||
|
private readonly Spatial[] _bogies = new Spatial[2];
|
||
|
|
||
|
private CSGBox _box;
|
||
|
private CSGBox Box
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_box == null)
|
||
|
{
|
||
|
_box = GetNode<CSGBox>(_boxNode);
|
||
|
}
|
||
|
return _box;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void _Ready()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public override void _Process(float delta)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private void SetBogeyPositions()
|
||
|
{
|
||
|
|
||
|
if (Wheelbase > Length)
|
||
|
throw new Exception("wheelbase cannot be longer than car length");
|
||
|
|
||
|
if (_bogiePaths.Length != 2)
|
||
|
throw new Exception("_bogeyPaths should be of length 2");
|
||
|
|
||
|
for (int i = 0; i < 2; i++)
|
||
|
{
|
||
|
_bogies[i] = GetNode<Spatial>(_bogiePaths[i]);
|
||
|
}
|
||
|
|
||
|
var axis = Vector3.Forward * Wheelbase;
|
||
|
_bogies[0].Translation = axis * 0.5f;
|
||
|
_bogies[1].Translation = axis * -0.5f;
|
||
|
}
|
||
|
}
|