Unity【角色/摄像机移动控制】【3.摄像机跟随角色】

本章代码基于前两章。
1. 我们新建CameraController脚本,将其挂载到Camera上
2. 在角色Player下新建一个空物体,命名为cameraTargetPoint,并将该物体挂载至CameraController脚本中【注意代码中的这行:public Transform cameraTargetPoint;】,将该空物体放在人物头部附近位置
3.将PlayerController脚本绑定至CameraController中【public PlayerController playerController;】
4.本章代码的实现原理是让摄像机对准空物件,并保持一定距离

5. 具体代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraController : MonoBehaviour
{private static float lower_upper_bound = 60f;public Transform cameraTargetPoint;public float cameraDistance = 5.0f;public Vector2 verticalRange = new Vector2(-lower_upper_bound, lower_upper_bound);public float cameraSensitivity = 120f;private Transform verticalObj;private Transform horizontalObj;private float horizontalValue;private float verticalValue;public PlayerController playerController;// Start is called before the first frame updatevoid Start(){horizontalObj = new GameObject("Camera Horizontal").transform;horizontalObj.SetParent(cameraTargetPoint);horizontalObj.localPosition = Vector3.zero;horizontalObj.localRotation = Quaternion.identity;verticalObj = new GameObject("Camera Vertical").transform;verticalObj.SetParent(horizontalObj);verticalObj.localPosition = Vector3.zero;verticalObj.localRotation = Quaternion.identity;transform.SetParent(verticalObj);transform.localPosition = new Vector3(0,0,-cameraDistance);transform.localRotation = Quaternion.identity; }// Update is called once per framevoid Update(){cameraMoving();DoNotTouchTheGround();}private void cameraMoving(){horizontalValue += Input.GetAxis("Mouse X") * Time.deltaTime * cameraSensitivity;horizontalObj.localRotation = Quaternion.Euler(new Vector3(0, horizontalValue, 0));verticalValue += Input.GetAxis("Mouse Y") * Time.deltaTime * cameraSensitivity;verticalValue = Mathf.Clamp(verticalValue, verticalRange.x, verticalRange.y);verticalObj.localRotation = Quaternion.Euler(new Vector3(-verticalValue, 0, 0));}private void DoNotTouchTheGround()    // 摄像机与角色点中间有物体时,让摄像机处于物体前,避免遮挡{Vector3 distanceVec = transform.position - cameraTargetPoint.position;float distance = distanceVec.magnitude;RaycastHit hit;if(Physics.Raycast(cameraTargetPoint.position,distanceVec, out hit,distance)){if(hit.transform.tag != "Player"){transform.position = hit.point;}else{transform.localPosition = Vector3.Lerp(transform.localPosition, new Vector3(0, 0, -distance), 0.3f);}}else{transform.localPosition = Vector3.Lerp(transform.localPosition, new Vector3(0, 0, -distance), 0.3f);}}
}

Tips:以上代码中,DoNotTouchTheGround()方法不是必须的,该方法是用于限制当摄像机与角色之间有障碍物时,把摄像机放在障碍物前方以避免视觉阻碍,可以看情况添加。

至此,我们可以实现摄像机跟随角色移动,并且鼠标能操控摄像机绕着角色转动,但仍有一个问题:当摄像机位于人物前方时,人物前进方向仍是我们的后方,这是由于参考坐标系的缘故,具体修复如下:

1. 在PlayerController脚本中,添加

public Transform cameraTargetPoint;

在Move方法中添加【moveingVec = cameraTargetPoint.TransformDirection(moveingVec);】:

private void Move(){float horizontalInput = Input.GetAxis("Horizontal");float verticalInput = Input.GetAxis("Vertical");Vector3 moveingVec = new Vector3(horizontalInput, 0f, verticalInput) * Time.deltaTime * speed;moveingVec = cameraTargetPoint.TransformDirection(moveingVec);transform.Translate(moveingVec);}

2. 在CameraController脚本中的cameraMoving()方法中添加下句:

playerController.cameraTargetPoint = horizontalObj;

于是即可实现摄像头跟随鼠标,并围绕角色运动,并且角色运动方向【仅仅是方向,如果要人物转向,则还需其他修改,本系列其他章节会有涉及】可以自适应为当前摄像头的前方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分算法02

二分算法02 1. 每个小孩最多能分到多少糖果2. 准时到达的列车最小时速3. 在 D 天内送达包裹的能力 1. 每个小孩最多能分到多少糖果 给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 &am…

一文搞懂LDO !

7.LDO 1.原理 通过运放调节P-MOS的输出 低压差: 输出压降比较低,例如输入3.3V,输出可以达到3.2V。 线性: LDO内部的MOS管工作于线性状态。(可变电阻区) 稳压器: 说明了LDO的用途是用来给电…

Panalog大数据日志审计系统libres_syn_delete.php存在命令执行漏洞

