如何使相机保持在球体内?

时间:2019-07-06 22:26:35

标签: c# unity3d game-development

我可以使相机移动到想要的方向,但是我需要将其限制在我创建的3D空心球内。当前,玩家可以将相机带出游戏区域。

我已经尝试将摄影机作为球型游戏对象的父母,但摄影机仍离开游戏区域,但球体仍在其中。

这是我尝试使用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 :(得分:0)

我认为您必须查看每帧相机的位置,并检查它是否超出范围,这是一些可能对您有帮助的代码(未经测试)

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;

}

如果您不了解某些内容,请在评论中问我