Unity人物第三人称移动
下面是详细设置,完整代码在最下方
一、玩家设置
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人物第三人称移动相关推荐
- Unity实现第三人称角色转向摄像机朝向的方向
Unity实现第三人称角色转向摄像机朝向的方向 以黑魂为例,每次按下向前移动的控制键,人物会转向摄像机朝向的方向 void TurnTo(Vector3 direction)//形参填入需要朝向的方向 ...
- 【Unity】第三人称射击游戏开发过程之开火设计(TPS.S.P2)
[Unity]第三人称射击游戏开发过程之开火设计(TPS.S.P2) 枪械的开火 开火流程 开火前的准备 实体子弹的准备 开火逻辑 这一章我们来设计基础的枪械功能. 枪械的开火 我现在选择的武器是41 ...
- Unity制作第三人称射击游戏-成为创新游戏开发者学习教程
用Unity游戏引擎学习和制作第三人称射击游戏-成为创新游戏开发者- TPS战地克隆 你会学到什么 Unity 3D游戏开发 如何打造TPP第三人称射击游戏 第三人控制者 第三人称动画 第三人运动控制 ...
- 【Unity】第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1)
[Unity]第三人称射击游戏开发过程之瞄准状态设计(TPS.S.P1) 设计整体的结构与模式 瞄准状态的设计 瞄准相机 瞄准状态 瞄准时的鼠标移动速度限制 瞄准点的处理 角色在瞄准状态下的旋转 瞄准 ...
- 【C#】【Unity】第三人称摄像机跟随人物移动时碰撞到墙壁等,摄像机不穿越墙壁
目前大部分第三人称游戏的摄像机在遇到墙壁等狭隘空间的时候,都选择让摄像机不穿越到墙壁里面,而是让摄像机保持在墙壁表面. 分析情况:(红色方框为摄像机 黑色方框为墙壁) 当前情形摄像机还没达到墙壁摄像机 ...
- Unity实现第三人称视角
最近耍了一波巫师3,突然想到能不能做个简单的第三人称视角的摄像机控制.不过这个摄像机控制目前还没有被卡视角的功能(就是那种根据地形调整摄像机距离)准备在后面几天实现卡视角功能.不过先来做个简单的第三人 ...
- Unity 3D第三人称视角、用途广泛限定角度(视角不能360度翻转)
Unity第三人称相机视角控制 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心 ...
- 处理unity第一第三人称游戏中的摄像机穿墙的问题
在之前我花过一段时间做了一个比较简单的第三人称射击类游戏 发现一个很难搞的BUG 就是在我们设定的摄像机和主角距离的空隙中间 如果有一些物体 会挡住主角 会给人极差的游戏体验 下面有两种解决方案 但是 ...
- unity中第三人称游戏摄像头遮挡的处理
在游戏开发过程中难免会做第三人称游戏 如果地形中的设施比较多 或者说做一个房间内的游戏 很可能我们调整好的视角 在游戏过程中会被墙体挡住主角 这样游戏体验感就会大打折扣 就像这样(遮住半个身子还是可以 ...
最新文章
- python计算选手最后得分并取出前三名_在Python中存储最后3个分数并删除旧分数并计算平均值?...
- php页面时长,页面执行时间太长,请诸位大大帮忙看看
- Linux入门笔记——cal、date、free、clear、history、man、whatis、uname
- JMeter场景设置与监控
- 树莓派 蓝牙音响_你应该拥有一个树莓派
- android studio放置在函数上面看_像写Flutter一样开发Android原生应用
- Build desktop apps for Windows PCs
- 红警2突然崩溃思考—地图?(最短,最长节点/路径)
- c++矩阵运算库Eigen简介
- [转] C++中 const, volatile, mutable用法
- php中表格怎么垂直居中,如何利用display:table-cell实现垂直居中?
- Luogu1939 【模板】矩阵加速(数列)
- python 实现一个属于自己的语音播报器
- history linux 位置,Linux基础知识之history的详细说明
- RandomAccessSource not opened
- UBound 函数 (Visual Basic)
- DDR4两根4G组的双通道跟1根8G单通道有什么区别?
- office2007 打开Excel 提示 工作表中的公式包含一个或多个无效引用的解决方法
- python正方形螺旋线-利用Python绘制一个正方形螺旋线
- Java强、软、弱、虚四大引用(附代码示例)