【问题标题】:Seperate Camera and Player Movement in UnityUnity 中的独立摄像机和玩家移动
【发布时间】:2018-04-08 02:50:33
【问题描述】:

我目前正在尝试编写一个摄像机,让玩家处于焦点位置,并且可以在与玩家自己的动作无关的情况下四处移动。 您可以使用正确的 xBox 控制器控制相机。 相机应该在围绕玩家的轨道上的 X 轴上正常移动,但是如果您移动相机以向上或向下看(比如说向上 20°),它应该在 0° 上以再次聚焦玩家,如果您放开操纵杆并在这两个角度之间进行插值。

在我的脚本中,相机可以上下查看(但度数尚未锁定,因此您可以将其在 Y 轴上移动 360°+),但它会重置为 0°。此外,x 轴的行为不像我想要的那样,因为它能够围绕播放器旋转,但只能旋转 180°,然后它会停止,如果你放开控制器,它也会将它的值设置回来(我不想要对于 x 轴)。

相机是一个空游戏对象的子对象。该脚本附加到空游戏对象。

大约 3 天后,我一直在尝试解决这个问题,如果有任何小建议,我将不胜感激。 提前致谢,这是我的脚本:

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

public class CameraFollowPlayer : MonoBehaviour
{

    public GameObject target;
    public GameObject cameraRig;
    public float rotateSpeedX = 90.0f;
    public float rotateSpeedY = 5f;

    float cameraAngle;

    float startCameraAngle;

    Vector3 offset;
    Vector3 currentOffset;

    public float minRotationY;
    public float maxRotationY;

    bool isCameraMoving;

    void Start()
    {
        offset = transform.position - target.transform.position;

        cameraAngle = transform.localEulerAngles.z;
        startCameraAngle = cameraAngle;
        currentOffset = offset;

    }

    void Update()
    {

        transform.position = target.transform.position + currentOffset; // Folgt dem Spieler

        float hor = Input.GetAxis("RightJoystickX") * rotateSpeedX; // Input rechter Joystick
        float ver = Input.GetAxis("RightJoystickY") * rotateSpeedY;



        if (!Mathf.Approximately (hor, 0)) {
            transform.RotateAround (target.transform.position, Vector3.up, hor);
            currentOffset = transform.position - target.transform.position;

        }   

        if (!Mathf.Approximately (ver, 0)) {

            cameraAngle += 110f * Time.deltaTime;

            transform.RotateAround (target.transform.position, Vector3.up, hor);
            currentOffset = transform.position - target.transform.position;
            print(ver);

        }

        else if (ver <= 0.8f) {
            //cameraAngle = Mathf.Lerp(cameraAngle, startCameraAngle, 1f - 0.1f * Time.deltaTime);
            cameraAngle = startCameraAngle;
        }

        transform.localEulerAngles = new Vector3(0, hor, cameraAngle);


    }




}

【问题讨论】:

    标签: c# unity3d camera


    【解决方案1】:

    如果其他人在谷歌上搜索并发现我的问题对我有用:

      using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
    
        public class CameraFollowPlayer : MonoBehaviour
        {
    
            public GameObject target;
            public GameObject cameraRig;
            public float rotateSpeedX = 9.0f;
            public float rotateSpeedY = 5f;
    
            float cameraAngle;
            float startCameraAngle;
    
            Vector3 offset;
            Vector3 currentOffset;
    
            bool isCameraMoving;
    
    
            void Start()
            {
                offset = transform.position - target.transform.position;
    
                cameraAngle = transform.localEulerAngles.z;
                startCameraAngle = cameraAngle;
                currentOffset = offset;
    
            }
    
            void Update()
            {
    
                transform.position = target.transform.position + currentOffset; // Folgt dem Spieler
    
                float hor = Input.GetAxisRaw("RightJoystickX") * rotateSpeedX; // Input rechter Joystick    GetAxis wenn Bewegung ausschwingen soll
                float ver = Input.GetAxisRaw("RightJoystickY") * rotateSpeedY; // GetAxis wenn Bewegung ausschwingen soll
    
    
                if (!Mathf.Approximately (hor, 0)) {
                    transform.RotateAround (target.transform.position, Vector3.up, hor);
                    currentOffset = transform.position - target.transform.position;
    
                }
    
    
                if (ver != 0) {
    
                    //cameraAngle += 110f * Time.deltaTime;
                    if (ver > 0)
                    {
    
                        cameraAngle += 110f * Time.deltaTime;
                        if (cameraAngle >= 420f)
                        {
                            cameraAngle = 420f;
                        }
    
                    }
                    if (ver < 0)
                    {
    
                        cameraAngle -= 110f * Time.deltaTime;
    
                        if (cameraAngle <= 290f)
                        {
                            cameraAngle = 290f;
                        }
                    }
    
    
                    transform.RotateAround (target.transform.position, Vector3.up, hor);
                    currentOffset = transform.position - target.transform.position;
                    transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, cameraAngle);
    
                }
    
                else
                {
                    cameraAngle = Mathf.Lerp(startCameraAngle, cameraAngle, 1f - 0.9f * Time.deltaTime);
                    transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, cameraAngle);
    
                }
    

    【讨论】:

    • 如果这对您有用,您也可以接受自己的答案。(48 小时后)。如果您想了解它,请查看here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多