凭借一腔热情,想着大学做点什么事,就想着做个游戏出来。之前没有接触过unity等各类引擎,学习了一段时间发现有许多地方挺复杂的,开个专栏记录一下学到的东西。

基本目标是做一个RPG式的游戏,涉及的东西有很多:人物移动和镜头、战斗系统构建、UI构建等,先从基本的开始学起。

关于第三人称镜头和人物移动,我们的目标是实现一个玩家能够随意移动镜头观察环境,同时人物在静止时不会受到镜头方向影响,而移动时会受到影响的移动系统,就是比较常见的第三人称移动系统。

第一种实现方式,我主要模仿了油管主Brackeys的实现https://www.youtube.com/watch?v=j48LtUkZRjU&list=PLPV2KyIb3jR5QFsefuO2RlAgWEz6EvVi6

套用一个插件cinemachine,使用其中的FreeLook Camera可以比较轻松的去实现人物的跟随和Lookat

插件自带Folliw和LookAt,将人物拖进去即可

X和Y Axis对应unity的x和y轴,值得注意的是unity的y轴对应的是竖轴。按照我们一般玩家的习惯,Input Axis Name栏的Mouse X和Y就是对应我们鼠标的移动,所以不用去修改。需要强调的是,我们设置镜头后,镜头的旋转是和我们鼠标对应的,也就是说鼠标向上拖拽时是看向下,向左拖拽时是看向右边,因此我在Y Axis 勾选了invert反转,而X Axis取消了invert。

Orbits的TopRig MiddleRig BottomRig对应下图的三个环,代表游戏时拖拽鼠标上中下能够看到的范围

聚焦刚刚设置完的FreeLook Camera可以看到镜头的一个大概观察范围,蓝色十字中心便是镜头的中心(有时候会表示出黄点)。不同人物模型可能出现默认的聚焦中心不一样,如果觉得位置不符合我们的预期,可以在右边inspecter面板调出offset进行调整

通过以上的设置,我们基本完成了镜头的跟随和聚焦,利用插件实现十分方便。之后重头戏便是人物移动,这一点需要我们去编写脚本了。

创建一个ThirdPersonMovement脚本

利用Input.GetAxisRaw()函数去实现键盘映射(可在设置修改映射默认键位)

   float horizontal = Input.GetAxisRaw("Horizontal");//对应键盘上的左右键,按下左或右时触发float vertical = Input.GetAxisRaw("Vertical");//对应键盘上的上下键,按下前或后时触发

建立映射后,将映射的方向保存在一个vector3变量中(normalized属性能够返回值为1的方向),之后引入if判断:如果该变量离原点大于0.01f  即有值映射入了direction,随后便可在if里实现移动

        Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;//建立一个矢量direction,其方向对应键盘输入的,各方向值为1if (direction.magnitude >= 0.01f)//magnitude返回矢量坐标到原点距离{}

这一段是具体实现,老实说我自己也不太懂,属于是照葫芦画瓢地写上去了,大致意思是建立targetAngle表示人物需要转动的角度(转到镜头正对的方位),利用Mathf库的SmoothDampAngle函数和quaternion四元数实现较为平滑的转动,最后用CharacterController对象的move方法实现移动,最后在移动时乘上速度和Time.deltaTime去模拟正常行动

(关于unity脚本中最常见的update函数和这里用到的Time.deltaTime可以看这个理解:

(7条消息) Unity增量时间Time.deltaTime详解_ChinarCSDN的博客-CSDN博客)

            float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);transform.rotation = Quaternion.Euler(0f, angle, 0f);//函数第二个参数为转动的角度,上面一系列有关angle的代码是设置一个较为平滑的转动角度Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;controller.Move(moveDir.normalized * speed * Time.deltaTime);

最后实现的全部代码如下(有关于动画和速度调整的部分)

using UnityEngine;public class ThirdPlayerMovement : MonoBehaviour
{public CharacterController controller;//建立控制器对象public Transform cam;//建立摄像机的对象,数据类型是Transform类,对应主摄像机的转动public float walkSpeed=6f;//设置一个速度,浮点数类型public float runSpeed=10f;public float turnSmoothTime = 0.1f;public float turnSmoothVelocity;public Animator anim;private int isMove = Animator.StringToHash("isMove");private int isRunning = Animator.StringToHash("isRunning");private void Start(){//anim = this.GetComponent<Animator>();anim.SetBool(isMove, false);anim.SetBool(isRunning, false);}// Update is called once per framevoid Update(){anim.SetBool(isMove, false);anim.SetBool(isRunning, false);float speed = walkSpeed;float horizontal = Input.GetAxisRaw("Horizontal");//对应键盘上的左右键,按下左或右时触发float vertical = Input.GetAxisRaw("Vertical");//对应键盘上的上下键,按下前或后时触发Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;//建立一个矢量direction,其方向对应键盘输入的,各方向值为1if(Input.GetKey("left shift")){anim.SetBool(isRunning, true);speed = runSpeed;}if(Input.GetKey("w")||Input.GetKey("a")|| Input.GetKey("s")|| Input.GetKey("d")){anim.SetBool(isMove, true);}if (direction.magnitude >= 0.01f)//magnitude返回矢量坐标到原点距离{//anim.SetBool("isMove", true);float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);transform.rotation = Quaternion.Euler(0f, angle, 0f);//函数第二个参数为转动的角度,上面一系列有关angle的代码是设置一个较为平滑的转动角度Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;controller.Move(moveDir.normalized * speed * Time.deltaTime);}//anim.SetBool("isMove", false);//if(Input.GetKey(KeyCode.))}
}

