Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

这篇具有很好参考价值的文章主要介绍了Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

人物的创建以及刚体的设置

图层渲染层级设置

角色碰撞箱设置

使用代码控制人物移动

创建脚本文件

 初始函数解释

控制移动代码

初始化变量

 获得键盘输入

 调用函数


手册链接在这:Unity User Manual (2019.3) - Unity 手册

没有控制人物移动的2D游戏就太说不过去了!那么接下来,这篇文章将会以简单的几行代码轻松的教会你实现2D人物的移动,不必担心看不懂代码,我将会查询API手册以保姆级教程来帮助你理解!那么我们开始吧!

人物的创建以及刚体的设置

 首先随便选择一个可用的人物素材当作我们的移动主人公,我这边就选用了一个胡桃夹子的形象当作主角。

 Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 那么很显然这张图片素材需要切割,而且我们发现这张图片的命名为Idel,这是动画设置的常用名称,意思是人物待机时的动画,那么切割完也能方便我们实现人物的动画效果。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 切割的尺寸素材作者很贴心的标出来了,X16,Y24Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 那么我们的素材已经切割好了,接下来就是把它放到场景里了,我们直接拖拽第一张角色的图片进入场景,然后将其重命名为Player。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

然后为其添加两个组件,这两个组件就可以让我们简单的控制我们的人物移动了,不过还需要结合下文的代码实现。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

我的设置如下

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

各参数设置缘由为下:

Gravity Scale设置为0,可以让我们的角色不再受到Unity默认的重力影响,而是可以上下左右进行平面移动,这是我们需要的功能。

Collision Detection 设置为Continuous 则能保证一直检测碰撞体间的碰撞,防止出现穿模卡墙的问题。

Freeze Rotation的Z轴 (冻结Z轴)则是防止我们的角色因为发生物理碰撞产生旋转,如下图GIF

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动


图层渲染层级设置

因为我们制作的游戏带有RPG的要素,那么我希望我的人物能显示于背景以及建筑之前,那么我们新建一个图层,为其命名为Player,在Soritng Later选项中,下拉菜单选择Add Sorting Layer

 Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 渲染层级的顺序以从下往上的优先级进行渲染,在新建完了Layer之后别忘了把我们Player的层级设置成Player。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动


角色碰撞箱设置

选择我们角色的碰撞箱组件,编辑其碰撞箱

 Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

将碰撞箱设置成这个大小

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 为什么设置成这个大小呢?因为我们希望我们的角色能成功的遮挡到背景,也不要太过容易的碰撞到场景物体。

使用代码控制人物移动

 那么接下来就是重头戏了,如何利用代码控制我们人物的移动呢?

创建脚本文件

我们在项目文件夹中新建一个文件夹取名为Script,在这里面我们方便管理并存放我们的脚本,那么我们创建一个脚本文件命名为PlayerController

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 然后拖拽我们的脚本文件挂载到我们的人物身上。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动


 初始函数解释

 每一个默认的C#脚本,Unity都会存放两个默认生成的函数

     // Start is called before the first frame update
    void Start()
    {

    }

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

Strat函数会在游戏启动时调用,Update函数则是每一帧调用一次,它们跟深层次的使用方法我们暂不深究。


控制移动代码

初始化变量

我们之前已经在我们的人物身上挂载了刚体组件,控制移动的方法就需要利用刚体,那么我们怎么使用脚本来控制刚体组件呢?

Unity将每个组件的名称写成了一个类,借助类,我们可以生成一个空对象rb

//获取刚体组件
private Rigidbody2D rb;

 那么我希望我能借助变量控制速度的参数,使用Pubilc创建一个变量称之为Movespeed

    //人物移动速度
    public float Movespeed;

 既然我们能拿到Rigibody2D这个组件,那么拿到其他的组件也是可行的,比如Transform组件,在这里你可以自己试试使用Transform这个类型生成一个变量!

 private关键字意为私有,也就是将rb这个对象私有化了,即仅能在当前的这个类中访问到它。

public则是公有,也就是当前的变量在类外类内都可以被访问,以上面的Movespeed为例,保存代码后,我们也可以在Unity编辑器界面看到它。

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

  • GetComponent,既然每个组件变成了类,那么借助GetComponeent,将模板参数设置成相同类型即可得到当前代码挂载物体上的刚体组件,也就是以函数的方式获取了当前挂载物件上的组件对象我们在Start函数中写入这个代码
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

 获得键盘输入

 实现移动,需要和键盘的输入进行联动,联动用的方法是调用Input类里面的函数GetAxis

Input.GetAxis

public static float GetAxis (string axisName); 

返回由 axisName 标识的虚拟轴的值,这个值的类型是一个float(浮点型)

axisName:对应绑定的键位的输入字符串名称

GetAxis的具体解释比较难懂,不过简单来说就是获得对应字符串绑定的键位输入,比如以左右移动为例,左右移动,我们习惯使用AD两个按键进行控制,那么对应这两个按键的字符串名字我们可以在Edit->Input Manager 中找到Hrizontal,这个就是我们想要的对应字符串名称

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 为了实现移动,我们新建一个函数称为Movement,前文也提过,GetAxis的返回值是一个float类型的值,那么我们也定义一个float来存储它的返回值。