文章目录 前言声明一、Panalog大数据日志审计系统简介二、漏洞描述三、影响版本四、漏洞复现五、整改意见 前言 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中,针对网络流量的信息进行日志留存&#xff0c…

Maven(基础)、MyBatis

简介 Apache Maven是一个项目管理和构建工具,它基于项目对象模型 (POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档 官网: http://maven.apache.org/ Maven作用 Maven是专门用于管理和构建Java项目的工具,它的主要功能有&#x…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU(中央处理器)在处理数据的时候,是通过地址总线把需要的数据从内存中读取的,后通过数据总线把处理后的数据放回内存中。如下图所示: 计算机把内存划分为⼀个个的内存单元,每…

php使用get_browser()函数将移动端和pc端分开

首先,确保你的PHP版本支持get_browser函数。get_browser函数是PHP内置的函数,但需要配置php.ini文件中的browscap参数,指定一个浏览器配置文件。 下载浏览器配置文件。你可以从 https://download.csdn.net/download/bigorange1/88850695 下…

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload,然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

Python编程语言学习

1.Python 特点 Python是一种简单、易读、易学和高效的编程语言,具有以下特点: 简单易学:Python采用清晰简洁的语法,注重代码的可读性和可维护性,使得初学者能够快速上手并编写出清晰的代码。 面向对象:Py…

Android EditText关于imeOptions的设置和响应

日常开发中,最绕不开的一个控件就是EditText,随之避免不了的则是对其软键盘事件的监听,随着需求的不同对用户输入的软键盘要求也不同,有的场景需要用户输入完毕后,有一个确认按钮,有的场景需要的是回车&…

GPIO控制和命名规则

Linux提供了GPIO子系统驱动框架,使用该驱动框架即可灵活地控制板子上的GPIO。 GPIO命名 泰山派开发板板载了一个40PIN 2.54间距的贴片排针,排针的引脚定义兼容经典40PIN接口。 在后续对GPIO进行操作前,我们需要先了解k3566的GPIO命名规则&a…

Unity开发过程中背包系统性能优化方案

在游戏开发中,背包系统是非常常见并且重要的一部分。然而,如果不合理地设计与实现,它可能导致游戏运行效率降低,影响玩家的游戏体验。在Unity中,背包系统的优化需要考虑以下几个方面: 1. 使用对象池&#x…

windows10重装系统后, 磁盘目录上出现了一个黄色三角感叹号和一把锁(BitLocker解锁)

BitLocker解锁 通过cmd命令窗口关闭Bitlocker锁 通过cmd命令窗口关闭Bitlocker锁 manage-bde -off D:执行这个命令之后会发现提示【解密正在进行中】,但是一般来说对于这种所谓的进行中都会想要明确的看到进度显示 那么就需要用到下一个命令了 manage-bde -status…

vue transition结合animate.css动画库

transition结合animate.css动画库 安装 npm install animate.css --save 在main.js中引用 import animated from animate.css Vue.use(animated) 在transition标签上使用 <transition enter-active-class"animate__animated animate__fadeInUp" leave-acti…

SQL-2

刷题知识点&#xff1a; null不能用这种判断&#xff0c;要用is null 或者is not null 或者可用 ifnull来判断。 明确&#xff1a;数据库DB是数据存储仓库。 数据库管理系统&#xff08;Database management system&#xff0c;DBMS&#xff09;&#xff0c;是操纵和管理数据库…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例&#xff1a;构建一个去中心化身份系统案例 Demo&#xff1a;创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1&#xff1a;管…

http相关概念以及apache的功能

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

见微知著:数据可视化助力数字化时代决策智慧

在数字化时代的浪潮中&#xff0c;数据可视化显然是推动数字化进程不可或缺的利器。通过将复杂的数据转化为直观的图形和图表&#xff0c;数据可视化为企业和组织提供了更清晰、更有效的方式来理解和应用大量的数字信息。下面我就以可视化从业者的角度&#xff0c;来简单聊聊这…

浅谈TCP协议的可靠含义和三次握手

这里不过多阐述计算机网络的体系结构&#xff0c;本文主要是想阐述三次握手和可靠连接之间的联系。TCP协议全称传输控制协议&#xff08;Transmission Cotrol Protocol&#xff09;。 1、TCP协议运行在哪一层 TCP运行在运输层。 2、TCP协议的可靠是什么意思 步入主题&…

maven异常记录-must be unique

maven 打包异常记录 我们可以看看一个重要的异常&#xff1a; dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: org.springframework.boot:spring-boot-starter-test 经过检查pom文件 果然是spring-boot-starter-test引用重复&#xff0c;平…

c编译器学习01:tcc、chibicc简介

出发点 最近在调研大量c代码&#xff0c;人工效率比较低&#xff0c;感觉能用c编译器&#xff0c;实现自动生成代码、自动检查代码…都需要一个基础&#xff1a;c编译器。 tcc https://bellard.org/tcc/ 这个是我目前准备使用的编译器&#xff0c;因为"With libtcc, yo…