摄像机旋转,视距调节,第一/第三人称控制器可切换
摄像机位置自己看着摆放
Camera 跟随player
MainCameraModeilocationRecord 是空物体放在MaiCamera 同一位置
head 是头部放在你认为的第一人称视角的地方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 玩家控制器
/// </summary>
public class PlayerController : MonoBehaviour
{
[Header("切换第一人称")]
[Tooltip("切换第一人称时为true")]
public bool FirstPersonExchange = false;
[Tooltip("记录摄像机第三人称的位置")]
public Transform MainCameraModelLocationRecord;
[Tooltip("第一人称摄像机的位置")]
public Transform Head;
[Header("玩家的移动和旋转参数")]
[Tooltip("走路速度")]
public float WalkingSpeed = 3;
[Tooltip("跑步速度")]
public float RunningSpeed = 5;
[Header("玩家的自身旋转和位置")]
[Tooltip("玩家自身旋转速度")]
public float PlayerRotationSpeed = 10;
[Tooltip("人物位置")]
public Transform PlayerModelsTransform;
[Tooltip("位置输入")]
private Vector3 _moveDirection = Vector3.zero;
[Header("重力和跳跃的参数")]
[Tooltip("是否接地")]
public bool GroundCheck ;
[Tooltip("重力")]
public float Gravity = -15f;
[Tooltip("跳跃的力")]
public float JunpHeiqht = 5;
[Header("相机的旋转参数")]
[Tooltip("相机旋转速度")]
public float CameraRotationSpeed = 2;
[Tooltip("第三人称向上下看的范围")]
public float CameraRotationX = 30;
[Tooltip("第一人称向上下看的范围")]
public float FirstPersonCameraRotationX = 45;
[Header("相机的位置信息")]
[Tooltip("相机的父物体")]
public GameObject CameraFather;
[Tooltip("相机的模型")]
public GameObject MainCameraModel;
[Header("相机视野大小")]
[Tooltip("视野最大值")]
public float MaxFieldOfView = 100;
[Tooltip("视野最小值")]
public float MinFieldOfView = 10;
[Tooltip("判断是否按下键盘按键")]
private bool _isKeyboard = false;
[Tooltip("穿模物体储存")]
private List<MeshRenderer> _mesList = new List<MeshRenderer>();
[Tooltip("是否开启第三人称")]
private bool _isViewingAngleSwitching = false;
[Tooltip("不跳跃时Y的值")]
private float _Dontjump = 0;
[Tooltip("角色控制器")]
private CharacterController _characterController;
void Start()
{
_characterController = transform.GetComponent<CharacterController>();
}
void Update()
{
Move();
CameraRotation();
Zoom();
if (!FirstPersonExchange)
CameraOcclusion();
}
/// <summary>
/// 相机不穿模
/// </summary>
private void CameraOcclusion()
{
Vector3 CameraPointing = transform.position - MainCameraModel.transform.position;//相机到人物的向量
Ray CameraRay = new Ray(MainCameraModel.transform.position, CameraPointing);
RaycastHit hitInfo;
if (Physics.Raycast(CameraRay, out hitInfo))
{
if (hitInfo.collider.tag != "Player")
{
_mesList.Add(hitInfo.collider.gameObject.GetComponent<MeshRenderer>());
hitInfo.collider.gameObject.GetComponent<MeshRenderer>().enabled = false;
}
else
{
foreach (var item in _mesList)
{
item.enabled = true;
}
_mesList.Clear();
}
}
}
/// <summary>
/// 运动
/// </summary>
private void Move()
{
WalkingSpeed = Input.GetKey(KeyCode.LeftShift) ? RunningSpeed : 2.0f;//加速
if (GroundCheck)//跳跃
{
_Dontjump = Input.GetKeyDown(KeyCode.Space) ? JunpHeiqht : _Dontjump;
GroundCheck = false;
}
if (_characterController.isGrounded)
{
GroundCheck = true;
}
float _hprizontal = Input.GetAxis("Horizontal");
float _vertical = Input.GetAxis("Vertical");
_moveDirection = new Vector3(_hprizontal * WalkingSpeed, _Dontjump, _vertical * WalkingSpeed);
_moveDirection = transform.TransformDirection(_moveDirection);
_Dontjump += Gravity * Time.deltaTime;//重力
_characterController.Move(_moveDirection * Time.deltaTime);
Vector3 _movement = Vector3.zero;
_movement = transform.forward * _vertical + transform.right * _hprizontal;
_isKeyboard = _movement == Vector3.zero ? _isKeyboard : true;//判断是否有按键输入
if (_isKeyboard && !FirstPersonExchange)//人物自身旋转
{
transform.rotation = Quaternion.Slerp(transform.rotation, CameraFather.transform.rotation, 0.15f);
Quaternion PlayerModelsRotation = Quaternion.LookRotation(_movement);
PlayerModelsTransform.rotation = Quaternion.Lerp(PlayerModelsTransform.rotation, PlayerModelsRotation, Time.deltaTime * PlayerRotationSpeed);
_isKeyboard = false;
}
if (FirstPersonExchange)//第一人称相机位置
{
transform.rotation = Quaternion.Slerp(transform.rotation, CameraFather.transform.rotation, 0.15f);
PlayerModelsTransform.rotation = transform.rotation;
MainCameraModel.transform.position = Head.position;
_isViewingAngleSwitching = true;
}
else if (_isViewingAngleSwitching)//第三人称相机位置
{
MainCameraModel.transform.position = MainCameraModelLocationRecord.position;
MainCameraModel.transform.rotation = MainCameraModelLocationRecord.rotation;
_isViewingAngleSwitching = false;
}
}
/// <summary>
/// 相机旋转
/// </summary>
private void CameraRotation()
{
CameraRotationX = FirstPersonExchange ? FirstPersonCameraRotationX : 30;//第一和第三人称角度切换
CameraFather.transform.position = transform.position;//相机跟随
if (Input.GetMouseButton(1))
{
float cameraX = Input.GetAxis("Mouse X");
float cameraY = Input.GetAxis("Mouse Y");
if (cameraX != 0)//相机x轴旋转
{
CameraFather.transform.Rotate(Vector3.up, cameraX * 120 * CameraRotationSpeed * Time.deltaTime);
if (FirstPersonExchange)
transform.Rotate(Vector3.up, cameraX * 120 * CameraRotationSpeed * Time.deltaTime);
}
if (cameraY != 0)//相机Y轴旋转
{
MainCameraModel.transform.Rotate(Vector3.left, cameraY * 120 * CameraRotationSpeed * Time.deltaTime);
}
if (Vector3.Angle(CameraFather.transform.forward, MainCameraModel.transform.forward) > CameraRotationX)//上下视角约束
{
MainCameraModel.transform.Rotate(Vector3.left, -cameraY * 120 * CameraRotationSpeed * Time.deltaTime);
}
}
}
/// <summary>
/// 视距选择
/// </summary>
private void Zoom()
{
float camerazoom = Input.GetAxis("Mouse ScrollWheel");//鼠标滑轮
if (camerazoom < 0)
{
if (Camera.main.fieldOfView <= MaxFieldOfView)
{
Camera.main.fieldOfView += 2;
}
if (Camera.main.orthographicSize <= 20)
{
Camera.main.orthographicSize += 0.5f;
}
}
if (camerazoom > 0)
{
if (Camera.main.fieldOfView >= MinFieldOfView)
{
Camera.main.fieldOfView -= 2;
}
if (Camera.main.orthographicSize >= 5)
{
Camera.main.orthographicSize -= 0.5f;
}
}
}
}
摄像机旋转,视距调节,第一/第三人称控制器可切换相关推荐
- 使用新的输入系统在 Unity 中构建第三人称控制器
如果你随机挑选几款游戏,每款游戏可能会有不同的艺术风格和机制.不同的故事,甚至根本没有故事,但它们都有一个共同点:所有游戏都需要读取和处理输入来自键盘.鼠标.游戏手柄.操纵杆.VR 控制器等设备. 构 ...
- [Unity] GameFramework 学习记录 4:第三人称控制器
我想知道 UEntity 数据表中的编号跟每个实体表自己的编号之间是否需要统一,现在看来好像不需要统一,但是我也不知道是不是因为我还没看到这两个表有交互的时候 哦我才注意到,这个实体表是用来定义资源的 ...
- 处理unity第一第三人称游戏中的摄像机穿墙的问题
在之前我花过一段时间做了一个比较简单的第三人称射击类游戏 发现一个很难搞的BUG 就是在我们设定的摄像机和主角距离的空隙中间 如果有一些物体 会挡住主角 会给人极差的游戏体验 下面有两种解决方案 但是 ...
- [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器
重构前,我的控制器是这样子 Assets/MeowACT/Scripts/ThirdPerson/ThirdPerson.cs // --------------------------------- ...
- [Unity3d]第一人称和第三人称视角完美切换
最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂 ...
- 虚幻四如何实现第一人称_ue4用C++怎么实现第一人称和第三人称之间的切换?
我最近也在做这个,所以说一下自己的思路,,,, 你应该去看看官方的第一人称射击例子,,,我自己的话大致有两种做法,,, 首先说镜头, 第一种,效果好一点的,需要两个模型和两个动作蓝图,一个是第三人称模 ...
- [Godot] v4.0.alpha1 GDScript 实现第三人称控制器
版本:v4.0.alpha1.official [31a7ddbf8] 1. 完整代码 https://github.com/CheapMiao/Godot-ThirdPersonController ...
- UnityRPG第三人称控制器
## 引言: * 之前一直都很苦恼角色控制器和相机的跟随编写,最新版本中unity官方更新了InputActionAssety和StarterAssets,下面对其进行简单的介绍 * ### 下载示例 ...
- unity第三人称控制器2020.,在导入的时候没有选择重新启动,导致无法控制角色移动
1.在window中打开package Manager 2.把packages选择为unity Reigistry搜索Input System,然后安装就可以了
最新文章
- 爬取王垠的博客并生成pdf
- git bash的安装与配置
- WPF的binding
- ARM处理器工作模式
- goland 方法注释_goland 设置注释模板的过程图文详解
- java 当地时间_【JAVA】获取当地时间
- 信息学奥赛一本通(1106:年龄与疾病)
- 如何打开.azw3 .epub .mobi文件?
- excel表格分割线一分为二_高效秘技!用EXCEL制作导航页和日志表管理日常工作...
- 解决搭载M1芯片的Mac上安装犀牛Rhinoceros 7 for Mac的安装教程
- android gridview 详解,Android开发 GridView详解
- android中打开地理位置,Android中获取地理位置经纬度
- linux 运维工程师必备技能
- mybatis学习与理解
- lubuntu-调整分辨率
- c语言程序 存款利息的计算,【c语言】存款利息的计算
- 博途PLC 中位值滤波算法(FC功能块)
- 时尚快消品大行其道 高利润率堪比苹果公司
- 柯尼卡美能达Konica Minolta bizhub 308 打印机驱动
- 软件授权加密算法研究
热门文章
- Oracle 创建DBLink方法
- 二手交易小程序毕业设计,二手物品交易小程序系统设计与实现
- (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
- HTML5期末大作业:文化网页设计——西餐文化5页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
- 证书转换-SSL证书生成:cer,jks文件 韩俊强的博客
- SQL学习(一):months_between日期函数
- JavaScript定时器的各种案例
- 高手总结的9种 OOM 常见原因及解决方案
- airpods固件更新方法_Airpods怎么更新固件
- 税款输入不正确(代码J1,金额 0.00),改正 17.00 CNY