注意!字符串内的对应名称一定一定要与Input Manager的名称相同!不然这个函数会调用失败!也就是我们Horizontal一定要打对!

 void Movement()
    {
        
        float InputSpeedX = Input.GetAxis("Horizontal");
    }
  • 那么借助这个函数,我们成功获得了键盘输入的值,拿到了当前输入的速度之后,使用成员函数对当前对象的位置进行位移。
  • 使用刚体类中的成员变量velocity即刚体的线性速度,即可控制刚体的左右移动
  • 官方的API手册中,给予了操控velocity值的方法,将一个new出来的vector2类型的变量进行赋值
  • 官方的使用范例如下:Rigidbody-velocity - Unity 脚本 API

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

  •  vector2 是一个类,使用new创建一个Vector2对象,Vector2对象的初始化是传入两个浮点类型的变量。一个是x,一个是y,那么前面设置的两个float变量即可在这里使用达到控制效果,单纯的实现水平移动,不需要获得Y值
 rb.velocity = new Vector2(InputSpeedX * Movespeed, rb.velocity.y);

 调用函数

那么我们的movement函数的大概样式如下

    void Movement()
    {
        float InputSpeedX = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(InputSpeedX * Movespeed, rb.velocity.y);
    }

为了能让GetAxis无时无刻的检测键盘上的输入,我们需要借助一个函数来调用它 FixedUpdate

 FixedUpdate

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

实现了移动函数需要不断的调用,使用Update函数也可以,但是不稳定,由于不同的机器每秒中能生成的帧数并不是恒定的,每一帧调用一次函数会导致一些问题从而使得Update不稳定

