我如何使相机留在球体中



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

我已经尝试将相机寄给球形游戏对象,但是相机仍然离开游戏区域,但球体留在里面。

这是我尝试使用界限方法将相机保存在球体内的尝试。

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;
        //}
    }
}

没有出现错误。在比赛中,玩家可以将相机飞出球体,但我希望他们局限于球体。

我认为您必须在每个框架上查看相机位置,还检查它是否从球体上伸出,这是一些代码,可能会帮助您(未测试(

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;
}

如果您不了解的话,请在评论中问我

相关内容

  • 没有找到相关文章

最新更新