第十五章 Unity 角色移动旋转实例

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

本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。

第十五章 Unity 角色移动旋转实例

接下来,我们添加一个人物模型,操作方式就是将模型文件目录复制到“Assets”下

第十五章 Unity 角色移动旋转实例

然后Unity会自动同步该文件,我们查看Project面板

第十五章 Unity 角色移动旋转实例

在“Alita”目录下有两个文件:“Alita.fbx”和“alita_d.png”。前者是模型文件,后者是贴图文件。我们接下来要做的就是,将“Alita.fbx”模型文件拖拽到场景中。由于我们的场景太大了,可能无法方便的看到模型。我们这样操作,我们可以在Hierarchy层次面板中找到这个游戏对象(“Alita”),然后我们将鼠标“移动到(不要点击)”到场景视图中,然后按下“F”键就可以在场景视图中显示这个游戏对象了。

第十五章 Unity 角色移动旋转实例

当然,我们最好再调整一下这个模型,然其站立到地面上。在移动模型的时候,注意保持模型轴心和本地坐标系的选择。如下所示

第十五章 Unity 角色移动旋转实例

当我们切换轴心之后,我们发现模型身上的坐标系指示箭头移动到了模型脚底。一般情况下,人物模型的轴心就是在脚底(本地坐标系的原点)。如果我们是“Center”状态的话,坐标系指示箭头会在模型的中心位置。

第十五章 Unity 角色移动旋转实例

我们能够看到模型的下半部分位于地形的下面,我们向上移动一下。

第十五章 Unity 角色移动旋转实例

接下来,我们要做的是,让相机跟随模型一起移动和旋转。如果使用代码来完成的话,其原理就是模型如何移动和旋转,就同步调整相机如何移动和旋转。这里介绍一种更加简单的方式,就是将相机设置为模型的子游戏对象。操作非常简单,就是在Hierarchy层次面板中,拖动“Main Camera”到“Alita”上面即可。

第十五章 Unity 角色移动旋转实例

拖拽后的样子

第十五章 Unity 角色移动旋转实例

这样做的目的,就是“Alita”移动旋转的时候,子对象“Main Camera”自动移动旋转。当然,我们还需要进一步调整相机的位置,让其放置到“Alita”的后上方。首先,我们将相机的Position和Rotation数值清零,如下所示

第十五章 Unity 角色移动旋转实例

 第十五章 Unity 角色移动旋转实例

请注意,此时的相机位于模型的脚下。在Unity中,子游戏对象的移动和旋转都是相对于父对象而言的。我们将相机的Position数值清零,并不是将相机放置到世界坐标系的原点,而是放置到了父对象“Alita”的原点。接下来,我们调整相机的位置,

第十五章 Unity 角色移动旋转实例

 第十五章 Unity 角色移动旋转实例

我们将相机放置到人物模型的后上方,类似于第三人称视角。

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

第十五章 Unity 角色移动旋转实例

在之前的移动和旋转案例中,我们忽略了一个重要的特性:时间(Time.deltaTime)。游戏对象的移动有三个因素决定,一个方向,一个是速度,另一就是时间。其中方向和速度可以由向量表示(向量的长度代表速度,方向还是方向),而时间就是Time.deltaTime为什么时间是Time.deltaTime呢?因为游戏对象是在每一次update方法调用的时候才会进行移动,而两次移动之间的时间就是两个update方法调用的时间差,也就是我们的Time.deltaTime值。因此Translate方法里面第一个参数应该是方向*速度*时间

接下来,我们来控制角色的前后左右移动。我们创建一个“RoleController.cs”脚本文件,并且附加到“Alita”上面。我们目前使用WASD键来控制角色前后左右移动,代码如下

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

public class RoleController : MonoBehaviour
{
    // 移动速度
    private float moveSpeed = 10.0f;