老实说我觉得这段代码在动画和速度控制上有点乱,整体结构也不是特别清晰,关于人物控制脚本的架构这一点我还需要学习一个

这段代码最后实现了一个和我们正常游玩较为相似的移动和镜头,但是我个人感觉依然有些别扭(一来镜头的移动有点不顺滑,二来镜头给我的感觉更像是电影镜头),本着学习的态度,我准备换一种方式去实现人物移动和镜头,到时对比哪个更合适。

Unity学习笔记(一):第三人称镜头和人物移动相关推荐

  1. Threejs实现键盘控制人物行走跳动/Capsule碰撞体(胶囊体)/碰撞检测(Octree八叉树)/游戏第三人称/镜头跟随人物移动

    个人主页: 左本Web3D,更多案例预览请点击==> 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例

  2. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  3. Unity学习笔记(4)-----粒子效果的实现

    Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...

  4. Unity学习笔记1 简易2D横版RPG游戏制作(一)

    这个教程是参考一个YouTube上面的教程做的,原作者的教程做得比较简单,我先参考着做一遍,毕竟我也只是个初学者,还没办法完全自制哈哈.不过我之前也看过一个2D平台游戏的系列教程了,以后会整合起来,做 ...

  5. Unity学习笔记:个人学习项目《疯狂天才埃德加》纠错文档

    Unity学习笔记:个人学习项目<疯狂天才埃德加>纠错文档 本文档是完成学校Unity课程作业时建立的纠错文档.用于记录自己开发过程中遇到的各种问题,以便下次遇到相同的问题时及时找到解决方 ...

  6. Unity学习笔记:Unity 3D 飞机大战

    Unity学习笔记:Unity 3D 飞机大战 1.打开unity软件后,首先新建Quad作为背景,导入飞机模型,并为其添加刚体 然后创建C#脚本,挂载到飞机上. 2.给飞机创建子弹,让子弹成为预制体 ...

  7. 【Unity学习笔记】UnrealToUnity教程:(网上购买的素材导入Unreal+插件转Unity)

    [Unity学习笔记]UnrealToUnity教程: 最近想从Unreal那边化点缘借借素材,没想到踩到一个大坑 一,素材导入Unreal 这个教程比较多,根据素材的来源,传送门是以下这几个: 1. ...

  8. unity学习笔记-特效篇

    unity学习笔记 传送门特效 火焰特效 传送门特效 由于动画师的动画制作遇到了一些小问题,只能先做其他功能的摸索了~ 本来想记录一下服务器搭建的,但是在消息传输的部分遇到了一些bug,可能是消息解析 ...

  9. Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?)

    Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?) 个人学习经验,仅供参考,欢迎各位码友批评指正. 做项目敲代码时,一直不是很理解监听函数是个什么玩意. 按我目前的理解,说白 ...

最新文章

  1. Hibernate 中Datetime类型属性数据库默认值
  2. 基于动态IP的Internet视频监控解决方案(作者:吴晓晖)
  3. 蒙牛 customer Project Support - 同时更新两个database table
  4. Karoly Nyisztor
  5. 用户访一个APP或者网页流程示意图
  6. springboot 上传文件解析入库_springboot上传文件的访问
  7. 产品需求文档:如何撰写一份敏捷的PRD (模板2.0)
  8. cmd查看所有数据库 db2_DB2常用命令
  9. 19数字媒体技术1班 刘增千 PS笔记4
  10. hp服务器驱动有专门的网站吗,惠普官网的驱动是哪个网址
  11. 导入以及导入模板下载
  12. 项目中手机、姓名、身份证信息等在日志和响应数据中脱敏操作
  13. 只会用Excel吗?这套全面的数据分析工具打包送你,拿走不谢
  14. 【年度盘点】10大最热门Python项目回顾
  15. 李宏毅Transformer
  16. 20190925-ORA-00600错误及被注入的软件
  17. 基于AI的语音信号处理技术
  18. 【流式计算系列day4】Streaming流式架构101—它是什么?
  19. ABAP TSQL 字段异常
  20. 2021年终总结报告这样写,年终奖就有着落了

热门文章

  1. 数据分析师的日常工作是什么?
  2. 雨林木风linux安装教程,雨林木风修复win7系统虚拟机安装linux提示network error的办法...
  3. 电脑突然开机无反应,怎么办
  4. 嵌入式Linux红外遥控,一个简单的IAL分析(红外遥控)(转)
  5. 普渡大学统计与计算机科学,普渡大学西拉法叶校区计算机科学与工程世界排名2017年最新排名第47(ARWU世界排名)...
  6. 人耳能听的声音范围与各种发音的频率范围
  7. 导航栏调透明度HTML,导航栏透明度问题
  8. 2920集五福_2019支付宝集五福字新玩法,高概率出敬业福攻略。
  9. centos 一键安装php,centos PHP如何实现一键安装
  10. Java 生成支付二维码返回给前端和自定义二维码背景色