目录
一、PC端屏幕移动(英雄联盟效果)
鼠标屏幕周边检测移动
效果演示
代码部分 (挂到移动的相机即可)
using UnityEngine;
public class CameraMove : MonoBehaviour
{
private int SightDistancespeed = 15;
private float RectSize = 50f; //矩形大小
private float CameraMoveSpeed = 0.5f; //相机移动速度
private float CamerafieldOfView = 60; //相机的锥形视野范围
private Camera camera; //相机
//屏幕边缘四个矩形
private Rect RectUp;
private Rect RectDown;
private Rect RectLeft;
private Rect RectRight;
void Start()
{
//实例化屏幕边缘的四个矩形出来
RectUp = new Rect(0, Screen.height - RectSize, Screen.width, Screen.height);
RectDown = new Rect(0, 0, Screen.width, RectSize);
RectLeft = new Rect(0, 0, RectSize, Screen.width);
RectRight = new Rect(Screen.width - RectSize, 0, Screen.width, Screen.height);
camera = this.GetComponent<Camera>();
}
void Update()
{
CameraMoveAndLock();//视角移动和锁定
}
/// <summary>
/// 视角移动
/// </summary>
void CameraMoveAndLock()
{
//如果没有锁定相机(视野)可以移动
//如果鼠标在屏幕上的位置包含在这个矩形里
if (RectUp.Contains(Input.mousePosition))
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + CameraMoveSpeed);
}
if (RectDown.Contains(Input.mousePosition))
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - CameraMoveSpeed);
}
if (RectLeft.Contains(Input.mousePosition))
{
transform.position = new Vector3(transform.position.x - CameraMoveSpeed, transform.position.y, transform.position.z);
}
if (RectRight.Contains(Input.mousePosition))
{
transform.position = new Vector3(transform.position.x + CameraMoveSpeed, transform.position.y, transform.position.z);
}
//判断相机移动的边缘在哪里,不能 超过设定的最远距离
if (transform.position.z >= 30f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, 30f);
}
if (transform.position.z <= 6f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, 6f);
}
if (transform.position.x >= -3)
{
transform.position = new Vector3(-3, transform.position.y, transform.position.z);
}
if (transform.position.x <= -37f)
{
transform.position = new Vector3(-37, transform.position.y, transform.position.z);
}
}
}
二、PC端拉近缩远
鼠标滑轮进行特写缩小
效果演示
代码部分 (挂到移动的相机即可)
void Update()
{
SightDistance();//视距的缩放
}
/// <summary>
/// 中键滑轮拉远拉近
/// </summary>
void SightDistance()
{
float MouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
CamerafieldOfView += MouseScrollWheel * -SightDistancespeed;
CamerafieldOfView = Mathf.Clamp(CamerafieldOfView, 30, 60);
camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, CamerafieldOfView, Time.deltaTime * SightDistancespeed);
}
三、移动端视角移动
代码部分(挂到移动的相机即可)
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float smoothSpeed = 0.125f;
public float moveSpeed = 10f;
private Vector3 targetPosition;
private Vector3 velocity;
void Update()
{
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
targetPosition -= new Vector3(touchDeltaPosition.x, 0, touchDeltaPosition.y) * moveSpeed * Time.deltaTime;
}
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothSpeed);
}
}
四、移动端拉近缩远
代码部分(挂到移动的相机即可)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamManager : MonoBehaviour
{
public Camera cam;
public float max = 60;
public float min = 20;
private float dis = 0;
// Update is called once per frame
void Update()
{
if(Input.touchCount==2)
{
Touch t1=Input.GetTouch(0);
Touch t2=Input.GetTouch(1);
if(dis==0)
{
dis=Vector2.Distance(t1.position,t2.position);
}
else if(dis!=Vector2.Distance(t1.position,t2.position))
{
float a=Mathf.Sqrt(Screen.width*Screen.width+Screen.height*Screen.height);
float p=(dis-Vector2.Distance(t1.position,t2.position))/a;
if(cam.fieldOfView+p*(max-min)<max&&cam.fieldOfView+p*(max-min)>min)
{
cam.fieldOfView += p * (max - min);
}
dis=Vector2.Distance(t1.position,t2.position);
}
}
else if (dis!=0)
{
dis = 0;
}
}
}