Transform.position камеры не собирается в правильное положение - PullRequest
0 голосов
/ 25 апреля 2018

Всякий раз, когда я жестко кодирую позицию для камеры, она будет работать.Однако, если я попытаюсь указать положение на основе конкретного игрового объекта, на который я ссылаюсь, то положение камеры, по-видимому, переместится в совершенно случайное положение.

void Update()
 {
     if(nextScene)            //Go to next scene (+1 scene).
     {
         sceneNumber++;
         transform.position = new Vector3(scenePos[sceneNumber].position.x, scenePos[sceneNumber].position.y, scenePos[sceneNumber].position.z);
         Debug.Log("pos is " + transform.position + "scene is" + sceneNumber);

         nextScene = false;
     }

- это массив.Есть несколько сцен.Всякий раз, когда я отлаживаю, он показывает правильную сцену, однако положение x, y и z отличается от рассматриваемой сцены.

1 Ответ

0 голосов
/ 25 апреля 2018

У меня недостаточно информации о вашем коде, но вот скрипт перемещения рабочей камеры.Просто создайте пустой GameObject внутри сцены, и вы также создадите пустые GameObjects, чтобы определить желаемые позиции.Ссылайтесь на родительский GameObject в этом скрипте и прикрепите его к камере.

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

public static class FloatDiscrepancy {
    public static float Accuracy = 0.00001f;

    public static float SqrAccuracy {
        get {
            return Accuracy * Accuracy;
        }
        private set { }
    }

    public static bool V3Equal(Vector3 a, Vector3 b){
        return Vector3.SqrMagnitude(a - b) < SqrAccuracy;
    }

    public static bool QuaternionEqual(Quaternion a, Quaternion b){
        return Quaternion.Angle (a, b) < Accuracy;
    }
}

public class CameraMovement : MonoBehaviour {
    public GameObject PositionObject;
    public float CamPosChangeSpeed = 5f;

    List<Transform> cameraPositions;
    bool inMotion = false;
    int currentPosition;

    // Use this for initialization
    void Start () {
        //get all camera positions automatically
        cameraPositions = new List<Transform> ();
        foreach (Transform child in PositionObject.transform) {
            cameraPositions.Add (child);
        }

        //set position index
        currentPosition = 0;

        //set camera start Popsition
        Camera.main.transform.position = cameraPositions [currentPosition].position;
        Camera.main.transform.rotation = cameraPositions [currentPosition].rotation;
    }

    // Update is called once per frame
    void Update () {
        if (inMotion) {
            moveCamera ();
        }
    }

    /// <summary>
    /// Switchs the camera position. Call it from other scripts or with an Event
    /// </summary>
    /// <param name="tP">Target Position as index for the list</param>
    public void SwitchCameraPosition(int targetPosition ) {
        if (cameraPositions.ElemenntAtOrDefault(targetPosition) != null){
            currentPosition = targetPosition;
            inMotion = true;
        }
    }

    /// <summary>
    /// Moves the camera.
    /// </summary>
    void moveCamera(){

        float disc = FloatDiscrepancy.Accuracy;
        //interpolate to new position
        Vector3 tmpPos = Vector3.Lerp (
            Camera.main.transform.position,
            cameraPositions [currentPosition].position,
            Time.deltaTime * CamPosChangeSpeed
        );
        //interpolate to new rotaion
        Quaternion tmpRot = Quaternion.Lerp (
            Camera.main.transform.rotation,
            cameraPositions [currentPosition].rotation,
            Time.deltaTime * CamPosChangeSpeed
        );
        Camera.main.transform.position = tmpPos;
        Camera.main.transform.rotation = tmpRot;

        FloatDiscrepancy.Accuracy = 0.01f;
        //if reached end position stop the motion and set endposition to be sure
        if (FloatDiscrepancy.V3Equal (tmpPos, cameraPositions [currentPosition].position) && FloatDiscrepancy.QuaternionEqual(tmpRot, cameraPositions[currentPosition].rotation)) {
            inMotion = false;
            Camera.main.transform.position = cameraPositions [currentPosition].position;
            Camera.main.transform.rotation = cameraPositions [currentPosition].rotation;
        }
        FloatDiscrepancy.Accuracy = disc;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...