我正在尝试实现基本的赛车游戏。无限赛车游戏,运动方式像地铁冲浪者。我有换车道的问题。我不想传送到其他车道,我想平稳。我是一个团结的新手,我尝试过Lerp方法,但是它不起作用。

using UnityEngine;
using System.Collections;

public class VehicleController : MonoBehaviour
{
    public float drift;
    public Vector3 positionA;
    public Vector3 positionB;
    public Vector3 positionC;
    public Vector3 positionD;

    private Transform tf;
    private Rigidbody rb;
    private Vector3 vehiclePos;

    void Awake()
    {
        //rb = GetComponent<Rigidbody> ();
        tf = transform;
    }

    void Update()
    {
        vehiclePos = tf.position;

        if (Input.GetKey( KeyCode.Space ))
            DecreaseSpeed ();
        else
            IncreaseSpeed ();

        if (Input.GetKeyDown (KeyCode.A))
        {
            MoveToRight ();
            Debug.Log( "Move to Right!" );
        }

        if (Input.GetKeyDown (KeyCode.D))
        {
            MoveToLeft ();
            Debug.Log( "Move to Left!" );
        }
    }

    void FixedUpdate()
    {
        tf.Translate (Vector3.forward * speed * Time.deltaTime);//My Movement Method.
    }

    void MoveToLeft()
    {
        if (vehiclePos.position.x == positionA.x)
            vehiclePos = Vector3.Lerp (vehiclePos.position, positionB, Time.deltaTime * drift);
    }

    void MoveToRight()
    {
        if (vehiclePos.position.x == positionB.x)
            vehiclePos = Vector3.Lerp (vehiclePos.position, positionA, Time.deltaTime * drift);
    }
}

最佳答案

第一:不要对position.x使用==,因为它是一个浮点(十进制)值,在这种情况下,返回“ true”的情况很少。 Here's some info about comparing floats.

第二:看起来好像您没有在任何地方将实际位置与vehiclePos连接起来。 transform.position是您想要的。

第三:Input.GetAxis()是一种处理方向输入的更干净的方法。不必专门调出每个按钮,您只能处理一个介于-1和1之间的浮点值。它还使您可以轻松地重新配置键。

第四:在无尽的奔跑者中,让世界朝着您的角色和照相机移动比让角色和照相机实际向前移动更好。随着您进一步远离零,浮点数的精度会降低,因此,如果可以的话,应该使您的操作相对接近世界原点(0,0,0)。

如果您想按一次按钮来更改车道,则应保留一个整数变量,该变量将保存您当前所在的车道。如果您按LEFT键,则减一,如果您按RIGHT键,则加一。您还应该添加检查以确保其保持在所需范围内。

然后在Update()中,您只需要始终将Lerp移向该X值即可。如果需要,可以使用Mathf.Lerp一次仅保留一个变量。

public int laneNumber = 0;
public int lanesCount = 4;
bool didChangeLastFrame = false;
public float laneDistance = 2;
public float firstLaneXPos = 0;
public float deadZone = 0.1f;
public float sideSpeed = 5;

void Update() {
    //"Horizontal" is a default input axis set to arrow keys and A/D
    //We want to check whether it is less than the deadZone instead of whether it's equal to zero
    float input = Input.GetAxis("Horizontal");
    if(Mathf.Abs(input) > deadZone) {
        if(!didChangeLastFrame) {
            didChangeLastFrame = true; //Prevent overshooting lanes
            laneNumber += Mathf.roundToInt(Mathf.Sign(input));
            if(laneNumber < 0) laneNumber = 0;
            else if(laneNumber >= lanesCount) laneNumber = lanesCount - 1;
        }
    } else {
        didChangeLastFrame = false;
        //The user hasn't pressed a direction this frame, so allow changing directions next frame.
    }

    Vector3 pos = transform.position;
    pos.x = Mathf.Lerp(pos.x, firstLandXPos + laneDistance * laneNumber, Time.deltaTime * sideSpeed);
    transform.position = pos;
}


您可能只是按原样使用此代码,但是我建议您仔细研究一下,并尝试了解其工作方式和原因。今天一直在努力提高自己技能的新手下周可以做一些令人惊奇的事情。希望这可以帮助。 :)

关于c# - 如何顺利改变车道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29184972/

10-12 04:40