ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 内置变量 Ship框架内置了很多变量,方便直接读取和调用。内置变量比较标准的叫法是:类的(成员)属性 在编写过程中,我遵守的规范是: >[danger] 外部可以访问的变量都统一写在Ship类的顶部,并做了分类和注释 目前所有变量如下: ``` // ----- 静态属性 ----- public static int timetick; //帧计时器。注意:这是一个静态变量,使用Ship.timetick访问它,它是这个类共有的变量而不是某个实例化后的飞船特有的。 // ----- 方块类变量 ----- public IMyShipController Cockpit; public IMyShipConnector Connector; public IMyShipConnector MotherConnector; public List<IMyLargeTurretBase> AutoWeapons = new List<IMyLargeTurretBase>(); public List<IMySmallGatlingGun> GatlingGuns = new List<IMySmallGatlingGun>(); public List<IMySmallMissileLauncher> RocketLaunchers = new List<IMySmallMissileLauncher>(); public List<IMyCameraBlock> Cameras = new List<IMyCameraBlock>(); public List<IMyGyro> Gyroscopes = new List<IMyGyro>(); public List<IMyThrust> Thrusts = new List<IMyThrust>(); public List<string> ThrustField = new List<string>(); public List<string> gyroYawField = new List<string>(); public List<string> gyroPitchField = new List<string>(); public List<string> gyroRollField = new List<string>(); public List<float> gyroYawFactor = new List<float>(); public List<float> gyroPitchFactor = new List<float>(); public List<float> gyroRollFactor = new List<float>(); // ---- 必要配置变量 ---- public string Debug = "Normal"; //错误报告,通过这个变量判断是否初始化成功 // ----- 运动信息和相关变量 ----- public Vector3D Position; public Vector3D Velocity; public Vector3D Acceleration; public double Diameter; // ---- 瞄准PID算法参数 ------ public double AimRatio = 3; //瞄准精度,单位:度。用来是否瞄准,以便其他动作判断。不影响瞄准的效率。当瞄准块的正前方向量与瞄准块和目标的连线向量夹角小于这个值时,整个系统判定瞄准了目标。 public int AimPID_T = 5; //PID 采样周期(单位:帧),周期越小效果越好,但太小的周期会让积分系数难以发挥效果 public double AimPID_P = 0.8; //比例系数:可以理解为整个PID控制的总力度,建议范围0到1.2,1是完全出力。 public double AimPID_I = 3; //积分系数:增加这个系数会让静态误差增加(即高速环绕误差),但会减少瞄准的震荡。反之同理 public double AimPID_D = 10; //微分系数:增加这个系数会减少瞄准的震荡幅度,但会加剧在小角度偏差时的震荡幅度。反之同理 ``` 需要说明的是关于推进器和陀螺仪的调用和处理方法: >[danger] 1、请在Main函数中每一帧都让Ship.timetick += 1 >这是一个静态变量,使用类名前缀来访问它,它用来记录帧,相当于时钟,用处非常多。 >[danger] 2、在推进器变量Thrusts下附带了一个ThrustField变量。 >在Ship实例化的过程中,它会自动处理所有推进器和主控的方向关系。 >并生成一个与Thrusts同样长的数组来储存这个关系。 >当你需要知道推进器Thrusts[5]相对主控座椅的方向时,直接访问ThrustField[5]即可。 >Ship框架内部对陀螺仪的操作也是基于这个方法。