首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方向盘控制的汽车

方向盘控制的汽车
EN

Code Review用户
提问于 2017-04-29 08:22:38
回答 1查看 1.1K关注 0票数 7

我是一个年轻的程序员,他希望在我的编码实践中有所改进,因为我的主管告诉我要研究一种更健康的编码方法。

我想问的是,如何改进我的编码结构?例如,是否使用了大量的bool来检查被认为可以接受的条件? //,而不是注释它。

PS :我不打算向我的主管提交更新的代码副本,我只是想在下一次改进自己。

PSS :我学习编码,但对于编码结构,我只被教授理论。没有编码任务。

PSSS :这里的代码是为一辆汽车在团结,可以开回来和前面使用罗技方向盘GT力。

我真的不知道该问什么,因为我被安排去实习,而且我很长一段时间都不会见我的讲师。

下面是我最近编写的代码的一个示例:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-05-03 04:18:37

简短的回答:您可以使用Dictionary<string, float>而不是声明许多float。我没有使用ArrayList,因为我们需要命名值,而不是使用index

接下来我用的是enum....why,我没有用Dictionary<string, bool>

因为enum & switch比使用Dicaryforconditions.However更好,所以如果条件相关,则应该使用Dictionary。

代码语言:javascript
复制
if(a && b && c) -> use Dictionary<string, bool>
if(a || b || c) -> use enum 

好吧,这并不令人困惑。

代码语言:javascript
复制
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可以使用折页对变量进行分组。

代码语言:javascript
复制
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;
}

将文件夹创建为编辑器,并将此脚本放入其中。

代码语言:javascript
复制
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,不知道为什么没有在代码中使用这些函数。

这是您代码的一部分,我尝试使用函数来清除和改进代码。

代码语言:javascript
复制
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;
    }
}

如果您正在寻找您应该知道的干净代码,我建议您:

面向对象程序设计

封装

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/162095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档