    // Update is called once per frame
    void Update()
    {
        // 向前移动
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向后移动
        if (Input.GetKeyDown(KeyCode.S))
        {
            transform.Translate(Vector3.back * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向左移动
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.Translate(Vector3.left * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向右移动
        if (Input.GetKeyDown(KeyCode.D))
        {
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime, Space.Self);
        }
    }
}

这里我们使用的是本地坐标系进行移动,大部分游戏开发中,也都是这么做的。

接下来,我们Play当前工程,查看运行后的Gif图

第十五章 Unity 角色移动旋转实例

由于我们使用的是GetKeyDown方法,因此每按下一次键盘,才会移动一段距离。如果我们需要长按键盘进行移动的话,可以换成GetKey方法。当我们移动过程中,发现一个小问题,就是我们没有考虑地形的高度。也就是说,模型在移动过程中,可能会移动到地形之下或者地形之上。我们后续在解决这个问题。接下来,我们添加旋转的代码,如下所示。

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

public class RoleController : MonoBehaviour
{
    // 旋转速度
    private float rotationSpeed = 20.0f;

    // Update is called once per frame
    void Update()
    {
        // 向左旋转
        if (Input.GetKeyDown(KeyCode.Q))
        {
            transform.Rotate(Vector3.down * rotationSpeed * Time.deltaTime, Space.Self);
        }

        // 向右旋转
        if (Input.GetKeyDown(KeyCode.E))
        {
            transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime, Space.Self);
        }
    }
}

上面我们忽略了移动的代码。为什么左右旋转使用的是Vector3.up和Vector3.down呢,不应该是Vector3.left和Vector3.right吗?很简单,我们所谓的左右旋转类似于“左右扭头”,它实际上就是围绕Y轴进行旋转的,所以是Vector3.up和Vector3.down上下方向的Y轴。接下来,我们Play当前工程,查看运行Gif效果图

第十五章 Unity 角色移动旋转实例

接下来,我们来解决地形高度问题。我们需要借助一个“角色控制器”的组件。我们选中“Alita”,然后在Inspector检视面板中点击“Add Component”按钮。

第十五章 Unity 角色移动旋转实例

 第十五章 Unity 角色移动旋转实例

在弹出的搜索框中输入“ch”,然后在下拉框中选中“Character Controller”角色控制器组件。

第十五章 Unity 角色移动旋转实例

此时,在场景中的“Alita”会覆盖一个胶囊体的线框。

第十五章 Unity 角色移动旋转实例

这个胶囊体的线框是用来做“碰撞检测”的,因此它最好能够“包裹”住我们的人物模型。当然,默认情况下,它基本上就能够自动“包裹”我们的人物模型。但是,有一个非常重要的注意点,就是胶囊体的线框不能“陷入”到地形的下面。因此,我们需要编辑胶囊体的线框,它的参数调节我们直接给出,大家可以自己修改其中某些值查看效果

第十五章 Unity 角色移动旋转实例

 第十五章 Unity 角色移动旋转实例

接下来,我们还需要修改角色移动代码,如下

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

public class RoleController : MonoBehaviour
{
    // 移动速度
    private float moveSpeed = 10.0f;

    // 旋转速度
    private float rotationSpeed = 100.0f;

    // 角色控制器组件
    private CharacterController cc;


