Unity 屏幕移动和放大缩小——PC和移动端(手机)

目录

一、PC端屏幕移动(英雄联盟效果)

效果演示

 代码部分 (挂到移动的相机即可)

 二、PC端拉近缩远

效果演示

 代码部分 (挂到移动的相机即可)

三、移动端视角移动

代码部分(挂到移动的相机即可)

四、移动端拉近缩远

代码部分(挂到移动的相机即可)


一、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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/q1295006114/article/details/131383393