Unity 知识点 - 3D游戏 - 视角跟随和键盘移动
前言:
- 目前在跟着麦扣的3D游戏教程入门unity,《Unity官方游戏开发认证教程:3D RPG系列课程介绍(Unity2020)|Unity中文课堂》。
- 教程中使用的跟随相机是安装
cinemachine
插件,添加Carete Virtual Camera
虚拟相机。这个相机不能转动视角,而且教程移动只能靠鼠标,不方便。- 所以想要实现键盘移动,且正常视角移动。就像普通的3D游戏一样
1.转动视角
参考教程:《unity 的Cinemachine组件运用》
- 搜索了一下,发现原来
cinemachine
插件可创建freeLook
虚拟相机,这个相机可以直接实现转动视角的效果。 - 可调参数有很多,下面列举一些我明白意思且 认为重要的。
Follow
:跟随对象。Lens - 视野
:默认的很小,几乎大头贴,第一人称了,需要拉远一点。X/Y Axis - 值
:上下高度,可以设置默认值。运行时会变动。X/Y Axis - Speed
:转动的速度,相当于跟随的灵敏度。X/Y Axis - Input Axis Name
:输入的变量,默认是鼠标的移动,还可以设置成方向键。X/Y Axis - Input Axis Value - Invenrt
:这个是反向的勾选,默认的可能反向,方向不对可以修改调整。
2.键盘移动
参考代码:《Unity 键盘WASD 实现物体移动》
A:原本我是想着模仿2D入门教程里的做法,赋值速度的。但是发现角色对象没有刚体这个组件(突然好奇是怎么立在地图上的),没有速度的属性……
B:后来我想到,既然本来就自带了导航组件,或许应该顺着使用导航来实现键盘移动。只需要每次按键就导航一小段距离就好了。
A: 直接使用读取按键输入,然后叠加在坐标上,就可以实现移动了。但因为坐标系的问题,我按W向前,并不是向前,而是朝正X轴方向轴……这就相当于只能轴8个方向了。真正要实现的应该是我视角朝哪边,就往哪边前进。
B:运用简单的数学知识——三角函数和反三角函数。我可以根据虚拟相机和角色的坐标,计算出二者相当于绝对坐标系的夹角,然后再输出。代码实现后就是如下效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public class MouseManager : MonoBehaviour
{public float moveSpeed; // 移动速度public Transform playerTransform, camTransform; // ...略一些非重点代码,导航相关的void Update(){KeyboardToMove(); // 运动控制}// ...略一些非重点代码,导航相关的// 键盘移动public void KeyboardToMove(){float xPosition = playerTransform.position.x; // 原坐标float zPosition = playerTransform.position.z; float ad_input = Input.GetAxisRaw("Horizontal"); // 读取键盘输入,返回-1、0、1float ws_input = Input.GetAxisRaw("Vertical"); if(ad_input != 0 || ws_input != 0) // 如果有输入{double alpha = (playerTransform.position.x - camTransform.position.x);alpha /= (playerTransform.position.z - camTransform.position.z);alpha = Math.Atan(alpha); // 求反正切,返回弧度制if((playerTransform.position.z - camTransform.position.z) < 0) // 这个是重点{ad_input = -ad_input;ws_input = -ws_input; // 发现一个数学问题,当z轴差为负数时,操作会反向……懒得推导为什么了}xPosition += ws_input * Time.deltaTime * moveSpeed * (float)Math.Sin(alpha); // 前后输入zPosition += ws_input * Time.deltaTime * moveSpeed * (float)Math.Cos(alpha);xPosition += ad_input * Time.deltaTime * moveSpeed * (float)Math.Sin(alpha + Math.PI / 2); // 左右输入zPosition += ad_input * Time.deltaTime * moveSpeed * (float)Math.Cos(alpha + Math.PI / 2); // 注意角度要加PI/2Vector3 v3 = new Vector3(xPosition, playerTransform.position.y, zPosition); // 合成坐标OnMouseClicked?.Invoke(v3); // 调用方法,将坐标输出到导航系统 }}
}
一开始测试
sin
和cos
时弄得自己头昏目眩,因为懒得细节的每一个方向都推导出来,好麻烦。我就一个一个试,反正就2种情况。太不严谨了,所以导致了一个错误。
A:一开始是先只有前后键输入,测试是否成功。一开始还好,但发现时不时就会方向混乱。
B:根据之前写ros坐标系的经验,我推断是坐标的正负问题。然后反复测试观察(懒得动笔算数学),发现当朝向面向Z轴负半轴时,WS键的功能会交互。W是后退,S是前进。所以就加了一个判断,但z轴差为负时就取相反数。
A:然后添加左右键输入的功能,测试发现更加混乱了。
B:稍微推导了一下,当夹角为零时,左右前进就相当于夹角为90°的前后前进。所以加了
PI/2
。同时左右也有刚刚的问题,所以当面向Z负半轴就取相反数。
3.补充
- 经过深入学习,我发现其实不用那么麻烦……不需要自行编写的代码实现了角色坐标系相对世界坐标系的转变。unity中已经有一个函数方法可以直接调用,直接计算,方便得很……上面的计算可以化简使用下面2个函数实习。
transform.TransformDirection(Vector3)
;按角色的相对坐标移动;《transform.TransformDirection(Vector3)》Quaternion.LookRotation(Vector3)
;将向量转换为四元数,用于转向;《Quaternion.LookRotation(Vector3)》
/*
... 省略其他代码 ...
*/
if (MoveStatus != MoveStatus_E.Ldile) // 原地跳跃也算原地
{// 转换坐标后赋值PlayerRigid.velocity = PlayerTrans.TransformDirection(vector_i);// 一定要将y轴设为0vector_i = (CameraTrans.position - PlayerTrans.position);vector_i.y = 0; // 方向相反,所以使用负号;// 修复BUG:偶尔卡死无法旋转角度,判断是否有改变才选择,不然容易卡死。// 卡死时在场景中手动旋转一下后又可以用了。if (Quaternion.LookRotation(-vector_i) != PlayerRigid.rotation)PlayerRigid.rotation = Quaternion.LookRotation(-vector_i); // 这里使用刚体运动,所以有转向,如果是导航组件只需要坐标即可自动转向。// Debug.Log("测试代码 :" + PlayerRigid.rotation);
}
总结:
- 这个写法是基于使用刚体组件移动,而不是使用导航组件,所以这个转向是瞬间完成的。
- 而且因为我现在使用的人物模式和动画有向左右前后走的动画,和之前只有向前走不同。
- 体验过后感觉各有各的好处:使用刚体转向太生硬了,但是灵活。使用导航比较顺滑,但是单调。
- 用我在玩的游戏作类比的话,刚体就像FPS游戏,守望先锋类;导航就像RPG游戏,原神类。
- 最后再补充一下使用导航的方法,数学真奇妙~~
/*
...省略获得按键输入...
*/
vector_i.Normalize(); // 归一化
// 重点!!!按照相机的坐标转换,再累加到角色的原坐标上
vector_i = CameraTrans.TransformDirection(vector_i) + PlayerTrans.position; PlayerAgent.destination = vector_i; // 设定导航目标点
- 注意在使用
TransformDirection
转换坐标时,是将期望方向按相机的坐标转换,这样就可以省去计算角色和相机的角度。最后再累加上角色的原坐标点,就是导航期望的目标点。
Unity 知识点 - 3D游戏 - 视角跟随和键盘移动相关推荐
- Unity3D Input System 安卓 3d游戏视角控制。
#region 控制摄像机///currentTouchscreen = { Touchscreen currentTouchscreen = Touchscreen.current; } 在 OnS ...
- Adobe Unity大战3D网游市场
供稿/ IIEEG 假如分析师的判断无误,整个游戏行业未来五年的市场规模将达870亿美元,在线和移动游戏的份额将占据半壁江山,那么问题就来了:拿什么去抢占这块市场蛋糕? 支持开发3D浏览器游戏的先进技 ...
- 22. Unity - 3D游戏开发小计01 --- 修复动画BUG、更改环境光照、导航网格、相机跟随、场景渲染后期处理
1. 导入玩家角色模型 素材来自于unity官网:3D Beginner:Tutorial Resources 在3D游戏开发中,三维物体模型一般会有团队内的其它成员提供,包括模型本身和动画文件等.我 ...
- 《游戏开发基础》课程论文丨基于Unity与Bolt的抗美援朝主题3D游戏设计
文章目录 摘要 关键词 一.导言 二.角色操控 2.1 隐藏鼠标 2.2 通过移动鼠标更新玩家视角 2.3 使角色跳跃 2.4 使角色移动 2.5 使角色冲刺 2.6 使角色卧倒 2.7 设置准星及切 ...
- Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...
- 雨松MOMO《Unity 3D游戏开发》源码公布
原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...
- 教你如何用Unity和Cardboard把3D游戏做成VR游戏
原网址 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51 ...
- 使用Unity制作3D驾驶游戏
使用Unity制作3D驾驶游戏 Unity2021 专业游戏设计 课程英文名:Make a Driving Game in Unity 08.2021 此视频教程共22.0小时,中英双语字幕,画质清晰 ...
- 老司机教你如何用Unity和Cardboard把3D游戏做成VR游戏
原网址 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51 ...
最新文章
- 面试官眼中的计算机水平,面试官最不喜欢的五句话,千万别说了
- 计算机二级python基础知识总结-计算机二级python 知识点篇(程序的控制结构)...
- 聊聊职场那些事儿(转)
- jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .
- GitHub 发布 2018 年开源项目趋势预测
- python Django基本介绍
- lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法
- Android中ContentProvider组件详解
- Intellij IDEA安装与使用,完整详细。
- super-smack
- 计算机专业范文推荐信,出国留学推荐信范文,计算机专业
- c语言实用程序6,C语言实用程序设计100例流程图
- java rx3x_GitHub - xkm123/oss-sdk-java: java sdk for oss
- 《时代》杂志评出2007年50个最佳网站
- CSS3 calc() 用法
- Open Set Domain Adaptation by Backpropagation
- 关于AlertDialog的小坑
- win10 ie设置不了代理服务器
- python抓取豆瓣电影
- 抖音充值显示服务器繁忙是什么原因,为什么抖音充值总是失败呢