Unity例子——第一人称视角的角色控制器

这篇具有很好参考价值的文章主要介绍了Unity例子——第一人称视角的角色控制器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文是为了前文Unity四元组的举例示范,为了让读者更好地理解。


效果是实现一个可以由鼠标进行方向操作,键盘进行移动操作的任务。

此为效果视频:

1687597097844


下面进行教学:

一、搭建简单场景

  1. 新建一个场景,放置一个plane作为地板,尺寸自定
  2. 创建一个新的material挂在plane上
  3. 再地板上放置一些cube,主要是为了在测试时作为参照物

Unity例子——第一人称视角的角色控制器

二、创建主角物体

  1. 创建一个capsule,代表一个角色
  2. 创建一个cube作为capsule的子物体,将立方体放在capsule的“脸”部。挂上材质
  3. 拖曳场景列表中的著摄像机,让著摄像机变成capsule的子物体
  4. 将著摄像机的位置归0,然后微调著摄像机的位置到角色的脸部

Unity例子——第一人称视角的角色控制器

 三、编写控制脚本——移动部分

  1.  创建脚本FPSCharacter,将其挂载于capsule上
  2. 编写脚本内容。脚本内容是重点,下面分步介绍

 角色的控制分为两大块:角色移动和摄像机旋转

角色移动方面,玩家可以按方向键进行前后左右平移。问题是;玩家按上方向键时,对应哪个方向;玩家按右方向键时,又对应哪个方向。

一般玩家本身具有前方向量transform.forward和右方向量transform.right。右方向量与右方向的移动直接对应;前方向量比较麻烦,因为存在抬头,低头的情况。如果玩家在抬头看天时直接向前方走,就会得到向天上飞的结果。

解决方案是得到前方向量后,略加修改,去除前方向量的y轴分量,这样就让前方向量保持水平了。整段代码在文章末尾,计算移动的部分代码如下

 void Move()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
        Vector3 fwd = transform.forward;
        Vector3 f = new Vector3(fwd.x, 0, fwd.z).normalized;
        Vector3 r = transform.right;
        Vector3 move = f * z + r * x;
        transform.position += move * speed * Time.deltaTime;
    }

四、编写控制脚本——旋转部分

接下来是旋转镜头部分。由于著摄像机已经挂在角色身上,因此直接旋转角色,镜头就会跟着旋转。其旋转的关键代码如下

 void MouseLook()
    {
        float mx = Input.GetAxis("Mouse X");
        float my = -Input.GetAxis("Mouse Y");
        Quaternion qx = Quaternion.Euler(0, mx, 0);
        Quaternion qy = Quaternion.Euler(my, 0, 0);
        transform.rotation = qx * transform.rotation;
        transform.rotation = transform.rotation*qy;
    }

鼠标移动旋转物体的思路并不简单,但是巧妙利用四元数之后,代码出乎意料的简短。首先,“Mouse X”和“Mouse Y”是两个特殊的输入轴,分别对应的是鼠标的横向移动和纵向移动(不是鼠标位置,而是鼠标位置的变化量)

鼠标横向移动对应的是镜头水平旋转,即沿y轴旋转;鼠标纵向移动对应的是镜头俯仰旋转。因此可以将鼠标的横向、纵向移动当作欧拉角,并转化成四元数,这样就得到了两个”小旋转“,分别叫做qx和qy。

之后只要用四元数乘法将小旋转应用于角色当前朝向,问题就解决了。难点在于,镜头水品那个旋转实际上是沿世界坐标系的y轴旋转,而镜头俯仰旋转则是围绕局部坐标系的x轴旋转。

最后,因为人们在低头、抬头动作时,不能超过90°看到自己的后面,所以要对俯仰角度作出限制,因此需要在MouseLook()函数尾部补上以下一段逻辑。

 float angle = transform.eulerAngles.x;
        if (angle > 180) { angle -= 360; }
        if (angle <- 180) { angle+= 360; }
        if(angle>80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(80, transform.eulerAngles.y, 0);
        }
        if (angle <-80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);
        }

五、隐藏并锁定鼠标指针

测试时,会发现鼠标指针会影响游戏体验,如果单击到Game窗口之外的区域,Game窗口就会失去焦点。解决方法是隐藏鼠标指针,并把鼠标指针锁定到屏幕中央,代码如下

void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }

在Unity编译器中,只需要按下Esc键就会显示出鼠标指针了,而在实际游戏开发者能够,别忘了在合适的时机将鼠标指针崇信县属出来,并取消锁定。如原神中就是摁Alt键取消锁定的。文章来源地址https://www.toymoban.com/news/detail-499887.html

