• 【Unity入门计划】制作RubyAdventure01-玩家的创建&移动


    目录

    前期准备

    项目官方教程地址

    项目特点

    下载并导入项目

    1 创建玩家

    1.1 创建玩家和场景

    Unity中2D素材的使用

    1.2 了解精灵渲染器 Sprite Renderer

    1.3 精灵的静态和动态

    2 移动玩家

    2.1 尝试创建一个移动脚本

    关于Unity中移动的距离单位

    游戏中的控制方式

    Unity输入系统中的输入设置

    2.2 键盘输入控制移动

    实现水平控制

    实现垂直控制

    调整时间和帧率

    以单位/秒表示移动速度


    前期准备

    项目官方教程地址

    Ruby's Adventure:2D 初学者 - Unity Learn

    项目特点

    可以让我们:

    • 学会使用2D资源
    • 学习简单的2D RPG 游戏制作
    • 学习创建并控制角色(Script)
    • 学习设置sprite
    • 学习制作一些简单特效

    下载并导入项目

    使用到的资源保存地址

    2D Beginner: Tutorial Resources | 教程 | Unity Asset Store

    下载并在Unity中导入即可。 

    下面就开始正式的学习。


    1 创建玩家

    主角和第一个脚本 - Unity Learn

    1.1 创建玩家和场景

    进入官方第一节教程,并下载玩家主角Ruby的图片,下载的格式是PNG。由于我们的项目是2D的,需要将Texture Type改成Sprite(精灵),才能被Unity所使用。 

     新建一个场景命名为MainScene,并将修改类型后的Ruby图片拖入MainScene场景中。

    Unity中2D素材的使用

    刚刚做的一个简单的导入图片的过程,其实就是一次使用2D素材的过程,Unity中2的素材的使用通常要经过以下过程

    PNG(2D图片格式) ----> Sprite ----> GameObject

    1.2 了解精灵渲染器 Sprite Renderer

    Ruby这个游戏对象除了初始的Transform变换组件,还会有一个Sprite Renderer组件。

    我写了另一篇介绍其属性的博客:【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer

    1.3 精灵的静态和动态

    我们现在通过导入一个PNG转换成sprite后,得到的Ruby是一个静态精灵,教程中老师还介绍了动态精灵,这个后续再了解。

    2 移动玩家

    Untiy移动的话应该是基于Transform组件进行操作的,这时候就需要挂一个移动脚本了!再在脚本中给创建的Ruby添加运动。

    2.1 尝试创建一个移动脚本

    给刚刚创建的游戏对象Ruby新建一个RubyController脚本。

    先尝试挂一个在x轴自动移动的脚本,看看情况。

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class RubyController : MonoBehaviour
    5. {
    6. // 每帧都会执行一次Update函数
    7. void Update()
    8. {
    9. //transform获取当前游戏对象的transform组件的值
    10. Vector2 position = transform.position;
    11. position.x += 0.1f;
    12. //再赋值给游戏对象的transform
    13. transform.position = position;
    14. }
    15. }

    关于Unity中移动的距离单位

    设置游戏对象时,经常会有“设置对象位置为x轴XX个单位,y轴XX个单位”,Unity中并没有规定具体多长是1米/1厘米,根据需要自己规定就行。

    游戏中的控制方式

    • 鼠标键盘
    • 手机触屏
    • 手柄游戏
    • 体感游戏(水果忍者
    • 可穿戴设备:VR
    • 声控

    本次创建的游戏将通过键盘输入来控制玩家移动,此时就需要使用到Unity的输入系统。输入系统包括输入设置输入代码

    Unity输入系统中的输入设置

    输入设置就是Unity中定义键盘的按键的作用,可以由Edit -> Project Settings -> Input Manager查看默认设置。

    关于Input Manager官方介绍文档:Input Manager - Unity 手册

    对于Input Manager和Input类我进行了简单的学习总结:【Unity入门计划】基本概念(7)-Input Manager&Input类 

    2.2 键盘输入控制移动

    这里不再是跟之前那样,让Ruby逐帧自己移动了,现在通过调用API的方式实现键盘输入控制Ruby的移动。

    实现水平控制

    需要修改脚本中的Update函数:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class RubyController : MonoBehaviour
    5. {
    6. // 每帧都会执行一次Update函数
    7. void Update()
    8. {
    9. //声明新变量
    10. //获取水平轴并储存在新变量中
    11. float horizontal = Input.GetAxis("Horizontal");
    12. Debug.Log(horizontal);
    13. Vector2 position = transform.position;
    14. //对x轴移动距离做了细微的更改
    15. position.x += horizontal * 0.1f;
    16. transform.position = position;
    17. }
    18. }

    这里实现了:

    • 按下左键,轴为-1,则Ruby向左移动0.1f
    • 按下右键,轴为1,则Ruby向右移动0.1f
    • 不按任何键,轴为0,Ruby原地不动

    实现垂直控制

    对于y轴也添加相应操作:

    1. void Update()
    2. {
    3. //声明新变量
    4. //获取水平轴并储存在新变量中
    5. float horizontal = Input.GetAxis("Horizontal");
    6. //获取垂直轴
    7. float vertical = Input.GetAxis("Vertical");
    8. Vector2 position = transform.position;
    9. //对x轴移动距离做了细微的更改
    10. position.x += horizontal * 0.1f;
    11. //对y轴也做相应更改
    12. position.y += vertical * 0.1f;
    13. transform.position = position;
    14. }

    调整时间和帧率

    可以通过调整是否开启垂直同步以及限制帧率的方式提升/降低游戏帧率FPS。

    关于帧率设置可以参考以下文章:

    Unity3d 帧率设置 及在游戏执行时显示帧率 - lcchuguo - 博客园 (cnblogs.com)

    以单位/秒表示移动速度

    目前,由于是在Update()函数中更新的Ruby的位置信息,因此当前Ruby的移动速度是单位/帧,如何让他以单位/秒的速度运行呢?

    需要将速度再乘以Unity渲染一帧所需时间来更改移动速度,例如:如果当前Unity以每秒10帧速度渲染,则每帧耗时0.1秒,乘以0.1秒后移动速度就成了单位/秒。

    Unity中Time.deltaTime这个API能帮助我们获得从最后一帧到当前帧(只读)的间隔时间,其中deltaTime是Time中的一个变量,表示增量时间。

    加上后:

    1. void Update()
    2. {
    3. //声明新变量
    4. //获取水平轴并储存在新变量中
    5. float horizontal = Input.GetAxis("Horizontal");
    6. //获取垂直轴
    7. float vertical = Input.GetAxis("Vertical");
    8. Vector2 position = transform.position;
    9. //对x轴移动距离做了细微的更改
    10. position.x += horizontal * 0.1f*Time.deltaTime;
    11. //对y轴也做相应更改
    12. position.y += vertical * 0.1f*Time.deltaTime;
    13. transform.position = position;
    14. }

    运行游戏,会发现Ruby的移动速度变慢了!因为我们把速度改成了单位/秒,也就是说当前我们每秒仅移动了0.1个单位,这当然会很慢。如果将0.1f改成3.f,移动速度将会快很多。

  • 相关阅读:
    贪心——53. 最大子数组和
    Redis 的大 Key 对持久化有什么影响?
    Java String.indexOf()方法具有什么功能呢?
    解决缓存与数据库同步下的同步锁问题之分段锁
    【论文阅读】《Graph Neural Prompting with Large Language Models》
    Java多线程探究【三线程同步】
    Android源码相关面试专题
    Vue生命周期
    Java实现简易版的【图书管理系统】
    一次edu证书站的挖掘
  • 原文地址:https://blog.csdn.net/qq_41835314/article/details/126106604