功能:控制模型的大小和旋转
PC & Android:
/***********************
* 遇见你的眉眼,如清风明月。
* Title: "旋转和缩放模型"
* 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; //左键按下时鼠标的位置
Vector3 previousPosition; //上一帧鼠标的位置。
Vector2 zishen;//自身位置;
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)
{
//得到手指移动的增量(只有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);
//两个距离之差,为正表示放大手势, 为负表示缩小手势
float offset = newDistance - oldDistance;
//放大因子, 一个像素按 0.01倍来算(100可调整)
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端
{
//鼠标左键,物体旋转
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;//右正左负
//float v = Input.GetAxis("Mouse Y") * Time.deltaTime;//上正下负
//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");//右正左负
float v = Input.GetAxis("Mouse Y");//上正下负
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)]
/***********************
* 遇见你的眉眼,如清风明月。
* Title: "移动端控制摄像机"
* Func: 1、平移摄像机
* 2、推进、拉远摄像机(近大远小,效果:模型缩放)
* - 3、旋转摄像机
* 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; //移动端拖动速度、旋转速度
//pc端
public float ScrollWheelSpeed_pc; //鼠标滚轮速度
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)
//{
// //相机移动
// transform.Translate(-touchDeltaPosition.x * Time.deltaTime * MoveSpeed,
// -touchDeltaPosition.y * Time.deltaTime * MoveSpeed, 0);
//}
//else
//{
//相机旋转
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);
//两个距离之差,为正表示放大手势, 为负表示缩小手势
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
//滚轮前进后退放大缩小
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);
}
//右键旋转
if (Input.GetMouseButton(1))
{
float h = Input.GetAxis("Mouse X");//右正左负
float v = Input.GetAxis("Mouse Y");//上正下负
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);
}
}
}
// 鼠标中键拖动相机.
if (Input.GetMouseButton(2))
{
float X = Input.GetAxis("Mouse X");
float Y = Input.GetAxis("Mouse Y");
//相机移动
transform.Translate(-X * Time.deltaTime * MoveSpeed_pc,
-Y * Time.deltaTime * MoveSpeed_pc, 0);
}
#endif
}
}
将wasd和小键盘上下左右分开了.png