为什么当按下Z键时船舶快速向上移动而不是向前移动?

时间:2016-09-20 21:07:43

标签: c# unity3d

我可以使用W S A D或箭头键来转动船只。但当我按下Z时,船快速向上移动。当我按下X时,它将使船停在原位。

我无法弄清楚如何让船继续前进。

但没有任何东西可以让船继续前进。

我使用了一个断点,我在Space中的SpacecraftControl脚本中看到:

Debug.Log("Transform forward is : " + transform.forward);

我将鼠标光标放在变换的前方,我看到:0.0,1.0,0.0 在前方内部我看到:x = 0 y = 0且z = -1.192093E-07

这是我现在录制的一个小短视频片段,显示了在运行游戏然后按Z时会发生什么。 请观看Z按下从第二个14开始的所有视频。

Video Clip

在我的船舶检查员中,我有:变换,局部旋转,网格滤镜,网格渲染器,动画师,刚体>重力不受控制,网格对撞机>检查凸面和脚本:Spacecraft Control和UserInput。

Ship

然后在菜单中我去了:编辑>项目设置>输入

在输入中,我添加了一个大小为19的新地方。并称为新轴:节流

Throttle

脚本首先是SpacecraftControl:

using UnityEngine;
using System.Collections;


[RequireComponent(typeof(Rigidbody))]
public class SpacecraftControl : MonoBehaviour 
{
    public float MaxEnginePower = 40f;
    public float RollEffect = 50f;
    public float PitchEffect = 50f;
    public float YawEffect = 0.2f;
    public float BankedTurnEffect = 0.5f;
    public float AutoTurnPitch = 0.5f;
    public float AutoRollLevel = 0.1f;
    public float AutoPitchLevel = 0.1f;
    public float AirBreaksEffect = 3f;
    public float ThrottleChangeSpeed = 0.3f;
    public float DragIncreaseFactor = 0.001f;


    private float Throttle;
    private bool AirBrakes;
    private float ForwardSpeed;
    private float EnginePower;
    private float cur_MaxEnginePower;
    private float RollAngle;
    private float PitchAngle;
    private float RollInput;
    private float PitchInput;
    private float YawInput;
    private float ThrottleInput;

    private float OriginalDrag;
    private float OriginalAngularDrag;
    private float AeroFactor = 1;
    private bool Immobolized = false;
    private float BankedTurnAmount;
    private Rigidbody _rigidbody;
    Collider[] cols;

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody> ();

        OriginalDrag = _rigidbody.drag;
        OriginalAngularDrag = _rigidbody.angularDrag;

        for (int i = 0; i < transform.childCount; i++) 
        {
            foreach (var componentsInChild in transform.GetChild(i).GetComponentsInChildren<WheelCollider>()) 
            {
                componentsInChild.motorTorque = 0.18f;

            }
        }
        Debug.Log("Transform forward is : " + transform.forward);
    }

    public void Move(float rollInput, float pitchInput, float yawInput, float throttleInput, bool airBrakes)
    {
        this.RollInput = rollInput;
        this.PitchInput = pitchInput;
        this.YawInput = yawInput;
        this.ThrottleInput = throttleInput;
        this.AirBrakes = airBrakes;

        ClampInput ();
        CalculateRollandPitchAngles ();
        AutoLevel ();
        CalculateForwardSpeed ();
        ControlThrottle ();
        CalculateDrag ();
        CalculateLinearForces ();
        CalculateTorque ();

        if (Throttle < 0.1f) 
        {
            Vector3 currentVelocity = _rigidbody.velocity;
            Vector3 newVelocity = currentVelocity * Time.deltaTime;
            _rigidbody.velocity = currentVelocity - newVelocity;
        }
    }

    void ClampInput()
    {
        RollInput = Mathf.Clamp (RollInput, -1, 1);
        PitchInput = Mathf.Clamp (PitchInput, -1, 1);
        YawInput = Mathf.Clamp (YawInput, -1, 1);
        ThrottleInput = Mathf.Clamp (ThrottleInput, -1, 1);
    }

    void CalculateRollandPitchAngles()
    {
        Vector3 flatForward = transform.forward;
        flatForward.y = 0;

        if (flatForward.sqrMagnitude > 0) 
        {
            flatForward.Normalize ();

            Vector3 localFlatForward = transform.InverseTransformDirection (flatForward);
            PitchAngle = Mathf.Atan2 (localFlatForward.y, localFlatForward.z);

            Vector3 flatRight = Vector3.Cross (Vector3.up, flatForward);

            Vector3 localFlatRight = transform.InverseTransformDirection (flatRight);

            RollAngle = Mathf.Atan2 (localFlatRight.y, localFlatRight.x);
        }
    }

    void AutoLevel()
    {
        BankedTurnAmount = Mathf.Sin (RollAngle);

        if (RollInput == 0) 
        {
            RollInput = -RollAngle * AutoRollLevel;
        }

        if (PitchInput == 0f) 
        {
            PitchInput = -PitchAngle * AutoPitchLevel;
            PitchInput -= Mathf.Abs (BankedTurnAmount * BankedTurnAmount * AutoTurnPitch);
        }
    }

    void CalculateForwardSpeed()
    {
        Vector3 localVelocity = transform.InverseTransformDirection (_rigidbody.velocity);

        ForwardSpeed = Mathf.Max (0, localVelocity.z);
    }

    void ControlThrottle()
    {
        if (Immobolized) 
        {
            ThrottleInput = -0.5f;
        }

        Throttle = Mathf.Clamp01 (Throttle + ThrottleInput * Time.deltaTime * ThrottleChangeSpeed);

        EnginePower = Throttle * MaxEnginePower;
    }

    void CalculateDrag()
    {
        float extraDrag = _rigidbody.velocity.magnitude * DragIncreaseFactor;
        //_rigidbody.drag = (AirBrakes ? (OriginalDrag + ) * AirBreaksEffect : OriginalDrag * extraDrag);
        _rigidbody.drag = AirBrakes ? (OriginalDrag * AirBreaksEffect) : OriginalDrag;
        _rigidbody.drag *= extraDrag;

        _rigidbody.angularDrag = OriginalAngularDrag * ForwardSpeed / 1000 + OriginalAngularDrag;
    }

    void CalculateLinearForces()
    {
        Vector3 forces = Vector3.zero;

        forces += EnginePower * transform.forward;

        _rigidbody.AddForce (forces);
    }

    void CalculateTorque()
    {
        Vector3 torque = Vector3.zero;

        torque += PitchInput * PitchEffect * transform.right;
        torque += YawInput * YawEffect * transform.up;
        torque += -RollInput * RollEffect * transform.forward;
        torque += BankedTurnAmount * BankedTurnEffect * transform.up;

        _rigidbody.AddTorque (torque * AeroFactor);
    }

    public void Immobilize()
    {
        Immobolized = true;
    }

    public void Reset()
    {
        Immobolized = false;
    }
}

UserInput脚本:

using UnityEngine;
using System.Collections;

public class UserInput : MonoBehaviour {

    SpacecraftControl _spacecraftcontrol;


    // Use this for initialization
    void Start () 
    {

        _spacecraftcontrol = GetComponent<SpacecraftControl> ();


    }

    void FixedUpdate()
    {
        float roll = Input.GetAxis ("Horizontal");
        float pitch = Input.GetAxis ("Vertical");
        bool airBrakes = Input.GetButton ("Fire1");
        float throttle = Input.GetAxis ("Throttle");

        _spacecraftcontrol.Move (roll, pitch, 0, throttle, airBrakes);
    }
}

0 个答案:

没有答案