Как заставить камеру оставаться внутри сферы? - PullRequest
0 голосов
/ 07 июля 2019

Я могу заставить камеру двигаться так, как я хочу, но мне нужно, чтобы она была ограничена созданной мной трехмерной полой сферой. В настоящее время игрок может вывести камеру из игровой зоны.

Я пытался привязать камеру к сферическому игровому объекту, но камера все еще покидает игровую область, но сфера остается внутри.

Это была моя попытка использовать метод BoundingSphere для удержания камеры внутри сферы.

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

public class SphericalBoundary : MonoBehaviour
{
    public Vector3 pos;
    public float r;

    void Start()
    {
        BoundingSphere();
    }

    private void FixedUpdate()
    {
        BoundingSphere();
    }

    public void BoundingSphere()
    {
            pos = new Vector3(0, 0, 0);
            r = (100); 
    }    



}



============================================================================
============================================================================

This is the script that makes the camera fly around. Works perfectly.



    using UnityEngine;
    using System.Collections;

    public class CameraFlight : MonoBehaviour
    {

        /*
        EXTENDED FLYCAM
            Desi Quintans (CowfaceGames.com), 17 August 2012.
            Based on FlyThrough.js by Slin (http://wiki.unity3d.com/index.php/FlyThrough), 17 May 2011.

        LICENSE
            Free as in speech, and free as in beer.

        FEATURES
            WASD/Arrows:    Movement
                      Q:    Climb
                      E:    Drop
                          Shift:    Move faster
                        Control:    Move slower
                            End:    Toggle cursor locking to screen (you can also press Ctrl+P to toggle play mode on and off).
        */

        public float cameraSensitivity = 90;
        public float climbSpeed = 4;
        public float normalMoveSpeed = 10;
        public float slowMoveFactor = 0.25f;
        public float fastMoveFactor = 3;

        private float rotationX = 0.0f;
        private float rotationY = 0.0f;

        void Start()
        {
           // Screen.lockCursor = true;
        }

        void Update()
        {
            rotationX += Input.GetAxis("Mouse X") * cameraSensitivity * Time.deltaTime;
            rotationY += Input.GetAxis("Mouse Y") * cameraSensitivity * Time.deltaTime;
            rotationY = Mathf.Clamp(rotationY, -90, 90);

            transform.localRotation = Quaternion.AngleAxis(rotationX, Vector3.up);
            transform.localRotation *= Quaternion.AngleAxis(rotationY, Vector3.left);

            if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
            {
                transform.position += transform.forward * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
                transform.position += transform.right * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
            {
                transform.position += transform.forward * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
                transform.position += transform.right * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
            }
            else
            {
                transform.position += transform.forward * normalMoveSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
                transform.position += transform.right * normalMoveSpeed * Input.GetAxis("Horizontal") * Time.deltaTime;
            }


            if (Input.GetKey(KeyCode.Q)) { transform.position += transform.up * climbSpeed * Time.deltaTime; }
            if (Input.GetKey(KeyCode.E)) { transform.position -= transform.up * climbSpeed * Time.deltaTime; }

            //if (Input.GetKeyDown(KeyCode.End))
            //{
            //    Screen.lockCursor = (Screen.lockCursor == false) ? true :][1] 

false;
        //}
    }
}

Ошибки не отображаются. Во время игры игрок может вывести камеру из сферы, но я хочу, чтобы они были ограничены сферой.

1 Ответ

0 голосов
/ 07 июля 2019

Я думаю, что вы должны смотреть положение вашей камеры на каждом кадре, а также проверять, выходит ли она за пределы сферы, вот какой-то код, который может вам помочь (он не тестировался)

public class TestScriptForStackOverflow : MonoBehaviour {

public Transform CameraTrans, SphereTrans;

private float _sphereRadius;


void Start() {
    //if we are talking about sphere its localscale.x,y,z values are always equal
    _sphereRadius = SphereTrans.localScale.x / 2; 
}


void Update() {
    if (IsOutsideTheSphere(_sphereRadius, CameraTrans.position, SphereTrans.position)) {
        //lets find direction of camera from sphere center
        Vector3 direction = (CameraTrans.position - SphereTrans.position).normalized;
        //this is bound point for specific direction which is point is on the end of the radius
        Vector3 boundPos = SphereTrans.position + direction * _sphereRadius;
        //finally assign bound position to camera to stop it to pierce the sphere bounds
        CameraTrans.position = boundPos;
    }
}

private bool IsOutsideTheSphere(float sphereRadius, Vector3 cameraPosition, Vector3 sphereCenterPosition) {

    //distance betweeen cameraPosition and sphereCenterPosition
    float distanceBetween = (cameraPosition - sphereCenterPosition).magnitude;
    //returns true if distance between sphere center and camera position is longer then sphere radius
    return distanceBetween > sphereRadius;

}

Еслиесть что-то, чего вы не понимаете, спрашивайте меня в комментариях

...