unity3D实现镜头拉近拉远及视角旋转

您所在的位置:网站首页 镜头拉近拉远叫什么 unity3D实现镜头拉近拉远及视角旋转

unity3D实现镜头拉近拉远及视角旋转

2024-07-10 14:46| 来源: 网络整理| 查看: 265

镜头拉近拉远的代码(无限拉远拉近)

 

代码如下:

 

if( Input.GetAxis("Mouse ScrollWheel") != 0 )

{

this.gameObject.transform.Translate(new Vector3(0,0,Input.GetAxis("Mouse ScrollWheel")*Time.deltaTime*500));

}

 

上述代码放在Update ()函数中,其中gameObject是摄像机或者物体对象,500是可以调节的参数。方法非常简单。

 

 

上述方法虽然能实现,但是太简单下面来个完整代码如下(只要把这个脚本绑定到相机上就OK);

实现:右键转动视角和镜头拉伸(拉动有范围)

 

/// /// Mouse orbit. /// This script use to control a main camera /// using UnityEngine; using System.Collections; public class MouseOrbit : MonoBehaviour { [HideInInspector] public GameObject target; //a target look at public float xSpeed; //speed pan x public float ySpeed; //speed pan y public float yMinLimit; //y min limit public float yMaxLimit; //y max limit public float scrollSpeed; //scroll speed public float zoomMin; //zoom min public float zoomMax; //zoom max //Private variable private float distance; private float distanceLerp; private Vector3 position; private bool isActivated; private float x; private float y; private bool setupCamera; // Use this for initialization void Start () { //Warning when not found target if(target == null) { target = GameObject.FindGameObjectWithTag("Player"); if(target == null) { Debug.LogWarning("Don't found player tag please change player tag to Player"); } } //Setup Pos Vector3 angles = transform.eulerAngles; x = angles.y; y = angles.x; CalDistance(); } void LateUpdate () { ScrollMouse(); RotateCamera(); } //Roate camera method void RotateCamera() { if (Input.GetMouseButtonDown(1)){ isActivated = true; } // if mouse button is let UP then stop rotating camera if (Input.GetMouseButtonUp(1)) { isActivated = false; } if (target && isActivated) { y -= Input.GetAxis("Mouse Y") * ySpeed; x += Input.GetAxis("Mouse X") * xSpeed; y = ClampAngle(y, yMinLimit, yMaxLimit); Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } else { Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } } //Calculate Distance Method void CalDistance() { distance = zoomMax; distanceLerp = distance; Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } //Scroll Mouse Method void ScrollMouse() { distanceLerp = Mathf.Lerp(distanceLerp,distance,Time.deltaTime * 5); if (Input.GetAxis("Mouse ScrollWheel") != 0 && !GUI_Menu.instance.CheckHoverItemShop() && !GUI_Menu.instance.CheckHoverSkillWindow()) { // get the distance between camera and target distance = Vector3.Distance (transform.position , target.transform.position); distance = ScrollLimit(distance - Input.GetAxis("Mouse ScrollWheel")*scrollSpeed, zoomMin, zoomMax); } } //Scroll Limit Method float ScrollLimit(float dist, float min, float max) { if (dist < min) dist= min; if (dist > max) dist= max; return dist; } //Clamp Angle Method float ClampAngle(float angle,float min,float max) { if(angle < -360) angle += 360; if(angle > 360) angle -= 360; return Mathf.Clamp(angle,min,max); } }

 

上面的代码只能限定上下的视角,所以我改进了一下,下面的代码可以进行左右和上下视角的范围限定。如下:

/// /// Mouse orbit. /// This script use to control a main camera /// using UnityEngine; using System.Collections; public class MouseOrbit : MonoBehaviour { //[HideInInspector] public GameObject target; //a target look at public float xSpeed; //speed pan x public float ySpeed; //speed pan y public float yMinLimit; //y min limit public float yMaxLimit; //y max limit public float XMinLimit; //X轴的限制 public float XMaxLimit; public float scrollSpeed; //scroll speed public float zoomMin; //zoom min public float zoomMax; //zoom max //Private variable private float distance; private float distanceLerp; private Vector3 position; private bool isActivated; private float x; private float y; private bool setupCamera; // Use this for initialization void Start () { //Warning when not found target if(target == null) { //target = GameObject.FindGameObjectWithTag("Player"); if(target == null) { Debug.LogWarning("Don't found player tag please change player tag to Player"); } } //Setup Pos Vector3 angles = transform.eulerAngles; x = angles.y; y = angles.x; CalDistance(); } void LateUpdate () { ScrollMouse(); RotateCamera(); if (x < XMinLimit) { x = XMinLimit; } if (x > XMaxLimit) { x = XMaxLimit; } } //Roate camera method void RotateCamera() { if (Input.GetMouseButtonDown(1)){ isActivated = true; } // if mouse button is let UP then stop rotating camera if (Input.GetMouseButtonUp(1)) { isActivated = false; } if (target && isActivated) { y -= Input.GetAxis("Mouse Y") * ySpeed; x += Input.GetAxis("Mouse X") * xSpeed; y = ClampAngle(y, yMinLimit, yMaxLimit); Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } else { Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } } //Calculate Distance Method void CalDistance() { distance = zoomMax; distanceLerp = distance; Quaternion rotation = Quaternion.Euler(y, x, 0); Vector3 calPos = new Vector3(0, 0, -distanceLerp); position = rotation * calPos + target.transform.position; transform.rotation = rotation; transform.position = position; } //Scroll Mouse Method void ScrollMouse() { distanceLerp = Mathf.Lerp(distanceLerp,distance,Time.deltaTime * 5); if (Input.GetAxis("Mouse ScrollWheel") != 0 /*&& !GUI_Menu.instance.CheckHoverItemShop() && !GUI_Menu.instance.CheckHoverSkillWindow()*/) { // get the distance between camera and target distance = Vector3.Distance (transform.position , target.transform.position); distance = ScrollLimit(distance - Input.GetAxis("Mouse ScrollWheel")*scrollSpeed, zoomMin, zoomMax); } } //Scroll Limit Method float ScrollLimit(float dist, float min, float max) { if (dist < min) dist= min; if (dist > max) dist= max; return dist; } //Clamp Angle Method //float ClampAngle(float angle,float min,float max) //{ // if(angle < -360) // angle += 360; // if(angle > 360) // angle -= 360; // return Mathf.Clamp(angle,min,max); //} float ClampAngle(float angle, float min, float max) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp(angle, min, max); } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3