前言:

  • 目前在跟着麦扣的3D游戏教程入门unity,《Unity官方游戏开发认证教程:3D RPG系列课程介绍(Unity2020)|Unity中文课堂》。
  • 教程中使用的跟随相机是安装 cinemachine插件,添加Carete Virtual Camera虚拟相机。这个相机不能转动视角,而且教程移动只能靠鼠标,不方便。
  • 所以想要实现键盘移动,且正常视角移动。就像普通的3D游戏一样

1.转动视角

参考教程:《unity 的Cinemachine组件运用》

  • 搜索了一下,发现原来 cinemachine插件可创建freeLook虚拟相机,这个相机可以直接实现转动视角的效果。
  • 可调参数有很多,下面列举一些我明白意思且 认为重要的。
  1. Follow:跟随对象。
  2. Lens - 视野:默认的很小,几乎大头贴,第一人称了,需要拉远一点。
  3. X/Y Axis - 值:上下高度,可以设置默认值。运行时会变动。
  4. X/Y Axis - Speed:转动的速度,相当于跟随的灵敏度。
  5. X/Y Axis - Input Axis Name:输入的变量,默认是鼠标的移动,还可以设置成方向键。
  6. 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); // 调用方法,将坐标输出到导航系统 }}
}

一开始测试sincos时弄得自己头昏目眩,因为懒得细节的每一个方向都推导出来,好麻烦。我就一个一个试,反正就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);
}

总结

  1. 这个写法是基于使用刚体组件移动,而不是使用导航组件,所以这个转向是瞬间完成的。
  2. 而且因为我现在使用的人物模式和动画有向左右前后走的动画,和之前只有向前走不同。
  3. 体验过后感觉各有各的好处:使用刚体转向太生硬了,但是灵活。使用导航比较顺滑,但是单调。
  4. 用我在玩的游戏作类比的话,刚体就像FPS游戏,守望先锋类;导航就像RPG游戏,原神类。
  • 最后再补充一下使用导航的方法,数学真奇妙~~
/*
...省略获得按键输入...
*/
vector_i.Normalize();                   // 归一化
// 重点!!!按照相机的坐标转换,再累加到角色的原坐标上
vector_i = CameraTrans.TransformDirection(vector_i) + PlayerTrans.position;   PlayerAgent.destination = vector_i;        // 设定导航目标点
  • 注意在使用TransformDirection转换坐标时,是将期望方向按相机的坐标转换,这样就可以省去计算角色和相机的角度。最后再累加上角色的原坐标点,就是导航期望的目标点。

Unity 知识点 - 3D游戏 - 视角跟随和键盘移动相关推荐

  1. Unity3D Input System 安卓 3d游戏视角控制。

    #region 控制摄像机///currentTouchscreen = { Touchscreen currentTouchscreen = Touchscreen.current; } 在 OnS ...

  2. Adobe Unity大战3D网游市场

    供稿/ IIEEG 假如分析师的判断无误,整个游戏行业未来五年的市场规模将达870亿美元,在线和移动游戏的份额将占据半壁江山,那么问题就来了:拿什么去抢占这块市场蛋糕? 支持开发3D浏览器游戏的先进技 ...

  3. 22. Unity - 3D游戏开发小计01 --- 修复动画BUG、更改环境光照、导航网格、相机跟随、场景渲染后期处理

    1. 导入玩家角色模型 素材来自于unity官网:3D Beginner:Tutorial Resources 在3D游戏开发中,三维物体模型一般会有团队内的其它成员提供,包括模型本身和动画文件等.我 ...

  4. 《游戏开发基础》课程论文丨基于Unity与Bolt的抗美援朝主题3D游戏设计

    文章目录 摘要 关键词 一.导言 二.角色操控 2.1 隐藏鼠标 2.2 通过移动鼠标更新玩家视角 2.3 使角色跳跃 2.4 使角色移动 2.5 使角色冲刺 2.6 使角色卧倒 2.7 设置准星及切 ...

  5. 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 ...

  6. 雨松MOMO《Unity 3D游戏开发》源码公布

    原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...

  7. 教你如何用Unity和Cardboard把3D游戏做成VR游戏

    原网址 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51 ...

  8. 使用Unity制作3D驾驶游戏

    使用Unity制作3D驾驶游戏 Unity2021 专业游戏设计 课程英文名:Make a Driving Game in Unity 08.2021 此视频教程共22.0小时,中英双语字幕,画质清晰 ...

  9. 老司机教你如何用Unity和Cardboard把3D游戏做成VR游戏

    原网址 随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51 ...

最新文章

  1. 面试官眼中的计算机水平,面试官最不喜欢的五句话,千万别说了
  2. 计算机二级python基础知识总结-计算机二级python 知识点篇(程序的控制结构)...
  3. 聊聊职场那些事儿(转)
  4. jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .
  5. GitHub 发布 2018 年开源项目趋势预测
  6. python Django基本介绍
  7. lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法
  8. Android中ContentProvider组件详解
  9. Intellij IDEA安装与使用,完整详细。
  10. super-smack
  11. 计算机专业范文推荐信,出国留学推荐信范文,计算机专业
  12. c语言实用程序6,C语言实用程序设计100例流程图
  13. java rx3x_GitHub - xkm123/oss-sdk-java: java sdk for oss
  14. 《时代》杂志评出2007年50个最佳网站
  15. CSS3 calc() 用法
  16. Open Set Domain Adaptation by Backpropagation
  17. 关于AlertDialog的小坑
  18. win10 ie设置不了代理服务器
  19. python抓取豆瓣电影
  20. 抖音充值显示服务器繁忙是什么原因,为什么抖音充值总是失败呢

热门文章

  1. The SetStack Computer UVA - 12096 集合栈计算机 set集合
  2. 我的MATLAB学习之路
  3. halcon印章文字提取
  4. HbuilderX 快捷键修改
  5. Web前端后端傻傻分不清
  6. 互联网时代,传统企业如何做引流拓客?
  7. 【Web前端HTML5CSS3】05-样式继承与其他概念
  8. DAGAGUARD追加归档方式迁移到rac集群
  9. 格式化数据#1:数据存储|Database
  10. 【英语学习】英语语法术语表 English Grammar Terminology