我是一个年轻的程序员,他希望在我的编码实践中有所改进,因为我的主管告诉我要研究一种更健康的编码方法。
我想问的是,如何改进我的编码结构?例如,是否使用了大量的bool来检查被认为可以接受的条件? //,而不是注释它。
PS :我不打算向我的主管提交更新的代码副本,我只是想在下一次改进自己。
PSS :我学习编码,但对于编码结构,我只被教授理论。没有编码任务。
PSSS :这里的代码是为一辆汽车在团结,可以开回来和前面使用罗技方向盘GT力。
我真的不知道该问什么,因为我被安排去实习,而且我很长一段时间都不会见我的讲师。
下面是我最近编写的代码的一个示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// DEBUG : Make sure when alternating between pedals, the momentum is still there
public class VehicleMovements : MonoBehaviour {
private Rigidbody vehicleRigidbody;
private Transform vehicleTransformer;
public float momentum;
private float turning;
[SerializeField]
float moveSpeed;
[SerializeField]
float reverseSpeed;
[SerializeField]
float steeringWheel;
[SerializeField]
float turningSpeed; // 1
[SerializeField]
float pedal;
[SerializeField]
float momentumMultiplier; // 1.05
[SerializeField]
float startOffSpeed; // 0.05
// Can change to private when done testing
[SerializeField]
bool isPedal;
[SerializeField]
bool isBrake;
[SerializeField]
bool hasBrakeReset;
[SerializeField]
bool stillBacking;
// Use this for initialization
void Start () {
vehicleRigidbody = GetComponent<Rigidbody>();
vehicleTransformer = GetComponent<Transform>();
reverseSpeed -= (reverseSpeed + reverseSpeed);
}
// Update is called once per frame
void FixedUpdate () {
steeringWheel = Input.GetAxis("SteeringWheel");
pedal = Input.GetAxis("Pedal");
if (pedal > 0.1)
{
hasBrakeReset = true;
isBrake = false;
stillBacking = false;
if (!isPedal)
{
momentum = startOffSpeed;
isPedal = true;
}
if (momentum <= pedal) momentum *= momentumMultiplier;
else momentum /= momentumMultiplier;
moveVehicle(moveSpeed);
}
else if (pedal >= 0 && pedal <= 0.1)
{
if (momentum > pedal) momentum /= momentumMultiplier;
else if (momentum < 0.1)
{
momentum = 0;
}
isPedal = false;
isBrake = false;
if (!stillBacking)
moveVehicle(moveSpeed);
else
moveVehicle(-moveSpeed);
}
else
{
stillBacking = true;
isPedal = false;
hasBrakeReset = false;
if (!isBrake)
{
isBrake = true;
momentum = startOffSpeed;
}
if (momentum <= -pedal) momentum *= momentumMultiplier;
else momentum /= momentumMultiplier;
moveVehicle(reverseSpeed);
}
if(pedal >= 0 && hasBrakeReset)
{
if (momentum != 0)
{
turning += ((steeringWheel * momentum) * turningSpeed);
vehicleTransformer.Rotate(transform.eulerAngles = new Vector3(0, turning, 0));
}
}
else
{
turning += -((steeringWheel * momentum) * turningSpeed);
vehicleTransformer.Rotate(transform.eulerAngles = new Vector3(0, turning, 0));
}
}
void moveVehicle(float speed)
{
var v3 = transform.forward * (momentum * speed);
v3.y = vehicleRigidbody.velocity.y;
vehicleRigidbody.velocity = v3;
}
}发布于 2017-05-03 04:18:37
简短的回答:您可以使用Dictionary<string, float>而不是声明许多float。我没有使用Array或List,因为我们需要命名值,而不是使用index。
接下来我用的是enum....why,我没有用Dictionary<string, bool>?
因为enum & switch比使用Dicaryforconditions.However更好,所以如果条件相关,则应该使用Dictionary。
if(a && b && c) -> use Dictionary<string, bool>
if(a || b || c) -> use enum 好吧,这并不令人困惑。
using UnityEngine;
using System.Collections.Generic;
public class VehicleMovements : MonoBehaviour
{
private Rigidbody vehicleRigidbody;
private Transform vehicleTransformer;
public float momentum;
private float turning;
public Dictionary<string, float> CarFloats = new Dictionary<string, float>()
{
{"steeringWheel",0},
{"turningSpeed",0},
{"pedal",0},
{"momentumMultiplier",1},
{"moveSpeed",1.5f},
{"startOffSpeed",0.05f},
};
public enum Modes { pedal , brake , hasBrakeReset,stillBacking };
public Modes modes;
void Update()
{
if(CarFloats["steeringWheel"] == 0)
{
print("hello");
}
switch (modes)
{
case Modes.pedal: print("pedal");
break;
case Modes.brake: print("brake");
break;
case Modes.hasBrakeReset: print("hasBrakeReset");
break;
case Modes.stillBacking: print("stillBacking");
break;
default: print("None");
break;
}
}
}
另一种防止混淆的方法是使用CustomEditor.you可以使用折页对变量进行分组。
using UnityEngine;
[System.Serializable]
public class VehicleMovements : MonoBehaviour
{
private Rigidbody vehicleRigidbody;
private Transform vehicleTransformer;
public float momentum;
private float turning;
//HideInInspector This allows you hide public variables in inspector
//floats
[HideInInspector]
public float reverseSpeed,
moveSpeed,
steeringWheel,
turningSpeed = 1,
pedal,
momentumMultiplier = 1.5f,
startOffSpeed = 0.05f;
[HideInInspector]
//booleans
public bool isPedal,
isBrake,
hasBrakeReset,
stillBacking;
}将文件夹创建为编辑器,并将此脚本放入其中。
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(VehicleMovements))]
[CanEditMultipleObjects()]
public class TriggerEditor : Editor
{
public bool CarFloats = true;
public bool CarBooleans = true;
override public void OnInspectorGUI()
{
//if you need DefaultInspector use this (it works like base class in overriding)
DrawDefaultInspector();
//2 space
for (int i = 0; i < 2; i++)
{
EditorGUILayout.Space();
}
//use VehicleMovements class variables
VehicleMovements targetPlayer = (VehicleMovements)target;
//grouping variables by Foldout
CarFloats = EditorGUILayout.Foldout(CarFloats, "Car Floats");
//if click
if (CarFloats)
{
targetPlayer.reverseSpeed = EditorGUILayout.Slider("ReverseSpeed", targetPlayer.reverseSpeed, 0, 100);
targetPlayer.steeringWheel = EditorGUILayout.FloatField("SteeringWheel", targetPlayer.steeringWheel);
targetPlayer.turningSpeed = EditorGUILayout.FloatField("TurningSpeed", targetPlayer.turningSpeed);
targetPlayer.pedal = EditorGUILayout.FloatField("Pedal", targetPlayer.pedal);
targetPlayer.momentumMultiplier = EditorGUILayout.FloatField("MomentumMultiplier", targetPlayer.momentumMultiplier);
targetPlayer.startOffSpeed = EditorGUILayout.FloatField("StartOffSpeed", targetPlayer.startOffSpeed);
}
//2 space
for (int i = 0; i < 2; i++)
{
EditorGUILayout.Space();
}
//grouping variables by Foldout
CarBooleans = EditorGUILayout.Foldout(CarBooleans, "Car Booleans");
if (CarBooleans)
{
targetPlayer.isPedal = EditorGUILayout.Toggle("IsPedal", targetPlayer.isPedal);
targetPlayer.isBrake = EditorGUILayout.Toggle("IsBrake", targetPlayer.isBrake);
targetPlayer.hasBrakeReset = EditorGUILayout.Toggle("HasBrakeReset", targetPlayer.hasBrakeReset);
targetPlayer.stillBacking = EditorGUILayout.Toggle("StillBacking", targetPlayer.stillBacking);
targetPlayer.isPedal = EditorGUILayout.Toggle("IsPedal", targetPlayer.isPedal);
}
}
}
但是这是使用CustomEditor的简单例子,我已经回答了一个关于CustomEditor so 这个对你有用的链接的问题

