Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                在項目制作過程中,我們可能會用到鏡頭的拉伸與旋轉操作,不管在pc端還是移動端,拉伸效果要么就是放大target,要么就是移動camera,旋轉也是一樣,要么旋轉攝像機,要么是旋轉物體本身,具體情況具體對待。下面就兩個方法的具體實現方法:
 
下面是通過控制camera與target的距離,實時更新camera的位置來實現物體的方法縮小,也就是拉伸效果。同樣旋轉物體也是通過setpos方法,實時更新位置實現攝像機的旋轉。這種拉伸效果適合用在target是三維模型時。
using UnityEngine; using System.Collections;public class RotateAndPinch_2 : MonoBehaviour {public Transform target;private float minVertical = 0f;private float maxVertical = 85f;private float x = 0.0f;private float y = 0.0f;private float distance = 0.0f;private float newdis = 0;private float olddis = 0;// Use this for initializationvoid Start(){distance = (transform.position - target.position).magnitude;}// Update is called once per framevoid Update(){transform.LookAt(target);float dt = Time.deltaTime;x = transform.eulerAngles.y;y = transform.eulerAngles.x;if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer){if (Input.touchCount == 1){if (Input.GetTouch(0).phase == TouchPhase.Moved){float x1 = Input.GetAxis("Mouse X");float y1 = Input.GetAxis("Mouse Y");x += x1 * dt * 150;y += -y1 * dt * 150;SetPos(x, y);}}if (Input.touchCount == 2){if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved){Vector3 s1 = Input.GetTouch(0).position;Vector3 s2 = Input.GetTouch(1).position;newdis=Vector2.Distance(s1,s2);if(newdis>olddis){distance-=Time.deltaTime*50f;}if(newdis<olddis){distance+=Time.deltaTime*50f;}print("distance = "+distance);SetPos(x,y);olddis=newdis;}}}else{if (Input.GetMouseButton(0)){float x1 = Input.GetAxis("Mouse X");float y1 = Input.GetAxis("Mouse Y");x += x1 * dt * 150f;y += -y1 * dt * 150f;SetPos(x, y);}if (Input.GetAxis("Mouse ScrollWheel") != 0){distance -= Input.GetAxis("Mouse ScrollWheel");SetPos(x, y);}}}void SetPos(float x, float y){y = ClampAngle(y, minVertical, maxVertical);var rotation = Quaternion.Euler(y, x, 0.0f);var position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;transform.rotation = rotation;transform.position = position;}static float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}}下面這個方法,實現上則比上面的簡單一點,放大縮小是通過改變scale來實現,這種方法使用在二維平面中。
using UnityEngine;/// <summary> /// 旋轉和縮放模型 /// </summary> public class ScaleOrRotateModels : MonoBehaviour {//最大和最小縮放比例值private float maxScale = 100;private float minScale = 20;private float newdis = 0;private float olddis = 0;private float horizontalSpeed = 5;private float verticalSpeed = 5;private Vector3 rotatepos;private Vector3 defaultScale;void Start(){rotatepos = transform.position;defaultScale = transform.localScale;}void LateUpdate(){if (Application.platform == RuntimePlatform.Android){//單指觸屏滑動,物體的旋轉if (Input.touchCount == 1){if (Input.GetTouch(0).phase == TouchPhase.Moved){float h = Input.GetAxis("Mouse X");//右正左負 float v = Input.GetAxis("Mouse Y");//上正下負 if (Mathf.Abs(h) >= Mathf.Abs(v)){if (h < 0){transform.RotateAround(rotatepos, Vector3.up, horizontalSpeed);}if (h > 0){transform.RotateAround(rotatepos, -Vector3.up, horizontalSpeed);}}else{if (v < 0){transform.RotateAround(rotatepos, -Vector3.right, verticalSpeed);}if (v > 0){transform.RotateAround(rotatepos, Vector3.right, verticalSpeed);}}}}//兩指觸屏滑動,物體的縮放 if (Input.touchCount > 1){if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved){var pos1 = Input.GetTouch(0).position;var pos2 = Input.GetTouch(1).position;newdis = Vector2.Distance(pos1, pos2);if (newdis < olddis && transform.localScale.x > minScale){transform.localScale -= defaultScale * Time.deltaTime * 2;}if (newdis > olddis && transform.localScale.x < maxScale){transform.localScale += defaultScale * Time.deltaTime * 2;}olddis = newdis;}}}else{//鼠標左鍵,物體旋轉if (Input.GetMouseButton(0)) {float h = Input.GetAxis("Mouse X");//右正左負 float v = Input.GetAxis("Mouse Y");//上正下負 if (Mathf.Abs(h) >= Mathf.Abs(v)){if (h < 0){transform.RotateAround(rotatepos, Vector3.up, horizontalSpeed);}if (h > 0){transform.RotateAround(rotatepos, -Vector3.up, horizontalSpeed);}}else{if (v < 0){transform.RotateAround(rotatepos, -Vector3.right, verticalSpeed);}if (v > 0){transform.RotateAround(rotatepos, Vector3.right, verticalSpeed);}}}if (Input.GetAxis("Mouse ScrollWheel") < 0 && transform.localScale.x < maxScale){transform.localScale += defaultScale * Time.deltaTime * 2;}else if (Input.GetAxis("Mouse ScrollWheel") > 0 && transform.localScale.x > minScale){transform.localScale -= defaultScale * Time.deltaTime * 2;}}} }
 
 
 
總結
以上是生活随笔為你收集整理的Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 抗疫先锋 | IBM:同心抗疫,重塑未来
- 下一篇: 大数据时代数据资产管理“五星模型”:三个
