• Unity 摄像机旋转跟随缩放控制


     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 
     5 public class CameraController : MonoBehaviour
     6 {
     7 
     8     [SerializeField]
     9     private float distance = 5f;    //跟随距离
    10     [SerializeField]
    11     private float speed = 2f;   //跟随速率
    12     [SerializeField]
    13     private float mouseSpeed = 2f;  //鼠标移动敏感度
    14     [SerializeField]
    15     private float mouseScroll = 2f; //鼠标缩放速率
    16 
    17     //跟随最大与最小距离
    18     private float distanceMin = 2f;
    19     private float distanceMax = 15f;
    20     private Transform target;   //摄像机跟随的目标
    21     private Vector3 targetPos;  //目标位置
    22     private Vector3 direction = Vector3.zero;   //摄像机移动的方向
    23     private float mouseX = 0f;  //鼠标x轴移动值
    24     private float mouseY = 15f; //鼠标y轴移动值
    25     private float mouseYMin = -5f;   //鼠标y轴移动值最小值
    26     private float mouseYMax = 89.5f;    //鼠标y轴移动值最大值
    27 
    28 
    29     private void Awake()
    30     {
    31         target = GameObject.FindWithTag("Player").transform;
    32         direction = target.position - transform.position;
    33     }
    34 
    35     private void LateUpdate()
    36     {
    37         GetInput();
    38 
    39         CameraRotate();
    40 
    41         CalculateTargetPos();
    42 
    43         FollowTarget();
    44     }
    45 
    46     private void CalculateTargetPos()
    47     {
    48         //文章入口的代码图解
    49         targetPos = target.position - direction.normalized * distance;
    50     }
    51 
    52     private void FollowTarget()
    53     {
    54         transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * speed);
    55         transform.LookAt(target.position);
    56     }
    57 
    58     private void GetInput()
    59     {
    60         if (Input.GetMouseButton(0))
    61         {
    62             Cursor.visible = false;
    63 
    64             mouseX += Input.GetAxis("Mouse X") * mouseSpeed;
    65             //摄像机鼠标上下移动与mouseY是相反的,可自己通过观察可得,这里就不明说了
    66             mouseY -= Input.GetAxis("Mouse Y") * mouseSpeed;
    67 
    68             mouseY = Mathf.Clamp(mouseY, mouseYMin, mouseYMax);
    69 
    70         }
    71         else Cursor.visible = true;
    72 
    73         distance = distance - Input.GetAxis("Mouse ScrollWheel") * mouseScroll;
    74         distance = Mathf.Clamp(distance, distanceMin, distanceMax);
    75 
    76     }
    77 
    78     private void CameraRotate()
    79     {
    80         Quaternion rotation = Quaternion.Euler(mouseY, mouseX, 0);
    81         //transform.rotation = rotation;    //不围绕目标旋转
    82         //Quaternion作用于Vector3的右乘操作(*)返回一个将向量做旋转操作后的向量.
    83         //这里算是一个难点,这里意思是将根据鼠标XY轴旋转“加到”Vector3.forward向前向量,所以direction是经过了旋转的向前向量
    84         //就好像一条直线绕着一点旋转了一样
    85         direction = rotation * Vector3.forward;
    86     }
    87 
    88 }
  • 相关阅读:
    [读书笔记]SQLSERVER企业级平台管理实践读书笔记--从等待事件判断性能瓶颈
    Docker machine学习
    不同数据库连接字符串的网站
    Windows 可以操纵linux内文件,与本地一致的工具
    OpenSSH 安全漏洞(CVE-2021-28041)修复(升级OpenSSH至最新版本(8.6p1))
    PostgreSQL
    firewalld添加/删除服务service,端口port
    PostgreSQL 序列操作
    PostgreSQL/pgsql 为表添加列/ 判断列存不存在再添加列
    Windows10中Power Shell(x64)出现“无法加载 PSReadline 模块。控制台在未使用 PSReadline 的情况下运行。”的解决办法
  • 原文地址:https://www.cnblogs.com/SeaSwallow/p/6568477.html
Copyright © 2020-2023  润新知