代码中明显的问题是,您有更长的FixedUpdate.I,不知道为什么没有在代码中使用这些函数。
这是您代码的一部分,我尝试使用函数来清除和改进代码。
void Start()
{
InitializeComponents();
}
void InitializeComponents()
{
vehicleRigidbody = GetComponent<Rigidbody>();
vehicleTransformer = GetComponent<Transform>();
reverseSpeed -= (reverseSpeed + reverseSpeed);
}
void FixedUpdate()
{
Axis();
CheckPedal();
}
void Axis()
{
steeringWheel = Input.GetAxis("SteeringWheel");
pedal = Input.GetAxis("Pedal");
}
void CheckPedal(){
if (pedal > 0.1)
{
BrakeReset();
}
else if (Pedal)
{
print("blah blah")
}
}
void BrakeReset()
{
hasBrakeReset = true;
isBrake = false;
stillBacking = false;
if (!isPedal)
{
momentum = startOffSpeed;
isPedal = true;
}
if (momentum <= pedal) momentum *= momentumMultiplier;
else momentum /= momentumMultiplier;
moveVehicle(moveSpeed);
}
public bool Pedal() {
if (pedal >= 0 && pedal <= 0.1)
{
return true;
} else
{
return false;
}
}如果您正在寻找您应该知道的干净代码,我建议您:

https://codereview.stackexchange.com/questions/162095
复制相似问题