当前位置:网站首页>【Unity入门计划】制作RubyAdventure01-玩家的创建&移动
【Unity入门计划】制作RubyAdventure01-玩家的创建&移动
2022-08-03 15:48:00 【flashinggg】
目录
前期准备
项目官方教程地址
Ruby's Adventure:2D 初学者 - Unity Learn
项目特点
可以让我们:
- 学会使用2D资源
- 学习简单的2D RPG 游戏制作
- 学习创建并控制角色(Script)
- 学习设置sprite
- 学习制作一些简单特效
下载并导入项目

使用到的资源保存地址
2D Beginner: Tutorial Resources | 教程 | Unity Asset Store
下载并在Unity中导入即可。
下面就开始正式的学习。
1 创建玩家
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轴自动移动的脚本,看看情况。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// 每帧都会执行一次Update函数
void Update()
{
//transform获取当前游戏对象的transform组件的值
Vector2 position = transform.position;
position.x += 0.1f;
//再赋值给游戏对象的transform
transform.position = position;
}
}
关于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函数:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// 每帧都会执行一次Update函数
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
Debug.Log(horizontal);
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f;
transform.position = position;
}
}
这里实现了:
- 按下左键,轴为-1,则Ruby向左移动0.1f
- 按下右键,轴为1,则Ruby向右移动0.1f
- 不按任何键,轴为0,Ruby原地不动
实现垂直控制
对于y轴也添加相应操作:
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f;
//对y轴也做相应更改
position.y += vertical * 0.1f;
transform.position = position;
}调整时间和帧率
可以通过调整是否开启垂直同步以及限制帧率的方式提升/降低游戏帧率FPS。
关于帧率设置可以参考以下文章:
Unity3d 帧率设置 及在游戏执行时显示帧率 - lcchuguo - 博客园 (cnblogs.com)
以单位/秒表示移动速度
目前,由于是在Update()函数中更新的Ruby的位置信息,因此当前Ruby的移动速度是单位/帧,如何让他以单位/秒的速度运行呢?
需要将速度再乘以Unity渲染一帧所需时间来更改移动速度,例如:如果当前Unity以每秒10帧速度渲染,则每帧耗时0.1秒,乘以0.1秒后移动速度就成了单位/秒。
Unity中Time.deltaTime这个API能帮助我们获得从最后一帧到当前帧(只读)的间隔时间,其中deltaTime是Time中的一个变量,表示增量时间。
加上后:
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f*Time.deltaTime;
//对y轴也做相应更改
position.y += vertical * 0.1f*Time.deltaTime;
transform.position = position;
}运行游戏,会发现Ruby的移动速度变慢了!因为我们把速度改成了单位/秒,也就是说当前我们每秒仅移动了0.1个单位,这当然会很慢。如果将0.1f改成3.f,移动速度将会快很多。
边栏推荐
- Ark server opening tutorial win
- No inner demons, to dry!SQL optimization and diagnosis
- 劲爆!协程终于来了!线程即将是过去式
- leetcode: 899. Ordered Queue [Thinking Question]
- 聊聊这个SaaS领域爆火的话题
- Essentially a database data recovery 】 【 database cannot read data recovery case
- unity用代码生成LightProbeGroup
- Js array method is summarized
- 指令重排以及案例
- 1、实例开启无锁表结构变更以后,在任务编排中通过“单实例SQL”节点进行的结构变更,是优先采用无锁表
猜你喜欢

劲爆!协程终于来了!线程即将是过去式

Neural networks, cool?

How to get the 2 d space prior to ViT?UMA & Hong Kong institute of technology & ali SP - ViT, study for visual Transformer 2 d space prior knowledge!.

Js array method is summarized

红蓝对抗经验分享:CS免杀姿势

2021年12月电子学会图形化四级编程题解析含答案:质数判断器

2021年12月电子学会图形化一级编程题解析含答案:放学

2021年12月电子学会图形化三级编程题解析含答案:跳高比赛

用友YonSuite与旺店通数据集成对接-技术篇2

2021年12月电子学会图形化一级编程题解析含答案:下雨
随机推荐
请问下,flink cdc监控oracle,我看源码是通过sid方式的,请问怎么改成service
身为售后工程师的我还是觉得软件测试香,转行成功定薪11.5K,特来分享下经验。
如何用二分法搜索、查找旋转数组中是否含有某个(目标)值? leetcode 81.搜索旋转排序数组
1、实例开启无锁表结构变更以后,在任务编排中通过“单实例SQL”节点进行的结构变更,是优先采用无锁表
Ruoyi Ruoyi framework @DataScope annotation use and some problems encountered
JS handwritten call apply bind (detailed) (interview)
Yii2安装遇到Loading composer repositories with package information
GTK实现旋转加载动画
ModelWhale 云端运行 WRF 中尺度数值气象模式,随时随地即开即用的一体化工作流
AI也有健忘症?英国41岁教授专访:解决灾难性遗忘
ReentrantReadWriteLock详解
简介undo log、truncate、以及undo log如何帮你回滚事物?
土耳其国防部:联合协调中心将对首艘乌克兰粮船进行安全检查
基于牛顿方法在直流微电网潮流研究(Matlab代码实现)
Research on power flow in DC microgrid based on Newton's method (Matlab code implementation)
实习路途:记录给我的第一个实习项目中的困惑
2021年12月电子学会图形化四级编程题解析含答案:新冠疫苗接种系统
JS手写call apply bind (详细)(面试)
8月份加密市场的三个关键预期 价格虽向北移动?预计仍将处于动荡之中
NodeJs - cross domain