六、完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FPSCharachter : MonoBehaviour
{
    public float speed = 5f;
    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }
    void Update()
    {
        Move();
        MouseLook();
    }
   void Move()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
        Vector3 fwd = transform.forward;
        Vector3 f = new Vector3(fwd.x, 0, fwd.z).normalized;
        Vector3 r = transform.right;
        Vector3 move = f * z + r * x;
        transform.position += move * speed * Time.deltaTime;
    }
    void MouseLook()
    {
        float mx = Input.GetAxis("Mouse X");
        float my = -Input.GetAxis("Mouse Y");
        Quaternion qx = Quaternion.Euler(0, mx, 0);
        Quaternion qy = Quaternion.Euler(my, 0, 0);
        transform.rotation = qx * transform.rotation;
        transform.rotation = transform.rotation * qy;
        float angle = transform.eulerAngles.x;
        if (angle > 180) { angle -= 360; }
        if (angle <- 180) { angle+= 360; }
        if(angle>80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(80, transform.eulerAngles.y, 0);
        }
        if (angle <-80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);
        }
    }
}

到了这里,关于Unity例子——第一人称视角的角色控制器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity游戏开发教程】零基础带你从小白到超神16——四种方法控制人物移动之角色控制器

    直接修改组件位置 去资源商城下载角色控制系统成品直接拿来用 unity提供的角色控制器组件 通过物理系统自己做

    2024年02月08日
    浏览(46)
  • 【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡,复制粘贴即用

    其实一开始我是不打算写的,我感觉这种简单的功能,原以为网上随便一搜一大堆,但是我实际去搜发现网上很多都是 复制粘贴 ,要么 没有实操过 ,要么就是 功能不全 ,或者毫无解释的把代码丢出来,我自以为简单的3D角色控制,我整整花了3-4天才研究明白(虽然每天只

    2024年02月03日
    浏览(41)
  • AD域控制器将辅域控制器角色提升为主域控制器

    域控服务器迁移,已将新机器添加为该域的辅域控制器。 主域控制器:test-dc-01 辅域控制器:test-dc-02 需求将主辅域的角色进行互换,test-dc-01更换为辅域,test-dc-02更换为主域。 方法1 命令行修改AD域角色 1.查看当前主域控制器是哪台机器,查询命令 netdom query fsmo 可以看到当前

    2024年02月12日
    浏览(60)
  • Unity 第一人称视角控制移动、旋转

    第一人称视角操作 此功能主要是借鉴YouTube上一个博主的教程,写的蛮好我就搬运过来让大家也试试。 其原理是:左右旋转是控制父物体的欧拉角的Y轴 上下点头是子物体相机的欧拉角Z轴 水平方向 跳跃: 移动

    2024年04月27日
    浏览(35)
  • Unity 第三人称 玩家控制器+相机控制器

    今天给大家分享一个简单的Unity第三人称视角下玩家控制器和相机控制器的脚本编写方法。   效果如下: 主要分三部分实现:人物旋转、人物移动、相机旋转。 1.人物移动: 首先获取到人物水平和垂直移动的参数: 因为人物移动的方向跟摄像头一致,所以需要根据摄像头的

    2024年02月06日
    浏览(81)
  • UE4/5AI制作基础AI(适合新手入门,运用黑板,行为树,ai控制器,角色类,任务)

    目录 制作流程 第一步:创建资产 然后创建一个AIController 之后创建一个黑板和行为树:  第二步:制作 黑板 行为树 任务 运行行为树  结果 第一步直接复制你的人物蓝图,做一个npc: 然后创建一个AIController 之后创建一个 黑板和行为树 :   首先打开你的BP_NPC的pawn类,然后

    2024年02月16日
    浏览(94)
  • Unity中人物控制器

       在Unity中控制器是很常见的功能,一般的人物控制器有两种方法,一种是通过代码实现,另外一种就是通过Unity中的API实现。   这里主要介绍第一种方法。   首先对控制器步骤进行分析。 步骤1:通过方向键控制人物移动。 步骤2:控制摄像机跟随人物 步骤1:通过方

    2024年02月13日
    浏览(46)
  • Unity动画控制器animator.CrossFade

    1.CrossFade虽然可以不用任何逻辑来链接而直接跳转,但是CrossFade只能覆盖其他动画,当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败。造成动画依旧停在原位。 attack动画名称 0.1f由其他动画转入此动画需0.1秒来过渡。

    2024年02月15日
    浏览(48)
  • Unity之OpenXR+XR Interaction Toolkit实现 VR控制第一人称角色模型动画

    我们在开发VR项目时,有时会有第一人称视角的需求,即我们自己带上VR头显,能够看到自己的身体,如果模拟一些人物触电死亡,使用工具动画之类的需求,那么VR控制第一人称视角就比较实用了。 我们今天就来介绍一下如何实现VR设备控制第一人称: 1.角色手部跟随手柄移

    2024年02月09日
    浏览(44)
  • Unity移动端第三人称控制器

    在Hierarchy面板空白地方右键-3D Object创建一个Plane和一个Capsule 鼠标单击选中Capsule 在右侧Inspector面板删除Capsule Collider碰撞体组件 添加一个Character Controller(角色控制器,自带一个碰撞体)和一个脚本ThirdPersonController(名字可以自己取) 在 ThirdPersonController 中定义变量: 在 Start 中初始

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包