下面是详细设置,完整代码在最下方

一、玩家设置

1、首先在角色身上添加脚本PlayerController,添加的其它组件有CapsuleCollider,Rigidbody、Animator。

2、获取横轴和纵轴的组成的向量

// 获取轴使用Input.GetAxisRaw方法,平滑过渡通过代码来完成
// 由于未对输入进行平滑处理,键盘输入将始终为 -1、0 或 1。 如果您想自己完成键盘输入的所有平滑处理,这非常有用。
Vector2 input = new Vector2(Input.GetAxisRaw(GameConsts.HORIZONTAL_AXIS), Input.GetAxisRaw(GameConsts.VERTICAL_AXIS));
// 获取向量的标准化向量【向量的模为1】,没啥意义习惯这样做
Vector2 inputDir = input.normalized;

3、得到当前由纵轴和横轴所形成向量的相对于世界前方的角度夹角

float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg;

4、判断玩家有没有移动【如果玩家么有移动就不要执行转向了,不然默认朝向世界正前方】

        if (inputDir != Vector2.zero){// 【上面使用Input.GetAxisRaw,在这里过渡】平滑过渡玩家当前朝向transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime);// 设置动画animator.SetFloat(GameConsts.SPEED_PARAMETER, 1, 0.2f, Time.deltaTime);// 【使用变换组件移动】根据动画参数平滑过渡到最大速度// transform.Translate(transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER), Space.World);// 【使用刚体组件移动】根据动画参数平滑过渡到最大速度PlayerRigidbody.MovePosition(transform.position + transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER));}else{animator.SetFloat(GameConsts.SPEED_PARAMETER, 0, 0.2f, Time.deltaTime);}

二、摄像机设置

1、添加脚本CameraController,获取并累加/减鼠标横向和纵向的偏移量

// 累加/减存储鼠标的位移量(由于Y轴增加默认尽头下移,所以用-=)mouseX += Input.GetAxis(GameConsts.MOUSE_X);mouseY -= Input.GetAxis(GameConsts.MOUSE_Y);

2、摄像机加上鼠标的累计位移角度

// 摄像机加上鼠标的累计位移角度transform.eulerAngles = new Vector3(mouseY, mouseX, 0);

3、设置摄像机位置,distance为摄像机与跟随目标的距离【因为摄像机到角色的向量为角色位置减去摄像机位置,所以下方代码的意思为摄像机在玩家的正后方,距离为distance】

可以通过调整摄像机跟随目标调整摄像机的高度

// 设置摄像机位置transform.position = followTarget.position - transform.forward * distance;

三、结合摄像机Y轴转动,调整玩家Y轴转动

1、玩家转动角度加上摄像机转动角度

float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + followCamera.eulerAngles.y;

四、完整代码

PlayerController.cs

using UnityEngine;public class PlayerController : MonoBehaviour
{[Header("玩家平滑移动到指定角度的近似时间")]public float smoothTime = 0.2f;[Header("玩家速度")]public float playerSpeed = 5f;/// <summary>/// 玩家平滑移动到指定角度的瞬时速度,由Mathf.SmoothDampAngle()自动填充值/// </summary>private float currentVelocity;private Animator animator;private Rigidbody PlayerRigidbody;/// <summary>/// 跟随玩家的摄像机/// </summary>private Transform followCamera;private void Awake(){animator = GetComponent<Animator>();PlayerRigidbody = GetComponent<Rigidbody>();followCamera = Camera.main.transform;}private void Update(){Vector2 input = new Vector2(Input.GetAxisRaw(GameConsts.HORIZONTAL_AXIS), Input.GetAxisRaw(GameConsts.VERTICAL_AXIS));Vector2 inputDir = input.normalized;float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + followCamera.eulerAngles.y;// 如果移动了if (inputDir != Vector2.zero){// 平滑过渡玩家当前朝向transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime);// 设置动画animator.SetFloat(GameConsts.SPEED_PARAMETER, 1, 0.2f, Time.deltaTime);// 【使用变换组件移动】根据动画参数平滑过渡到最大速度// transform.Translate(transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER), Space.World);// 【使用刚体组件移动】根据动画参数平滑过渡到最大速度PlayerRigidbody.MovePosition(transform.position + transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER));}else{animator.SetFloat(GameConsts.SPEED_PARAMETER, 0, 0.2f, Time.deltaTime);}}
}

CameraController.cs

using UnityEngine;public class CameraController : MonoBehaviour
{[Header("摄像机相对玩家的距离")]public float distance = 10f;private float mouseX;private float mouseY;/// <summary>/// 摄像机跟随目标/// </summary>private Transform followTarget;private void Awake(){followTarget = GameObject.FindWithTag(GameConsts.PLAYER_TAG).transform.Find(GameConsts.FOLLOW);}private void Update(){// 累加/减存储鼠标的位移量(由于Y轴增加默认尽头下移,所以用-=)mouseX += Input.GetAxis(GameConsts.MOUSE_X);mouseY -= Input.GetAxis(GameConsts.MOUSE_Y);// 摄像机加上鼠标的累计位移角度transform.eulerAngles = new Vector3(mouseY, mouseX, 0);// 设置摄像机位置transform.position = followTarget.position - transform.forward * distance;}
}

Unity人物第三人称移动相关推荐

  1. Unity实现第三人称角色转向摄像机朝向的方向

    Unity实现第三人称角色转向摄像机朝向的方向 以黑魂为例,每次按下向前移动的控制键,人物会转向摄像机朝向的方向 void TurnTo(Vector3 direction)//形参填入需要朝向的方向 ...

  2. 【Unity】第三人称射击游戏开发过程之开火设计(TPS.S.P2)

    [Unity]第三人称射击游戏开发过程之开火设计(TPS.S.P2) 枪械的开火 开火流程 开火前的准备 实体子弹的准备 开火逻辑 这一章我们来设计基础的枪械功能. 枪械的开火 我现在选择的武器是41 ...

  3. Unity制作第三人称射击游戏-成为创新游戏开发者学习教程

    用Unity游戏引擎学习和制作第三人称射击游戏-成为创新游戏开发者- TPS战地克隆 你会学到什么 Unity 3D游戏开发 如何打造TPP第三人称射击游戏 第三人控制者 第三人称动画 第三人运动控制 ...

  4. 【Unity】第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1)

    [Unity]第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1) 设计整体的结构与模式 瞄准状态的设计 瞄准相机 瞄准状态 瞄准时的鼠标移动速度限制 瞄准点的处理 角色在瞄准状态下的旋转 瞄准 ...

  5. 【C#】【Unity】第三人称摄像机跟随人物移动时碰撞到墙壁等,摄像机不穿越墙壁

    目前大部分第三人称游戏的摄像机在遇到墙壁等狭隘空间的时候,都选择让摄像机不穿越到墙壁里面,而是让摄像机保持在墙壁表面. 分析情况:(红色方框为摄像机 黑色方框为墙壁) 当前情形摄像机还没达到墙壁摄像机 ...

  6. Unity实现第三人称视角

    最近耍了一波巫师3,突然想到能不能做个简单的第三人称视角的摄像机控制.不过这个摄像机控制目前还没有被卡视角的功能(就是那种根据地形调整摄像机距离)准备在后面几天实现卡视角功能.不过先来做个简单的第三人 ...

  7. Unity 3D第三人称视角、用途广泛限定角度(视角不能360度翻转)

    Unity第三人称相机视角控制 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心 ...

  8. 处理unity第一第三人称游戏中的摄像机穿墙的问题

    在之前我花过一段时间做了一个比较简单的第三人称射击类游戏 发现一个很难搞的BUG 就是在我们设定的摄像机和主角距离的空隙中间 如果有一些物体 会挡住主角 会给人极差的游戏体验 下面有两种解决方案 但是 ...

  9. unity中第三人称游戏摄像头遮挡的处理

    在游戏开发过程中难免会做第三人称游戏 如果地形中的设施比较多 或者说做一个房间内的游戏 很可能我们调整好的视角 在游戏过程中会被墙体挡住主角 这样游戏体验感就会大打折扣 就像这样(遮住半个身子还是可以 ...

最新文章

  1. python计算选手最后得分并取出前三名_在Python中存储最后3个分数并删除旧分数并计算平均值?...
  2. php页面时长,页面执行时间太长,请诸位大大帮忙看看
  3. Linux入门笔记——cal、date、free、clear、history、man、whatis、uname
  4. JMeter场景设置与监控
  5. 树莓派 蓝牙音响_你应该拥有一个树莓派
  6. android studio放置在函数上面看_像写Flutter一样开发Android原生应用
  7. Build desktop apps for Windows PCs
  8. 红警2突然崩溃思考—地图?(最短,最长节点/路径)
  9. c++矩阵运算库Eigen简介
  10. [转] C++中 const, volatile, mutable用法
  11. php中表格怎么垂直居中,如何利用display:table-cell实现垂直居中?
  12. Luogu1939 【模板】矩阵加速(数列)
  13. python 实现一个属于自己的语音播报器
  14. history linux 位置,Linux基础知识之history的详细说明
  15. RandomAccessSource not opened
  16. UBound 函数 (Visual Basic)
  17. DDR4两根4G组的双通道跟1根8G单通道有什么区别?
  18. office2007 打开Excel 提示 工作表中的公式包含一个或多个无效引用的解决方法
  19. python正方形螺旋线-利用Python绘制一个正方形螺旋线
  20. Java强、软、弱、虚四大引用(附代码示例)

热门文章

  1. 2021-07-25 论代码质量与程序员
  2. Android接入stripe支付
  3. plsql developer怎么打开sql文件
  4. 必应地图控件(WPF版)添加中国地图
  5. 申请注销公司的社保需要什么材料?
  6. python考试复习资料
  7. 小程序中for循环列表后点击不同列表跳转不同页面
  8. git回滚远程合并提交
  9. 央视春晚40年来首次采用国产8K摄像机摄制
  10. 元素div 上下左右居中方法总结