    // Start is called before the first frame update
    void Start()
    {
        // 获取角色控制器组件
        cc = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {

        // 前后左右方向
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");
        Vector3 direction = new Vector3(h, 0, v);
        
        // 前后左右移动
        cc.SimpleMove(transform.TransformDirection(direction) * moveSpeed);
        
        // 向前移动
        if (Input.GetKeyDown(KeyCode.W))
        {
            //transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向后移动
        if (Input.GetKeyDown(KeyCode.S))
        {
            //transform.Translate(Vector3.back * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向左移动
        if (Input.GetKeyDown(KeyCode.A))
        {
            //transform.Translate(Vector3.left * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向右移动
        if (Input.GetKeyDown(KeyCode.D))
        {
            //transform.Translate(Vector3.right * moveSpeed * Time.deltaTime, Space.Self);
        }

        // 向左旋转,替换GetKey方法
        if (Input.GetKey(KeyCode.Q))
        {
            transform.Rotate(Vector3.down * rotationSpeed * Time.deltaTime, Space.Self);
        }

        // 向右旋转,替换GetKey方法
        if (Input.GetKey(KeyCode.E))
        {
            transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime, Space.Self);
        }
    }
}

上面获取键盘输入的代码是:Input.GetAxis("Vertical/Horizontal") ,这个代码兼容WASD键的输入获取。然后使用CharacterController组件的SimpleMove方法进行移动。我们就不过多解释上面的代码了,直接Play运行查看Gif效果图吧。

第十五章 Unity 角色移动旋转实例文章来源地址https://www.toymoban.com/news/detail-461756.html

到了这里,关于第十五章 Unity 角色移动旋转实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • UE4动作游戏实例RPG Action解析一:角色移动,旋转,动画创建,创建武器,及武器配置

    1.1、官方RPGAction Demo下载地址: ​ 1.2、在场景中创建一个空的角色 创建一个Character蓝图和一个PlayerController蓝图,添加弹簧臂组件和摄像机,并为网格体添加上一个骨骼网格体 ​ 1.3、如何让这个角色出现在场景中, 创建一个GameMode蓝图,把默认Pawn类设置成我们创建的角色,

    2024年02月03日
    浏览(55)
  • Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

    Unity版本:2019.2.3f1 目录  安装InputSystem 1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向   菜单栏/Window/Package Manager/Input System  工程面板内 右键--创建Input Actions  选中New Controls改名为PlayerControls 然后属

    2024年02月06日
    浏览(53)
  • 第十五章 奇异值分解

    奇异值分解(SVD)是一种矩阵因子分解方法。 任意一个 m × n mtimes n m × n 矩阵,都可以表示为三个矩阵的乘积(因子分解)形式,分别是 n n n 阶正交矩阵、由降序排列的非负的对角线元素组成的 m × n mtimes n m × n 的矩形对角矩阵和 n n n 阶正交矩阵。 矩阵的奇异值分解一定

    2024年02月07日
    浏览(46)
  • 第十五章——友元、异常

    友元 类并非只能拥有友元函数,也可以将类作为友元。在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员。因此尽管友元被授予从外部访问类的私有部分的权限,但它们并不与面向对象的编程思想相悖,相反提高了共有接口的灵活性。 友元类  假定

    2024年02月16日
    浏览(37)
  • 第十五章 RabbitMQ 延迟队列

    实际业务中,例如秒杀系统,秒杀商品成功会有截止时间,这时需要用到RabbitMQ延迟服务。 TTL ,即 Time-To-Live,存活时间,消息和队列都可以设置存活时间 Dead Letter,即死信,若给消息设置了存活时间,当超过存活时间后消息还没有被消费,则该消息变成了死信 Dead Letter Exc

    2024年01月25日
    浏览(40)
  • [C国演义] 第十五章

    力扣链接 子数组 ⇒ dp[i]的含义: 以arr[i] 结尾的所有子数组中的最长湍流子数组的长度 子数组 ⇒ 状态转移方程根据 最后一个位置来划分 👇👇👇 初始化: 都初始化为1 ⇒ 1. 一个数字也是一个湍流子数组. 2. 可以少考虑四种状态 遍历方向: 从前往后遍历 返回结果: 返回g表 和

    2024年02月07日
    浏览(45)
  • 【OpenCV】第十五章: 模板匹配

    第十五章: 模板匹配 模板匹配就是在给定的图片中查找和模板最相似的区域。 实现的方法是:将模板在图片上滑动(从左向右,从上向下),遍历所有滑窗,计算匹配度,将所有计算结果保存在一个矩阵种,并将矩阵中匹配度最高的值作为匹配结果。 一、单模板匹配 1、匹配函

    2024年02月02日
    浏览(44)
  • WEB核心【会话技术】第十五章

    目录 💂 个人主页:  爱吃豆的土豆 🤟 版权:  本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、 欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 🏆 人必有所执,方能有所成! 🐋希望大家多多支持😘一起进步呀! 1,会话技术   

    2023年04月17日
    浏览(42)
  • 《TCP IP 网络编程》第十五章

     标准 I/O 函数的两个优点:         除了使用 read 和 write 函数收发数据外,还能使用标准 I/O 函数收发数据。下面是标准 I/O 函数的两个优点: 标准 I/O 函数具有良好的移植性 标准 I/O 函数可以利用缓冲提高性能         创建套接字时,操作系统会准备 I/O 缓冲。 此缓

    2024年02月14日
    浏览(50)
  • 第十五章行为性模式—命令模式

    行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式: 类行为模式:采用继承机制来在类间分派行为 对象行为模式:

    2024年02月07日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包