功能:控制模型的大小和旋轉(zhuǎn)
PC & Android:
/***********************
* 遇見你的眉眼,如清風(fēng)明月杆兵。
* Title: "旋轉(zhuǎn)和縮放模型"
* Func:
* -
* UsedBy:
* Date: 2020
* Author: XC
* Version: 1.0
* Description:
***********************/
using UnityEngine;
using UnityEngine.UI;
public class ScaleOrRotateModels1 : MonoBehaviour
{
//最大和最小縮放比例值
public float maxScale = 2f;
public float minScale = 0.2f;
//移動平臺
private Touch oldTouch1; //上次觸摸點1(手指1)
private Touch oldTouch2; //上次觸摸點2(手指2)
private float newdis = 0;
private float olddis = 0;
private float horizontalSpeed = 5;
private float verticalSpeed = 2.5f;
private Vector3 rotatePos;
private Vector3 defaultScale;
private float ZiShenY;
private float ZiShenX;
Vector3 StartPosition; //左鍵按下時鼠標(biāo)的位置
Vector3 previousPosition; //上一幀鼠標(biāo)的位置顶籽。
Vector2 zishen;//自身位置;
void Start()
{
rotatePos = transform.position;
defaultScale = transform.localScale;
}
void LateUpdate()
{
if (Application.platform == RuntimePlatform.Android) //移動端
{
//單指觸屏滑動,物體的旋轉(zhuǎn)
if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
//得到手指移動的增量(只有X爆袍、Y值)
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
if (Mathf.Abs(touchDeltaPosition.x) >= Mathf.Abs(touchDeltaPosition.y))
{
if (touchDeltaPosition.x < 0)
{
transform.RotateAround(rotatePos, Vector3.up, horizontalSpeed);
}
if (touchDeltaPosition.x > 0)
{
transform.RotateAround(rotatePos, -Vector3.up, horizontalSpeed);
}
}
else
{
if (touchDeltaPosition.y < 0)
{
transform.RotateAround(rotatePos, -Vector3.right, verticalSpeed);
}
if (touchDeltaPosition.y > 0)
{
transform.RotateAround(rotatePos, Vector3.right, verticalSpeed);
}
}
}
}
//兩指觸屏滑動首繁,物體的縮放
if (Input.touchCount >= 1)
{
//多點觸摸, 放大縮小
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
//第2點剛開始接觸屏幕, 只記錄,不做處理
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
//計算老的兩點距離和新的兩點間距離陨囊,變大要放大模型弦疮,變小要縮放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
//兩個距離之差,為正表示放大手勢蜘醋, 為負(fù)表示縮小手勢
float offset = newDistance - oldDistance;
//放大因子胁塞, 一個像素按 0.01倍來算(100可調(diào)整)
float scaleFactor = offset / 100f;
Vector3 localScale = transform.localScale;
Vector3 scale = new Vector3(localScale.x + scaleFactor,
localScale.y + scaleFactor,
localScale.z + scaleFactor);
//最小縮放
if (scale.x > minScale && scale.y > minScale && scale.z > minScale)
{
transform.localScale = scale;
}
//記住最新的觸摸點,下次使用
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
}
}
else //pc端
{
//鼠標(biāo)左鍵压语,物體旋轉(zhuǎn)
if (Input.GetMouseButton(1))
{
//11111111
//Vector3 fwd = Camera.main.transform.forward;
//fwd.Normalize();
//Vector3 vaxis = Vector3.Cross(fwd, Vector3.right);
//transform.Rotate(vaxis, - Input.GetAxis("Mouse X")*5f, Space.World);
////transform.Rotate(vaxis, -Input.GetAxis("Mouse X") * 5f, Space.Self);
//Vector3 haxis = Vector3.Cross(fwd, Vector3.up);
//transform.Rotate(haxis, Input.GetAxis("Mouse Y") * -5f, Space.World);
////transform.Rotate(haxis, Input.GetAxis("Mouse Y") * -5f, Space.Self);
//22222222
//ZiShenY = this.transform.localEulerAngles.y;
//ZiShenX = this.transform.localEulerAngles.x;
//float h = Input.GetAxis("Mouse X") * Time.deltaTime;//右正左負(fù)
//float v = Input.GetAxis("Mouse Y") * Time.deltaTime;//上正下負(fù)
//if (Mathf.Abs(h) >= Mathf.Abs(v))
//{
// if (h < 0)//左右
// {
// transform.RotateAround(rotatePos, Vector3.up, horizontalSpeed);
// float zz = transform.localEulerAngles.y;
// this.transform.localEulerAngles = new Vector3(ZiShenX, zz + 5f, 0);
// }
// if (h > 0)
// {
// transform.RotateAround(rotatePos, -Vector3.up, horizontalSpeed);
// float zz = transform.localEulerAngles.y;
// this.transform.localEulerAngles = new Vector3(ZiShenX, zz - 5f, 0);
// }
//}
//else//上下
//{
// this.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, ZiShenY, 0), Time.deltaTime * 5f);
// if (v < 0)
// {
// transform.RotateAround(rotatePos, -Vector3.right, verticalSpeed);
// float zz = transform.localEulerAngles.x;
// this.transform.localEulerAngles = new Vector3(zz + 5f, ZiShenY, 0);
// }
// if (v > 0)
// {
// transform.RotateAround(rotatePos, Vector3.right, verticalSpeed);
// float zz = transform.localEulerAngles.x;
// this.transform.localEulerAngles = new Vector3(zz - 5f, ZiShenY, 0);
// }
//}
//3333333333
float h = Input.GetAxis("Mouse X");//右正左負(fù)
float v = Input.GetAxis("Mouse Y");//上正下負(fù)
if (Mathf.Abs(h) >= Mathf.Abs(v))
{
if (h < 0)
{
transform.RotateAround(transform.position, Vector3.up, horizontalSpeed);
}
if (h > 0)
{
transform.RotateAround(transform.position, -Vector3.up, horizontalSpeed);
}
}
else
{
if (v < 0)
{
transform.RotateAround(transform.position, -Vector3.right, verticalSpeed);
}
if (v > 0)
{
transform.RotateAround(transform.position, Vector3.right, verticalSpeed);
}
}
}
//控制放大縮小
if (Input.GetAxis("Mouse ScrollWheel") < 0 && transform.localScale.x > minScale)
{
transform.localScale -= defaultScale * Time.deltaTime * 2;
}
else if (Input.GetAxis("Mouse ScrollWheel") > 0 && transform.localScale.x < maxScale)
{
transform.localScale += defaultScale * Time.deltaTime * 2;
}
}
}
}
[圖片上傳中...(image.png-a4c8ea-1623829076826-0)]
/***********************
* 遇見你的眉眼啸罢,如清風(fēng)明月。
* Title: "移動端控制攝像機(jī)"
* Func: 1胎食、平移攝像機(jī)
* 2扰才、推進(jìn)、拉遠(yuǎn)攝像機(jī)(近大遠(yuǎn)小厕怜,效果:模型縮放)
* - 3衩匣、旋轉(zhuǎn)攝像機(jī)
* UsedBy:
* Date: 2020
* Author: XC
* Version: 1.0
* Description:
***********************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using DG.Tweening;
public class CameraController_xc : MonoBehaviour
{
bool isRotate;
//移動端
private Touch oldTouch1; //上次觸摸點1(手指1)
private Touch oldTouch2; //上次觸摸點2(手指2)
public float MoveSpeed,RotateSpeed; //移動端拖動速度、旋轉(zhuǎn)速度
//pc端
public float ScrollWheelSpeed_pc; //鼠標(biāo)滾輪速度
public float MoveSpeed_pc, RotateSpeed_pc;
private Vector3 MouseDownPos;
void Start()
{
isRotate = true;
MoveSpeed = 3f;
RotateSpeed = 2f;
ScrollWheelSpeed_pc = 10f;
MoveSpeed_pc = 10f;
RotateSpeed_pc = 1f;
}
void Update()
{
#if UNITY_ANDROID
//沒有觸摸
if (Input.touchCount <= 0)
{
return;
}
//單點觸摸
if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
//得到手指移動的增量(只有X酣倾、Y值)
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
//if (!isRotate)
//{
// //相機(jī)移動
// transform.Translate(-touchDeltaPosition.x * Time.deltaTime * MoveSpeed,
// -touchDeltaPosition.y * Time.deltaTime * MoveSpeed, 0);
//}
//else
//{
//相機(jī)旋轉(zhuǎn)
if (Mathf.Abs(touchDeltaPosition.y) > Mathf.Abs(touchDeltaPosition.x))
{
if (touchDeltaPosition.y > 0)
{
transform.Rotate(-touchDeltaPosition.y * Time.deltaTime * RotateSpeed, 0, 0);
}
else
{
transform.Rotate(-touchDeltaPosition.y * Time.deltaTime * RotateSpeed, 0, 0);
}
}
else
{
if (touchDeltaPosition.x > 0)
{
transform.Rotate(0, touchDeltaPosition.x * Time.deltaTime * RotateSpeed, 0, Space.World);
}
else
{
transform.Rotate(0, touchDeltaPosition.x * Time.deltaTime * RotateSpeed, 0, Space.World);
}
}
//}
}
else if (Input.touchCount >= 1)
{
//多點觸摸, 放大縮小
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
//第2點剛開始接觸屏幕, 只記錄舵揭,不做處理
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
//計算老的兩點距離和新的兩點間距離,變大要放大模型躁锡,變小要縮放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
//兩個距離之差午绳,為正表示放大手勢, 為負(fù)表示縮小手勢
float offset = newDistance - oldDistance;
float scaleFactor = offset / 100f;
transform.position += transform.localRotation * (Vector3.forward * scaleFactor);
//記住最新的觸摸點映之,下次使用
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
}
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
//滾輪前進(jìn)后退放大縮小
float scrollWheelValue = Input.GetAxis("Mouse ScrollWheel");
transform.position += transform.localRotation * (Vector3.forward *
scrollWheelValue * ScrollWheelSpeed_pc);
//wasd控制移動
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
float hor2 = Input.GetAxis("Horizontal2");
float ver2 = Input.GetAxis("Vertical2");
if (ver!=0||hor!=0)
{
transform.Translate(hor * MoveSpeed_pc * Time.deltaTime, 0, ver * MoveSpeed_pc * Time.deltaTime);
}
if (ver2 != 0 || hor2 != 0)
{
transform.Rotate(-ver2 * MoveSpeed_pc * Time.deltaTime, 0, 0);
transform.Rotate(0, hor2 * MoveSpeed_pc * Time.deltaTime, 0, Space.World);
}
//右鍵旋轉(zhuǎn)
if (Input.GetMouseButton(1))
{
float h = Input.GetAxis("Mouse X");//右正左負(fù)
float v = Input.GetAxis("Mouse Y");//上正下負(fù)
if (Mathf.Abs(h) >= Mathf.Abs(v))
{
if (h < 0)
{
transform.Rotate(-Vector3.up, RotateSpeed_pc,Space.World);
}
if (h > 0)
{
transform.Rotate(Vector3.up, RotateSpeed_pc,Space.World);
}
}
else
{
if (v < 0)
{
transform.Rotate(Vector3.right, RotateSpeed_pc);
}
if (v > 0)
{
transform.Rotate(-Vector3.right, RotateSpeed_pc);
}
}
}
// 鼠標(biāo)中鍵拖動相機(jī).
if (Input.GetMouseButton(2))
{
float X = Input.GetAxis("Mouse X");
float Y = Input.GetAxis("Mouse Y");
//相機(jī)移動
transform.Translate(-X * Time.deltaTime * MoveSpeed_pc,
-Y * Time.deltaTime * MoveSpeed_pc, 0);
}
#endif
}
}
將wasd和小鍵盤上下左右分開了.png