在某些x坐标处旋转化身

Rei*_*oij 2 c# unity-game-engine

我将头像转至地图上的某个位置时遇到问题。角色来回移动,但他不想在我输入的坐标处旋转。我究竟做错了什么?

这是我的代码:

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AvatarPingPong : MonoBehaviour {

    // Use this for initialization
    public float speed;
    public float startXCord, endXCord;
    float endTrunx, startTurnx;

    public GameObject obj;
    Vector3 EndPoint, StartPoint;


    void Start () {
        EndPoint = transform.position;
        endXCord = EndPoint.x;
        endTrunx = EndPoint.x - 2f;

        StartPoint = transform.position;
        StartPoint.x = startXCord;
        startTurnx = StartPoint.x + 2f;
    }


    // Update is called once per frame
    void Update () {

        transform.position = new Vector3(PingPong (Time.time * speed, startXCord, endXCord ), transform.position.y, transform.position.z);

        if (transform.position.x == startTurnx ) {
            Debug.Log("start Check");
            obj.transform.Rotate(0f, 180f, 0f);
        }

        if (transform.position.x == endTrunx ) {
            obj.transform.Rotate(0f, 180f, 0f);
            Debug.Log("einde check");
        }

    }

    //function to change the default starting value of (0, 0, 0) to any value
    float PingPong(float t, float minLength, float maxLength) {
        return Mathf.PingPong(t, maxLength-minLength) + minLength;
    }   
}
Run Code Online (Sandbox Code Playgroud)

ash*_*eek 5

我认为问题在于,一旦他到达了特定的x坐标,您就尝试翻转化身,但是他可能永远也不会到达该EXACT坐标。if (transform.position.x == startTurnx)仅当两个值完全相同并且您的虚拟形象实际上在整个屏幕上移动不流畅时,才会返回true。实际上,他每一帧都在跳分钟数,所以他可能永远也不会落在那一点上。

相反,我的建议是将他的新位置与他的旧位置进行比较,以查看他的行进方向并在改变方向时翻转他。一些代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AvatarPingPong : MonoBehaviour {

    // Use this for initialization
    public float speed;
    public float startXCord, endXCord;
    float endTrunx, startTurnx;

    public GameObject obj;
    Vector3 EndPoint, StartPoint;

    //I'm going to assume you start it moving left. You may have to change this
    bool goingLeft = false;


    void Start () {
        EndPoint = transform.position;
        endXCord = EndPoint.x;
        endTrunx = EndPoint.x - 2f;

        StartPoint = transform.position;
        StartPoint.x = startXCord;
        startTurnx = StartPoint.x + 2f;
    }


    // Update is called once per frame
    void Update () {
        float prevX = transform.position.x;
        float newX = PingPong (Time.time * speed, startXCord, endXCord );
        transform.position = new Vector3(newX, transform.position.y, transform.position.z);


        if (newX > prevX) {
            //avatar is moving to the right, check to see if that's the direction it was going last Update
            if (goingLeft) {
                Debug.Log("Flipping Right");
                obj.transform.Rotate(0f, 180f, 0f);
                goingLeft = false;
            }
        }else if (newX < prevX){
            //avatar is moving to the left, check to see it that's the direction it was going last Update
            if (!goingLeft) {
                Debug.Log("Flipping Left");
                obj.transform.Rotate(0f, 180f, 0f);
                goingLeft = true;
            }
        }

    }

    //function to change the default starting value of (0, 0, 0) to any value
    float PingPong(float t, float minLength, float maxLength) {
        return Mathf.PingPong(t, maxLength-minLength) + minLength;
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • @ReiniervanRooij如果它对您有用,请不要忘记接受(https://meta.stackexchange.com/a/5235)他的回答。 (2认同)