繁体   English   中英

相机的变换位置不会正确位置

[英]Transform.position of camera not going to correct position

每当我硬编码相机的位置以转换到它时都会起作用。 但是,如果我尝试根据我引用的特定游戏对象给出一个位置,那么相机位置似乎会移动到完全随机的位置。

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 的位置与所讨论的场景不同。

我没有关于您的代码的足够信息,但这里有一个有效的相机移动脚本。 只需在场景中创建一个空的 GameObject,并且在其中创建空的 GameObject 来定义所需的位置。 在此脚本中引用父 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM