1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳

Posted ζั͡ ั͡雾 ั͡狼 ั͡✾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳相关的知识,希望对你有一定的参考价值。

 

总目录

 0.Unity资源商店随便下载一些2D资源

教学链接https://blog.csdn.net/wwlcsdn000/article/details/78688507?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165699385516781683969565%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165699385516781683969565&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-78688507-null-null.142%5Ev30%5Edown_rank,185%5Ev2%5Etag_show&utm_term=unity%E8%B5%84%E6%BA%90%E5%95%86%E5%BA%97&spm=1018.2226.3001.4187

 1.瓦片地图的创建+碰撞盒子

教学链接https://blog.csdn.net/smallfox233/article/details/117570119?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165699282516782246478033%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165699282516782246478033&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-117570119-null-null.142%5Ev30%5Edown_rank,185%5Ev2%5Etag_show&utm_term=Unity%E7%93%A6%E7%89%87%E5%9C%B0%E5%9B%BE&spm=1018.2226.3001.4187

当然商店2D免费资源里面有瓦片地图,不用自己费时间画图

2.角色的创建+2D刚体+碰撞盒子+脚本

需要注意,2D刚体组件里面需要冻结Z轴(如果你不想自己角色摇摆且倒来倒去)

一些注意事项:

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

public class player : MonoBehaviour

    private bool Iscanjump=false;//是否能跳跃,默认不能
    private Rigidbody2D rig;//2D刚体
    public float dropConst;//下坠常数
    public float speed;//地面移动速度
    public float jumpspeedUp;//上升速度
    public float jumpspeedVertiacal;//空中左右移动速度
    // Start is called before the first frame update
    void Start()
    
        rig = GetComponent<Rigidbody2D>();//获取刚体
    

    // Update is called once per frame
    void Update()
    
        move();//移动函数
    
    private void move()
        //水平,垂直俩个轴系
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        //跳跃
        if (v >0 && Iscanjump == true)
        
            rig.velocity = new Vector2(0, jumpspeedUp);//设置刚体速度,给予向量
        
        //长按高跳
        if (rig.velocity.y>0&&Input.GetKey(KeyCode.W) && Iscanjump == false)
        
            rig.velocity += Vector2.up*0.2f;//长按高跳额外得到向上速度
        
        //优化手感
            float a = dropConst * 5 - Mathf.Abs(rig.velocity.y);//通过下坠常数,空中速度快为0时,下坠常数a越大,即越快速 度过这个状态
            rig.velocity -= Vector2.up * a * Time.deltaTime;

        //左右移动
        Vector3 vt = new Vector3(h, 0, 0).normalized;//vt为俩个轴系合成的方向向量,normalized单位化
        Debug.Log(v);
            //空中左右移动,为地面jumpspeedVertiacal倍
        if (h != 0 && Iscanjump == false)
        
            gameObject.transform.Translate(vt * speed *jumpspeedVertiacal * Time.deltaTime);//通过这个函数来使用vt使得左右移动
        
            //地面左右移动
        else  gameObject.transform.Translate(vt * speed * Time.deltaTime); 
    
    //检测否在地面碰撞盒子检测,通过给地面碰撞盒子transform的tag标签为ground
    private void OnCollisionStay2D(Collision2D collision)
    
        if (collision.transform.tag == "ground")
        
            Iscanjump = true;
        
      
    
    private void OnCollisionExit2D(Collision2D collision)
    
        if (collision.transform.tag == "ground")
        
            Iscanjump = false;

        
    

通过下坠常数,空中速度快为0时,下坠常数a越大,即越快速 度过这个状态,优化跳跃手感

代码优化:

1.转向,通过控制scale的x为相反数来转向。

2.我们会发现由于本体的碰撞盒过大(本体为playerControl脚本),当跳起来的时候,头部会碰到地面或者侧边碰到天上的地面的时候,也会达成跳跃条件,我们为了取得跳跃正常,我们需要在角色下面创建一个空对象,然后命名为bottom,最后将在bottom下新建一个碰撞盒组件,然后这样碰撞盒判断和控制在脚底下(Isjump脚本)。(为什么不直接将本体的碰撞盒缩小至脚底下?因为你需要有自己的大小,使得头不穿过地面。)

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

public class playerControl : MonoBehaviour

    public bool Iscanjump = false;//是否能跳跃,默认不能
    private Rigidbody2D rig;//2D刚体

    float ScalX;//获取初始Scale.x,用于转向 
    public float dropConst;//下坠常数
    public float speed;//地面移动速度
    public float jumpspeedUp;//上升速度
    public float jumpspeedVertiacal;//空中左右移动速度
       // Start is called before the first frame update
    void Start()
    

        ScalX = transform.localScale.x;
    

    // Update is called once per frame
    void Update()
    
        move();//移动函数
    
    private void move()
        //水平,垂直俩个轴系
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float dir = Input.GetAxisRaw("Horizontal");//方向-1 0 1
        //跳跃
        if (v > 0 && Iscanjump == true)
        
            rig.velocity = new Vector2(0, jumpspeedUp);//设置刚体速度,给予向量
        
        //长按高跳
        if (rig.velocity.y > 0 && Input.GetKey(KeyCode.W) && Iscanjump == false)
        
            rig.velocity += Vector2.up * 0.2f;//长按高跳额外得到向上速度
        
        //优化手感
        float a = dropConst * 5 - Mathf.Abs(rig.velocity.y);//通过下坠常数,空中速度快为0时,下坠常数a越大,即越快速 度过这个状态
        rig.velocity -= Vector2.up * a * Time.deltaTime;
        //方向改变
        if (dir != 0)
        
            transform.localScale = new Vector3(dir* ScalX, transform.localScale.y, transform.localScale.z);//通过改变scale改变方向
        
        //左右移动
        Vector3 vt = new Vector3(h, 0, 0).normalized;//vt为俩个轴系合成的方向向量,normalized单位化

   
        //空中左右移动,为地面jumpspeedVertiacal倍
        if (h != 0 && Iscanjump == false)
        
            gameObject.transform.Translate(vt * speed * jumpspeedVertiacal * Time.deltaTime);//通过这个函数来使用vt使得左右移动
        
        //地面左右移动
        else  gameObject.transform.Translate(vt * speed * Time.deltaTime); 
    

将bottom的碰撞盒改成触发器

 

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

public class IsJump : MonoBehaviour

    //为了优化跳跃碰撞盒,在父物体下面新建空对象bottoom,并添加碰撞盒,用来检测底部(以前碰撞盒头碰到顶部地面还能跳不符合常理,所以需要作此操作)

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

    

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

    
    //检测否在地面碰撞盒子检测,通过给地面碰撞盒子transform的tag标签为ground
    private void OnTriggerStay2D(Collider2D collision)
    
        if (collision.transform.tag != "untagged")
        
           transform.GetComponentInParent<playerControl>().Iscanjump = true;//获取父物体脚本变量并赋值      
        

    
    private void OnTriggerExit2D(Collider2D collision)
    
        if (collision.transform.tag != "untagged")
        

            transform.GetComponentInParent<playerControl>().Iscanjump = false;//获取父物体脚本变量并赋值
            
        
    

下一篇

2.Unity2D 横版 帧动画sprite animation+动画状态机animator+丝滑连击动作_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客Unity2D 横版 帧动画sprite animation+动画状态机animator+丝滑连击动作 为什么设置了attack之后还要设置normalizedTime参数?因为如果设置一个参数的话,你点击攻击按钮会直接跳转到下一个动作。并不能完整的将攻击动作放完,那么就多添加一个。他们参数用来判断行为达到哪个阶段,并通过脚本来控制他们参数在进入因为和退出行为时都设置normalizedTime成零。这样就可以使得你点击攻击按钮动作放完了之后才到下一个动作。............https://blog.csdn.net/qq_54263076/article/details/125631721

如何实现横版游戏中角色的移动控制

嗨!大家好,我是小蚂蚁。欢迎关注我的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。

今天分享一下横版游戏中角色的移动控制,在一个 2D 的横版游戏中,对于游戏角色的移动控制,其实只需要考虑水平方向上即可。如果角色可以跳跃的话,才需要去考虑垂直方向上的移动,这篇文章只涉及到水平方向上的角色移动控制。

如何实现横版游戏中角色的移动控制_游戏开发

如图,是一个人物角色,我们需要考虑的有两点。

第一点是控制这个角色在水平方向上移动,按向右移动的按钮时,他的位置应该向右移动,按向左移动的按钮时,他的位置应该向左移动。

第二点是控制角色的朝向,向右移动时,角色应该面向右,向左移动时,角色应该面向左。

接下来,我们来到微信小游戏制作工具中,看一下如何实现这样的移动控制功能。

我们先来实现一下利用“摇杆”控制角色的移动。“摇杆”插件位于素材库中,点击“资源管理器”中的“添加素材”按钮,打开素材库。

如何实现横版游戏中角色的移动控制_游戏开发_02

在素材库的上选择“插件”,找到“摇杆”,添加到项目中。

接着,再添加一个用于控制的角色,可以在素材库中找到“丛林冒险”中的“奔跑人物”(这个素材是有跑步动画帧的),添加到项目中。

如何实现横版游戏中角色的移动控制_游戏开发_03

添加完成之后,我们的项目就变成了这样。

如何实现横版游戏中角色的移动控制_游戏开发_04

接下来我们将使用下方的这个摇杆来控制游戏角色的移动。

要实现精灵的移动控制,其实工具已经为我们提供了现成的“行为”了,选中“奔跑人物”,然后在属性区中点击“管理行为”,在打开的行为面板中,开启“方向控制”行为。

如何实现横版游戏中角色的移动控制_游戏开发_05

行为开启后,回到属性区的下方就可以看到关于“方向控制”行为的一些属性了。这里因为我们只需要控制水平方向上的移动,所以方向选择这里使用“左右”即可。

如何实现横版游戏中角色的移动控制_游戏开发_06

除此之外,在积木区中的“行为”类别中,也增加了与“方向控制”有关的积木块。

如何实现横版游戏中角色的移动控制_游戏开发_07

其实,在增加了“摇杆”插件,开启了“方向控制”行为之后,我们就已经完成第一步了,点击预览场景,看一下。

如何实现横版游戏中角色的移动控制_游戏开发_08

可以看到,这时我们已经可以使用摇杆来控制角色的移动了。

接下来,我们继续完成第二步,就是调整角色的朝向,让角色向右移动时,面向右,向左移动时,面向左。

想要实现这个功能,需要先了解 2 块积木块,第一块就是“方向控制”中的“移动方向”积木块。

如何实现横版游戏中角色的移动控制_游戏开发_09

调用这个积木块,我们可以获得一个角度值,通过判断当前的角度值,可以知道当前角色是在向哪里移动。

如何实现横版游戏中角色的移动控制_游戏开发_10

如图,如果当前正在向右移动的话,调用“移动方向”积木块会获得一个 0 的值,向左移动的话,会获得一个 180 的值。

接下来,我们了解一下第二块积木块。位于“外观”中的“将自己的造型水平翻转”。

如何实现横版游戏中角色的移动控制_游戏开发_11

这个积木块帮助我们解决的就是精灵图片的朝向。

如何实现横版游戏中角色的移动控制_游戏开发_12

如图,左侧的图片经过“水平”翻转后,就会变成右侧的样子。

在了解完这两块必须的积木块之后,我们直接来看一下实现逻辑,在角色上增加如下的积木块。

如何实现横版游戏中角色的移动控制_游戏开发_13

这里我们根据“是否向右”的变量的值,以及“移动方向”的数值,来判断何时进行水平翻转。如果当前角色面向右,那么只有在角色向左移动的时候,才应该进行一次翻转,让角色面向左,反之亦然。

再次预览一下,看看移动效果。

如何实现横版游戏中角色的移动控制_游戏开发_14

根据摇杆的控制,角色会向正确的方向移动,并且会面向正确的方向,这样控制角色移动的功能就完成了,

可能有人会说,这是一个 2D 横版游戏,根本没有必要使用一个包含 4 个方向的摇杆,只需要使用“一左一右”的两个按钮控制方向就可以了。使用两个按钮来控制方向其实也非常的简单。

我们在场景中增加两个按钮,表示左右键。

如何实现横版游戏中角色的移动控制_游戏开发_15

然后,新建 2 个通知,一个通知“向左移动”,一个通知“向右移动”。

如何实现横版游戏中角色的移动控制_游戏开发_16

这两个按钮的上的逻辑非常的简单,当我按住按钮时,它们给游戏中的角色发送对应的通知。

如何实现横版游戏中角色的移动控制_游戏开发_17

如何实现横版游戏中角色的移动控制_游戏开发_18

最后,来到角色上,接收这两个通知,然后只需要根据通知调用“行为”中的“向左/右移动”积木即可。

如何实现横版游戏中角色的移动控制_游戏开发_19

最后,我们来预览一下。

如何实现横版游戏中角色的移动控制_游戏开发_20

这样我们就实现两种移动控制方式,一种使用“摇杆”控制,一种使用“左右按钮”控制,其实“摇杆”插件只不过是自动给我们处理了向左向右的移动而已。

好了,今天的内容就到这里了,对于横版游戏中角色的移动控制技能,你掌握了吗? 


​嗨!大家好,我是小蚂蚁。欢迎关注我的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。

如何实现横版游戏中角色的移动控制_游戏开发_21


以上是关于1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳的主要内容,如果未能解决你的问题,请参考以下文章

Unity 2D横版移动跳跃问题——关于一段跳与二段跳

如何实现横版游戏中角色的移动控制

持久 TCP 连接、长时间超时和 IP 跳跃移动设备

Python中的盆地跳跃(Basin Hopping)优化

玩家跳跃高度不一致 - Unity

理解scipy盆地跳跃优化功能的例子