而FixedUpdate  每个固定帧率帧调用该函数,调用之间的默认时间为 0.02 秒(50 次调用/秒 


    private void FixedUpdate()
    {
        Movement();
    }

 那么将Movespeed设置为5,保存我们的代码返回Unity,启动游戏,我们的人物就可以移动了!Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

 但是手感还是怪怪的,平滑的移动感觉让人很不舒服,当然如果你喜欢可以保留,不过我就不用了,如果你也不喜欢,可以将GetAxis换成GetAxisRaw,这样就不是平滑移动了。

整体代码如下:

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

public class PlayerControler : MonoBehaviour
{

    private Rigidbody2D rb;
    public float Movespeed;
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {  
    }
    private void FixedUpdate()
    {
        Movement();
    }
    void Movement()
    {

        float InputSpeedX = Input.GetAxisRaw("Horizontal");

        rb.velocity = new Vector2(InputSpeedX * Movespeed, rb.velocity.y);

    }

}

怎么样?是不是很简单?当然,我们还没有实现上下移动的方法,不过相信如上的过程实现上下移动对于你肯定不是问题!这里就留个小挑战!希望你能实现出来!

当然你也可能是一位代码苦手,所以我这边还是写在下面了!不要偷看哦!

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

public class PlayerControler : MonoBehaviour
{

    private Rigidbody2D rb;
    public float Movespeed;
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {  
    }
    private void FixedUpdate()
    {
        Movement();
    }
    void Movement()
    {

        float InputSpeedX = Input.GetAxisRaw("Horizontal");
        float InputSpeedY = Input.GetAxis("Vertical");

        rb.velocity = new Vector2(InputSpeedX * Movespeed, rb.velocity.y);
        rb.velocity = new Vector2(rb.velocity.x,InputSpeedY * Movespeed);

    }

}

第二种方法实现移动

那么实现移动的方法也不止使用刚体组件内部的velocity,我们还可以通过控制刚体组件的Positon来实现人物的移动控制。

不同于我们分别控制组件的X,Y轴的值,我们可以声明一个Vector2类型的变量来控制。Vector2内部有两个成员变量,一个X,一个Y,那么同理,Vector3里面就有X,Y,Z

 Vector2 movement;

 那么我们就使用movement这个对象内部的X,Y来分别接受键盘输入的信息

 movement.x = Input.GetAxisRaw("Horizontal");
 movement.y=  Input.GetAxisRaw("Vertical");

然后我们使用刚体组件的函数MovePositon来实现

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

那么这个函数需要传入的是一个Vector2类型的值,那么我们将当前组件的Positon 加上 获得输入的Vector2类型的movement乘上设置好的速度值以及每秒钟的时间(位移=速度*时间)而因为我们在FixedUpdate中调用这个函数,那么时间也应该是FixedDeltaTime

rb.MovePosition(rb.position + movement * Movespeed*Time.fixedDeltaTime);

这种方法也同样能实现移动,也是不错的方法。


那么到这就结束了!接下来就是接入帧动画!让我们的游戏人物变得更加生动!希望对你有点帮助!感谢阅读!

Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动文章来源地址https://www.toymoban.com/news/detail-463815.html

到了这里,关于Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【模型+代码/保姆级教程】使用Pytorch实现手写汉字识别

    参考文章: 最初参考的两篇: 【Pytorch】基于CNN手写汉字的识别 「Pytorch」CNN实现手写汉字识别(数据集制作,网络搭建,训练验证测试全部代码) 模型: EfficientNetV2网络详解 数据集(不必从这里下载,可以看一下它的介绍): CASIA Online and Offline Chinese Handwriting Databases 鉴于

    2024年02月07日
    浏览(30)
  • Unity2D控制角色左右移动

    1.在Hierarchy一栏中选中角色; 2.在inspector栏最底端找到Add Component选项并点击; 3.添加Rigidbody2D,合适的collider和new script; 4.将添加的Rigidbody2D拖到new script中;   5.在project栏中找到新添加的C#文件并双击打开(如果还没有编辑代码的工具,推荐Vscode) 6.代码如下: using System.Nu

    2024年02月14日
    浏览(32)
  • 大家都在用的AI作画Python几行代码就可实现

    要想快速实现功能,咱们先了解一下OpenAI,OpenAI是一家人工智能公司,专注于开发强化学习、机器学习、自然语言处理等技术。OpenAI的主要目标是创造一套安全的人工智能系统,以帮助人们在各行各业中利用这项技术.接下来咱们来实现一下。 安装openai库: 调用openai生成图片以

    2024年02月06日
    浏览(26)
  • unity 2d游戏开发教程(2d战棋)

    unity 2d 游戏开发教程(2d战棋) 类似的游戏有:火焰纹章,梦幻模拟战 素材下载地址: 人物 https://brullov.itch.io/generic-char-asset 场景 https://anokolisa.itch.io/sidescroller-pixelart-sprites-asset-pack-forest-16x16 场景2:https://anokolisa.itch.io/dungeon-crawler-pixel-art-asset-pack/devlog/447513/12th-road-map-for-pi

    2024年02月13日
    浏览(40)
  • 高级圣诞树代码实现合集-保姆级教程【前端三件套实现—0基础直接运行】

    0基础直接运行教程: 1.新建txt文本: 2.将代码粘贴到txt文本里: 3.将后缀改为html 4.双击打开html文件,观察效果~ 这段代码是一个用HTML和JavaScript实现的圣诞树动画效果。我将代码分成几个部分进行讲解。 HTML结构: 在 head 标签中定义了页面的标题、字符集和样式。 样式部分

    2024年02月04日
    浏览(52)
  • Unity键盘左右键(AD键)控制2D角色的左右朝向/翻转

            第一种方法是利用 Input.GetAxis(\\\"Horizontal\\\") 的值得范围。Input.GetAxis(\\\"Horizontal\\\")的范围是[-1,1]。 Input.GetAxis(\\\"Horizontal\\\")的值大于0时,向右转;Input.GetAxis(\\\"Horizontal\\\")小于0时,向左转 将该脚本挂在要控制的角色身上 注意:使用此方法时要保证放在unity中的角色的scale没有改变

    2024年02月03日
    浏览(38)
  • 从零实现一套低代码(保姆级教程) --- 【1】初始化项目,实现左侧组件列表

    低代码作为前端一个比较热门的方向,讨论度或者热度都算是拉满了。 如果你想了解低代码,可以在网上找一些相关的网站。像阿里等公司都有开源的项目和在线体验。 但是因为他们的代码比较牛逼,其实没有那么通俗易懂。 那博主是想,通过一系列文章的讲解,从零实现

    2024年02月04日
    浏览(43)
  • 从零实现一套低代码(保姆级教程)【后端服务】 --- 【18】实现页面接口对应的前端

    在上一篇中,我们已经把和页面相关的接口完成的差不多了。从创建页面,更新页面等等: 有了接口之后,我们就可以构建前端页面了。那这部分前端内容我们应该写在哪里呢? 有两种方式: 直接写在我们的XinBuilder项目里面,然后通过前端路由拆分成两个路由 在创建一个

    2024年01月22日
    浏览(40)
  • 从零实现一套低代码(保姆级教程) --- 【3】实现Button组件和画布区的拖拽

    目前是每天更新一篇, 因为我不止要写文章,这些代码也是我正在敲的。可能速度没有那么快,但是这个频率感觉还是可以的。 本篇是这个系列的第三篇,如果你是第一次看到这个文章,那你应该会对低代码有那么一丢丢兴趣或者很有兴趣。从标题来看,也知道我这个系列

    2024年02月04日
    浏览(34)
  • 从零实现一套低代码(保姆级教程)【后端服务】 --- 【16】初始化后端项目

    在前面的实现过程中,我们的低代码平台,在前端已经有一定的构建页面的能力了。 但是对于我们实现一个平台,肯定要支持用户对页面进行保存等功能,包括后面我们运行时的设计,都要依赖于后端的能力 所以,现在我们需要考虑开始使用数据存储了。那因为博主平时的

    2024年01月24日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包