方法一:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamerMoveTest2 : MonoBehaviour {
public Transform target;//获取旋转目标
public float speed = 0.5f;
private void Update()
{
if (Input.GetMouseButton(0))
{
camerarotate();
}
camerazoom();
}
private void camerarotate() //摄像机围绕目标旋转操作
{
transform.RotateAround(target.position, Vector3.up, speed*Time.deltaTime); //摄像机围绕目标旋转
var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
if (Input.GetKey(KeyCode.Mouse1))
{
transform.Translate(Vector3.left*(mouse_x*15f)*Time.deltaTime);
transform.Translate(Vector3.up*(mouse_y*15f)*Time.deltaTime);
}
if (Input.GetKey(KeyCode.Mouse0))
{
transform.RotateAround(target.transform.position, Vector3.up, mouse_x*5);
transform.RotateAround(target.transform.position, transform.right, mouse_y*5);
}
}
private void camerazoom() //摄像机滚轮缩放
{
if (Input.GetAxis("Mouse ScrollWheel") > 0)
transform.Translate(Vector3.forward*0.5f);
if (Input.GetAxis("Mouse ScrollWheel") < 0)
transform.Translate(Vector3.forward*-0.5f);
}
}
方法二:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoBehaviour
{
//摄像机距离
public float distance = 10.0f;
//缩放系数
public float scaleFactor = 1f;
public float maxDistance = 30f;
public float minDistance = 5f;
//记录上一次手机触摸位置判断用户是在左放大还是缩小手势
private Vector2 oldPosition1;
private Vector2 oldPosition2;
private Vector2 lastSingleTouchPosition;
private Vector3 m_CameraOffset;
private Camera m_Camera;
public bool useMouse = true;
//定义摄像机可以活动的范围
public float xMin = -100;
public float xMax = 100;
public float zMin = -100;
public float zMax = 100;
//这个变量用来记录单指双指的变换
private bool m_IsSingleFinger;
//初始化游戏信息设置
void Start()
{
m_Camera = this.GetComponent<Camera>();
m_CameraOffset = m_Camera.transform.position;
}
void Update()
{
//判断触摸数量为单点触摸
if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Began || !m_IsSingleFinger)
{
//在开始触摸或者从两字手指放开回来的时候记录一下触摸的位置
lastSingleTouchPosition = Input.GetTouch(0).position;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
MoveCamera(Input.GetTouch(0).position);
}
m_IsSingleFinger = true;
}
else if (Input.touchCount > 1)
{
//当从单指触摸进入多指触摸的时候,记录一下触摸的位置
//保证计算缩放都是从两指手指触碰开始的
if (m_IsSingleFinger)
{
oldPosition1 = Input.GetTouch(0).position;
oldPosition2 = Input.GetTouch(1).position;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
ScaleCamera();
}
m_IsSingleFinger = false;
}
//用鼠标的
if (useMouse)
{
distance -= Input.GetAxis("Mouse ScrollWheel") * scaleFactor;
distance = Mathf.Clamp(distance, minDistance, maxDistance);
if (Input.GetMouseButtonDown(0))
{
lastSingleTouchPosition = Input.mousePosition;
Debug.Log("GetMouseButtonDown:" + lastSingleTouchPosition);
}
if (Input.GetMouseButton(0))
{
MoveCamera(Input.mousePosition);
}
}
}
/// <summary>
/// 触摸缩放摄像头
/// </summary>
private void ScaleCamera()
{
//计算出当前两点触摸点的位置
var tempPosition1 = Input.GetTouch(0).position;
var tempPosition2 = Input.GetTouch(1).position;
float currentTouchDistance = Vector3.Distance(tempPosition1, tempPosition2);
float lastTouchDistance = Vector3.Distance(oldPosition1, oldPosition2);
//计算上次和这次双指触摸之间的距离差距
//然后去更改摄像机的距离
distance -= (currentTouchDistance - lastTouchDistance) * scaleFactor * Time.deltaTime;
//把距离限制住在min和max之间
distance = Mathf.Clamp(distance, minDistance, maxDistance);
//备份上一次触摸点的位置,用于对比
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
//Update方法一旦调用结束以后进入这里算出重置摄像机的位置
private void LateUpdate()
{
var position = m_CameraOffset + m_Camera.transform.forward * -distance;
m_Camera.transform.position = position;
}
private void MoveCamera(Vector3 scenePos)
{
Vector3 lastTouchPostion = m_Camera.ScreenToWorldPoint(new Vector3(lastSingleTouchPosition.x, lastSingleTouchPosition.y, -1));
Vector3 currentTouchPosition = m_Camera.ScreenToWorldPoint(new Vector3(scenePos.x, scenePos.y, -1));
Vector3 v = currentTouchPosition - lastTouchPostion;
m_CameraOffset += new Vector3(v.x, 0, v.z) * m_Camera.transform.position.y;
//把摄像机的位置控制在范围内
m_CameraOffset = new Vector3(Mathf.Clamp(m_CameraOffset.x, xMin, xMax), m_CameraOffset.y, Mathf.Clamp(m_CameraOffset.z, zMin, zMax));
//Debug.Log(lastTouchPostion + "|" + currentTouchPosition + "|" + v);
lastSingleTouchPosition = scenePos;
}
}
网友评论