美女镇文

图片没找到,请重新加载

两个对象,一个当前需要移动的物体,一个摄像机物体,摄像机物体放到移动物体子物体下,然后两个脚本分别挂在到对应物体上,组件对象见图:

之后在玩家身上挂载刚体(rigidbody)和碰撞体,刚体上必须锁住玩家的X/Y/Z三个轴,防止玩家任意旋转,这个很关键,不然角色会在地图上到处滚动,无法正常行走,见下图:

角色移动脚本:

using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]public class FirstPersonMovement : MonoBehaviour
{public float moveSpeed = 5;[Header("Running")]public bool canRun = true;[Tooltip("奔跑速度")]public float runSpeed = 9;[Header("奔跑按键")]public KeyCode runningKey = KeyCode.LeftShift;//检测是否离地高度float groundCheck = 1f;[Tooltip("跳跃高度")]public float jumpStrength = 2;//跳跃事件public event System.Action Jumped;/// <summary>/// 重写移动速度,根据最后添加速度为移动速度/// </summary>public List<System.Func<float>> speedOverrides = new List<System.Func<float>>();/// <summary>/// 当再次接触地面调用当前事件/// </summary>public event System.Action Grounded;public bool IsRunning { get; private set; }//是否在地面bool isGrounded = true;Rigidbody playerRigidbody;const float OriginOffset = .001f;Vector3 RaycastOrigin => transform.position + Vector3.up * OriginOffset;void Awake(){playerRigidbody = GetComponent<Rigidbody>();}void FixedUpdate(){PlayerMove();}private void LateUpdate(){GroundCheck();if (Input.GetButtonDown("Jump") && isGrounded){Jump();}}void PlayerMove(){IsRunning = canRun && Input.GetKey(runningKey);// 判断是否奔跑更改玩家移动速度float targetMovingSpeed = IsRunning ? runSpeed : moveSpeed;if (speedOverrides.Count > 0){targetMovingSpeed = speedOverrides[speedOverrides.Count - 1]();}//得到最终期望数据Vector2 targetVelocity = new Vector2(Input.GetAxis("Horizontal") * targetMovingSpeed, Input.GetAxis("Vertical") * targetMovingSpeed);//更新刚体速度playerRigidbody.velocity = transform.rotation * new Vector3(targetVelocity.x, playerRigidbody.velocity.y, targetVelocity.y);}/// <summary>/// 检测是否离地/// </summary>void GroundCheck(){CapsuleCollider capsuleCollider = GetComponent<CapsuleCollider>();Ray ra = new Ray(RaycastOrigin, Vector3.down);//从当前角色位置发射球形检测,方向向下,距离为groundCheck设置的值bool isGroundedNow = Physics.SphereCast(ra, capsuleCollider.radius, groundCheck);if (isGroundedNow && !isGrounded){Grounded?.Invoke();}//更新是否离地isGrounded = isGroundedNow;}void Jump(){playerRigidbody.AddForce(Vector3.up * 100 * jumpStrength);Jumped?.Invoke();}}

摄像机旋转脚本:

通过Tab键控制鼠标锁定与解锁

using UnityEngine;public class FirstPersonLook : MonoBehaviour
{[SerializeField][Tooltip("玩家对象")]Transform character;[Tooltip("鼠标移动灵敏度")]public float sensitivity = 2;[Tooltip("移动中平滑")]public float smoothing = 1.5f;Vector2 velocity;Vector2 frameVelocity;void Reset(){//从父对象中找到玩家对象初始化character = GetComponentInParent<FirstPersonMovement>().transform;}bool isLock = true;void Start(){// 进入游戏时锁定鼠标Cursor.lockState = CursorLockMode.Locked;}void Update(){if (Input.GetKeyDown(KeyCode.Tab)){isLock = !isLock;Cursor.lockState = isLock?CursorLockMode.Locked:CursorLockMode.None;Cursor.visible= !isLock;}if (!isLock){return;}MouseRotate();}void MouseRotate(){Vector2 mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));//根据灵敏度修改输入数据Vector2 rawFrameVelocity = Vector2.Scale(mouseDelta, Vector2.one * sensitivity);//在目标速度和当前速度之间进行线性插值,使旋转平滑frameVelocity = Vector2.Lerp(frameVelocity, rawFrameVelocity, 1 / smoothing);velocity += frameVelocity;//对摄像机上下旋转角度进行限制,不超出(-60,60)度velocity.y = Mathf.Clamp(velocity.y, -60, 60);// 旋转摄像机的上下,旋转角色的左右transform.localRotation = Quaternion.AngleAxis(-velocity.y, Vector3.right);character.localRotation = Quaternion.AngleAxis(velocity.x, Vector3.up);}
}

好了,以上就是一个简单的移动脚本,附带地面检测,代码中的地面检测是基于Unity中胶囊体进行检测的,胶囊体的坐标为中心点坐标,但是有的人物角色坐标是从脚底下发出的,所以代码中地面检测的部分代码需要修改,具体如何修改可以根据自己的项目中进行动态调整,这里指出调整方法:

Ray ra = new Ray(RaycastOrigin, Vector3.down);//从当前角色位置发射球形检测,方向向下,距离为groundCheck设置的值bool isGroundedNow = Physics.SphereCast(ra, capsuleCollider.radius, groundCheck);

这两句代码的意思是从玩家中心点位置发射一个半径为胶囊体半径的(capsuleCollider.radius)球形检测射线,方向向下,最大检测距离为groundCheck的值。大家可以根据自己玩家的位置计算新的检测位置和检测距离。

Unity简单第一人称移动和摄像机旋转相关推荐

  1. 【Unity】第一人称实现键盘移动WASD

    [Unity]第一人称实现键盘移动WASD 背景:开发影院场景 环境:Unity2021.3 功能:WASD键实现移动.鼠标左右平滑实现转向 代码:挂载在相机的父物体上(好像是因为相机本身不支持移动? ...

  2. 关于Unity 3D第一人称视角移动时相机抖动的问题

    Unity 3D中第一人称视角Camera相机抖动的原因及解决方法 文章目录 前言 问题反思 解决方法 错误代码 修改后数据 总结扩展 前言 在使用Unity自制第一人称FPS游戏时,场景运行时鼠标移 ...

  3. java第一人称射击_[转] Unity实践 --- 第一人称射击游戏_

    一. 环境 地图资源,包含了全地图以及灯光.天空盒子. 扩展部分. 不可穿透的部分需要在bake时设置为static. 二. 设置 1. 相机 1> 主相机 挂载控制视角的c#组件. tag为m ...

  4. 【Unity】第一人称视角开发

    需求 我的需求是在Unity构建一个第一人称视角,实现移动跳跃功能. 主要参考的是这篇博文提供的方案,不过该方案为了只允许一次跳跃,单独在人物底部构建了一个空对象,我无需此限制,因此对其进行了简化. ...

  5. 【Unity】第一人称控制器

    设置相机的移动: 最开始想直接写一个相机移动,但是想起来Unity之前有一个内置资源包,里面包含了第一人称和第三人称的一个移动资源,导入到Unity里面看一下,如果可以就用资源包来搞.. 用的是Uni ...

  6. unity实践————第一人称射击游戏

    一. 环境 地图资源,包含了全地图以及灯光.天空盒子. 扩展部分. 不可穿透的部分需要在bake时设置为static. 二. 设置 1. 相机 1> 主相机 挂载控制视角的c#组件. tag为m ...

  7. 用Unity做第一人称射击游戏

    文章目录 场景搭建 忘记更新了-这段时间有点忙 之后再更新吧 教程晚点更新 先上个成品视频给大家看看 https://www.bilibili.com/video/BV1P54y1C7zm/ 场景搭建 ...

  8. Unity第一人称控制器

    不得不说,unity最新的轻量级角色控制器搭配新输入系统确实好用.不过我不会(doge).想学习的小伙伴可以直接在Hub里面下载unity的第一人称控制器模板,个人觉得非常适合学习. 简单的第一人称控 ...

  9. Unity第一人称控制器使用

    简介:本节主要介绍使用官方自带的FPS包来实现第一人称控制,鉴于官方提供的案例已经十分完备,无需重复造轮子,故本文章不含任何代码实现~ 资源商店获取包 众所周知,能在资源商店找到的模型或者脚本就不要自 ...

最新文章

  1. 3_电子商务开发模型与java的关系_计算机网络与软件工程专业作业答案
  2. 类的加载过程一:Loading
  3. Excel中R1C1引用样式
  4. textarea 输入框限制字数
  5. linux内存分配器类型,内核早期内存分配器:memblock
  6. 在阿里巴巴工作是一种怎样的体验?
  7. MFC中控件的大小和位置自定义代码
  8. SpringBoot+Quartz实现动态可配定时任务(动态定时任务)
  9. oracle awr报告提取,Oracle AWR报告提取方法
  10. Arduino 系列传感器应用
  11. 计算机病毒的危害评价,计算机病毒危害评析
  12. R语言解决安装rgl包问题:ERROR: compilation failed for package ‘rgl‘
  13. Android WMS架构:WindowContainer树形组合模式-理论基础+实践结果
  14. 华为云计算08—灾备
  15. 桌面点击鼠标右键一直显示转圈卡住如何解决
  16. [附源码]java毕业设计归元种子销售管理系统
  17. Tuxedo-下载与安装1
  18. 你见过的最全面的Python重点(附代码演示)
  19. 转:创业之路“一生悬命”---只有偏执狂才能生存
  20. usb storage

热门文章

  1. 专门学了三个月爆款标题写作,还不如看完这篇文章后思路清晰,值得收藏的技巧合集。
  2. [线性规划 对偶原理 单纯形] BZOJ 3265 志愿者招募加强版
  3. Page8:对偶原理以及结构分解[Linear System Theory]
  4. 有监督分类:支持向量机分类
  5. Word论文排版学习感受
  6. python画简笔画病毒_用Python做一个可以自动转换JPG格式图片成简笔画的软件
  7. 教程 |10分钟成为简笔画达人 9 (一大波蠢萌小动物来袭)
  8. 使用MockBackend开发没有后端的Angular应用
  9. 三菱FX3U +485 ADP与施耐德ATV-71变频器通讯程序 同时实现变频器 DRIVECOM流程,解决施耐德ATV变频器断电重启后,自准备工作
  10. 三菱FX3U 485BD与3台施耐德ATV 71变频器通讯程序