Cliquez avec le bouton droit de l'unité pour faire pivoter, faites défiler la molette pour zoomer, cliquez avec le bouton central pour effectuer un panoramique, suivez le joueur

1. Avec la caméra au centre, faites un clic droit pour faire pivoter

Montez le script sur la caméra et faites pivoter le champ de vision autour de la caméra

    private Vector2 offs;
    public float speed=2;
	void Start () {
    
    
        offs = transform.eulerAngles;
	}
	void Update () {
    
    
        if (Input.GetMouseButton(1))     //用户交互的键入
        {
    
    
            offs += new Vector2(Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X"))*speed;   //摄像机旋转的控制
            transform.eulerAngles = offs;
        }
	}

2. Prenez l'objet au centre, cliquez avec le bouton droit pour faire pivoter, faites défiler la molette pour zoomer et le bouton du milieu pour effectuer un panoramique

Le script est monté sur la caméra

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * 以物体target为中心
 * 右键上下左右旋转
 * 滚轮视野拉近拉远
 * 中键平移场景
 */
public class CameraController : MonoBehaviour
{
    
    	
	public Transform target;//相机跟随的目标物体,一般是一个空物体;没有需要为中心的物体时,为摄像机即可,target=gameObject.transform;
	private int MouseWheelSensitivity = 1; //滚轮灵敏度设置
	private int MouseZoomMin = 1; //相机距离最小值
	private int MouseZoomMax = 20; //相机距离最大值

	private float moveSpeed = 10; //相机跟随速度(中键平移时),采用平滑模式时起作用,越大则运动越平滑

	private float xSpeed = 5.0f; //旋转视角时相机x轴转速
	private float ySpeed = 2.0f; //旋转视角时相机y轴转速

	private float x = 0.0f; //存储相机的euler角
	private float y = 0.0f; //存储相机的euler角

	private float Distance = 0; //相机和target之间的距离
	private Vector3 targetOnScreenPosition; //目标的屏幕坐标,第三个值为z轴距离
	private Quaternion storeRotation; //存储相机的姿态四元数
	private Vector3 CameraTargetPosition; //target的位置
	private Vector3 initPosition; //平移时用于存储平移的起点位置
	private Vector3 cameraX; //相机的x轴方向向量
	private Vector3 cameraY; //相机的y轴方向向量
	private Vector3 cameraZ; //相机的z轴方向向量

	private Vector3 initScreenPos; //中键刚按下时鼠标的屏幕坐标(第三个值其实没什么用)
	private Vector3 curScreenPos; //当前鼠标的屏幕坐标(第三个值其实没什么用)
	void Start()
	{
    
    
		//这里就是设置一下初始的相机视角以及一些其他变量,这里的x和y。。。是和下面getAxis的mouse x与mouse y对应
		var angles = transform.eulerAngles;
		x = angles.y;
		y = angles.x;
		CameraTargetPosition = target.position;
		storeRotation = Quaternion.Euler(y, x, 0);
		transform.rotation = storeRotation; //设置相机姿态

		Distance = (transform.position - target.position).magnitude;
		//四元数表示一个旋转,四元数乘以向量相当于把向量旋转对应角度,然后加上目标物体的位置就是相机位置了
		transform.position = storeRotation * new Vector3(0, 0, -Distance) + CameraTargetPosition; //设置相机位置
	}

	void Update()
	{
    
    
		//鼠标右键旋转功能
		if (Input.GetMouseButton(1))
		{
    
    
			x += Input.GetAxis("Mouse X") * xSpeed;
			y -= Input.GetAxis("Mouse Y") * ySpeed;

			//上下旋转的限制角度
			y = ClampAngle(y, 40, 120);
			//左右旋转的限制角度
			x = ClampAngle(x, 40, 80);

			storeRotation = Quaternion.Euler(y, x, 0);
			var position = storeRotation * new Vector3(0.0f, 0.0f, -Distance) + CameraTargetPosition;

			transform.rotation = storeRotation;
			transform.position = position;
		}
		else if (Input.GetAxis("Mouse ScrollWheel") != 0) //鼠标滚轮缩放功能
		{
    
    
			if (Distance >= MouseZoomMin && Distance <= MouseZoomMax)
			{
    
    
				Distance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
			}
			if (Distance < MouseZoomMin)
			{
    
    
				Distance = MouseZoomMin;
			}
			if (Distance > MouseZoomMax)
			{
    
    
				Distance = MouseZoomMax;
			}
			
			transform.position = storeRotation * new Vector3(0.0F, 0.0F, -Distance) + CameraTargetPosition;
		}

		//鼠标中键平移
		if (Input.GetMouseButtonDown(2))
		{
    
    
			cameraX = transform.right;
			cameraY = transform.up;
			cameraZ = transform.forward;

			initScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
			
			//targetOnScreenPosition.z为目标物体到相机xmidbuttonDownPositiony平面的法线距离
			targetOnScreenPosition = Camera.main.WorldToScreenPoint(CameraTargetPosition);
			initPosition = CameraTargetPosition;
		}

		if (Input.GetMouseButton(2))
		{
    
    
			curScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
			//0.01这个系数是控制平移的速度,要根据相机和目标物体的distance来灵活选择
			target.position = initPosition - 0.01f * ((curScreenPos.x - initScreenPos.x) * cameraX + (curScreenPos.y - initScreenPos.y) * cameraY);

			//重新计算位置
			Vector3 mPosition = storeRotation * new Vector3(0.0F, 0.0F, -Distance) + target.position;
			transform.position = mPosition;

			//用这个会让相机的平移变得更平滑,但是可能在你buttonup时未使相机移动到应到的位置,导致再进行旋转与缩放操作时出现短暂抖动
			//transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed);

		}
		if (Input.GetMouseButtonUp(2))
		{
    
    
			//平移结束把cameraTargetPosition的位置更新一下,不然会影响缩放与旋转功能
			CameraTargetPosition = target.position;
		}

	}

	//将angle限制在min~max之间
	static float ClampAngle(float angle, float min, float max)
	{
    
    
		if (angle < -360)
			angle += 360;
		if (angle > 360)
			angle -= 360;
		return Mathf.Clamp(angle, min, max);
	}
	
}

3. La caméra suit le joueur

Une méthode simple consiste à faire glisser la caméra directement sous le lecteur en tant que sous-objet du lecteur. Une autre méthode consiste à obtenir le vecteur de décalage entre la caméra et le lecteur et à définir la position de la caméra en conséquence.
Le script se bloque sur la caméra

public class FollowPlayer : MonoBehaviour {
    
    

        private Transform player;
        private Vector3 offsetPosition;

    // Use this for initialization
    void Start () {
    
    
        player = GameObject.FindGameObjectWithTag(“Player”).transform;
        offsetPosition = transform.position - player.position;
        transform.LookAt(player.position);
    }

    // Update is called once per frame
    void Update () {
    
    
        transform.position = offsetPosition + player.position;

    }

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45686837/article/details/123045943
conseillé
Classement