unity相机操作

using System;
using UnityEngine;

public class FreeCamera : MonoBehaviour
{
    private const float DragFactor = 30;
    //跟随相机的物体
    private GameObject _cameraFollowObj, _cameraFollowObj2;
    public float _factorX = 0.5f, _factorY = 0.5f;
    private Camera _localCamera;
    [SerializeField]
    private float _mouseSensitivity = 20.0f;
    private GameObject _moveToPath;
    public Vector3 _pos;
    private float _scrollRate = 600;
    [SerializeField]
    private float _speed = 30.0f;
    public float _www = 10;
    public float _zzz = 2;
    //public Vector3 ttt = new Vector3(0, -1, 0);

    private void Awake()
    {
        _localCamera = GetComponent<Camera>();
        _cameraFollowObj = GameObject.Find("Sphere_FollowCamera");
        _cameraFollowObj2 = GameObject.Find("Sphere_FollowCamera (1)");
        _moveToPath = GameObject.Find("MoveOnPath");

//        var rd = gameObject.AddComponent<LineRenderer>();
//        rd.SetVertexCount(2);
//        rd.SetWidth(_zzz, _zzz);
//        rd.SetColors(Color.red, Color.red);
    }

    private void UpdateFollowSphere()
    {
#if false
        RaycastHit hit;
        Ray ray = new Ray(_cameraFollowObj.transform.position, Vector3.down);

        if (Physics.Raycast(ray, out hit, _www))
        {
//            var rd = gameObject.GetComponent<LineRenderer>();
//            rd.SetPosition(0, _cameraFollowObj.transform.position);
//            rd.SetPosition(1, new Vector3(_cameraFollowObj.transform.position.x, hit.transform.position.y, _cameraFollowObj.transform.position.z));
//            rd.SetWidth(_zzz, _zzz);


        //            Debug.Log(hit.transform.gameObject.name);
        //            Debug.Log(hit.transform.position);
        //            _cameraFollowObj2.transform.position = new Vector3(_cameraFollowObj2.transform.position.x,
        //                hit.transform.position.y,
        //                _cameraFollowObj2.transform.position.z);


            Vector3 pos = _cameraFollowObj.transform.position;

            Debug.Log(hit.transform.position.y   + ",   " + hit.point.y);
            //_cameraFollowObj2.transform.rotation = _cameraFollowObj.transform.rotation;
            _cameraFollowObj2.transform.position = new Vector3(pos.x, hit.point.y, pos.z);
        }
#endif

//        Vector3 centerPos = new Vector3(Screen.width * .5f, Screen.height * .5f, 0);
//        Vector3 pos = Camera.main.ScreenToWorldPoint(centerPos);
//        Ray ray = new Ray(_cameraFollowObj.transform.position, Vector3.down);
//        RaycastHit hit;
//
//        if (Physics.Raycast(ray, out hit))
//        {
//            _cameraFollowObj2.transform.position = hit.point;
//            Debug.Log(hit.point);
//        }
    }

    private void Update()
    {
      //  UpdateFollowSphere();

        if (Input.GetMouseButton(0))
        {
            float deltaX = Input.GetAxis("Mouse X")*Time.deltaTime*60;
            float deltaY = Input.GetAxis("Mouse Y")*Time.deltaTime*60;

            if (Mathf.Abs(deltaX) > Mathf.Abs(deltaY))
                transform.RotateAround(_cameraFollowObj.transform.position, Vector3.up, deltaX);
            else transform.RotateAround(_cameraFollowObj.transform.position, transform.right, -deltaY);
        }

        if (Input.GetMouseButton(2))
        {
            float deltaX = Input.GetAxis("Mouse X")*Time.deltaTime*DragFactor;
            float deltaY = Input.GetAxis("Mouse Y")*Time.deltaTime*DragFactor;

            transform.position += transform.right*deltaX;
            transform.position += Quaternion.AngleAxis(-90, Vector3.up)*transform.right*deltaY;
        }

        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            _speed = 40;
            _mouseSensitivity = 80;
            _scrollRate = 3000;
        }
        else if (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))
        {
            _speed = 0.5f;
            _mouseSensitivity = 10;
            _scrollRate = 100;
        }
        else
        {
            _speed = 10;
            _mouseSensitivity = 50;
            _scrollRate = 600;
        }

        float scrollWheel = Input.GetAxis("Mouse ScrollWheel")*_scrollRate*Time.deltaTime;
        if (Math.Abs(scrollWheel) > 0.00001)
        {
            transform.position = Vector3.LerpUnclamped(transform.position, _cameraFollowObj.transform.position,
                scrollWheel);
        }

        if (Input.GetKey(KeyCode.W))
        {
            transform.position += Quaternion.AngleAxis(-90, Vector3.up)*transform.right*_speed*Time.deltaTime;
        }


        if (Input.GetKey(KeyCode.S))
        {
            transform.position -= Quaternion.AngleAxis(-90, Vector3.up)*transform.right*_speed*Time.deltaTime;
        }


        if (Input.GetKey(KeyCode.A))
        {
            transform.position -= transform.right*_speed*Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.D))
        {
            transform.position += transform.right*_speed*Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += Vector3.up*_speed*Time.deltaTime * 0.6f;
        }

        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position -= Vector3.up*_speed*Time.deltaTime * 0.6f;
        }


        //旋转
        if (Input.GetKey(KeyCode.Q))
        {
            transform.RotateAround(_cameraFollowObj.transform.position, transform.right, -_mouseSensitivity*Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.E))
        {
            transform.RotateAround(_cameraFollowObj.transform.position, transform.right, _mouseSensitivity*Time.deltaTime);
        }
#if false
         if (Input.GetKey(KeyCode.Z))
         {
             transform.RotateAround(cameraFollowObj.transform.position, transform.forward, -mouseSensitivity * Time.deltaTime);
         }

         if (Input.GetKey(KeyCode.X) || Input.GetKey(KeyCode.C))
         {
             transform.RotateAround(cameraFollowObj.transform.position, transform.forward, mouseSensitivity * Time.deltaTime);
         }
#endif
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.RotateAround(_cameraFollowObj.transform.position, Vector3.up, _mouseSensitivity*Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.RotateAround(_cameraFollowObj.transform.position, Vector3.up, -_mouseSensitivity*Time.deltaTime);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中实现相机锁定可以分为两个步骤:对象锁定和旋转运镜。对象锁定是指让相机始终保持一个固定位置,无论相机如何运动。旋转运镜是指让相机围绕某个对象进行旋转运动。 实现对象锁定的思路是让相机的Local坐标系的z轴始终指向被锁定的游戏对象的位置。具体来说,将被锁定的游戏对象设置在相机成像区域的中心,这样无论相机如何移动,都能保持对象在成像区域的中心位置。 实现旋转运镜的代码相对简单,主要涉及到相机的移动、角度更新和旋转操作。我们可以使用Move函数移动相机,使用AngleUpdate函数更新相机的角度,使用Rotation函数进行相机的旋转操作。 需要注意的是,为了保证代码的正确性,我们将上述操作放在FixedUpdate中而不是Update中。因为在Update中,代码按照固定帧率执行,这与实际运行的物理设备的帧率可能不符。所以我们使用FixedUpdate来修正执行频率,以确保代码的正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Unity摄像机对象锁定旋转运镜模拟](https://blog.csdn.net/hgf1037882434/article/details/128460913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值