1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳
Posted ζั͡ ั͡雾 ั͡狼 ั͡✾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳相关的知识,希望对你有一定的参考价值。
0.Unity资源商店随便下载一些2D资源
1.瓦片地图的创建+碰撞盒子
当然商店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;//获取父物体脚本变量并赋值
下一篇
如何实现横版游戏中角色的移动控制
嗨!大家好,我是小蚂蚁。欢迎关注我的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。
今天分享一下横版游戏中角色的移动控制,在一个 2D 的横版游戏中,对于游戏角色的移动控制,其实只需要考虑水平方向上即可。如果角色可以跳跃的话,才需要去考虑垂直方向上的移动,这篇文章只涉及到水平方向上的角色移动控制。
如图,是一个人物角色,我们需要考虑的有两点。
第一点是控制这个角色在水平方向上移动,按向右移动的按钮时,他的位置应该向右移动,按向左移动的按钮时,他的位置应该向左移动。
第二点是控制角色的朝向,向右移动时,角色应该面向右,向左移动时,角色应该面向左。
接下来,我们来到微信小游戏制作工具中,看一下如何实现这样的移动控制功能。
我们先来实现一下利用“摇杆”控制角色的移动。“摇杆”插件位于素材库中,点击“资源管理器”中的“添加素材”按钮,打开素材库。
在素材库的上选择“插件”,找到“摇杆”,添加到项目中。
接着,再添加一个用于控制的角色,可以在素材库中找到“丛林冒险”中的“奔跑人物”(这个素材是有跑步动画帧的),添加到项目中。
添加完成之后,我们的项目就变成了这样。
接下来我们将使用下方的这个摇杆来控制游戏角色的移动。
要实现精灵的移动控制,其实工具已经为我们提供了现成的“行为”了,选中“奔跑人物”,然后在属性区中点击“管理行为”,在打开的行为面板中,开启“方向控制”行为。
行为开启后,回到属性区的下方就可以看到关于“方向控制”行为的一些属性了。这里因为我们只需要控制水平方向上的移动,所以方向选择这里使用“左右”即可。
除此之外,在积木区中的“行为”类别中,也增加了与“方向控制”有关的积木块。
其实,在增加了“摇杆”插件,开启了“方向控制”行为之后,我们就已经完成第一步了,点击预览场景,看一下。
可以看到,这时我们已经可以使用摇杆来控制角色的移动了。
接下来,我们继续完成第二步,就是调整角色的朝向,让角色向右移动时,面向右,向左移动时,面向左。
想要实现这个功能,需要先了解 2 块积木块,第一块就是“方向控制”中的“移动方向”积木块。
调用这个积木块,我们可以获得一个角度值,通过判断当前的角度值,可以知道当前角色是在向哪里移动。
如图,如果当前正在向右移动的话,调用“移动方向”积木块会获得一个 0 的值,向左移动的话,会获得一个 180 的值。
接下来,我们了解一下第二块积木块。位于“外观”中的“将自己的造型水平翻转”。
这个积木块帮助我们解决的就是精灵图片的朝向。
如图,左侧的图片经过“水平”翻转后,就会变成右侧的样子。
在了解完这两块必须的积木块之后,我们直接来看一下实现逻辑,在角色上增加如下的积木块。
这里我们根据“是否向右”的变量的值,以及“移动方向”的数值,来判断何时进行水平翻转。如果当前角色面向右,那么只有在角色向左移动的时候,才应该进行一次翻转,让角色面向左,反之亦然。
再次预览一下,看看移动效果。
根据摇杆的控制,角色会向正确的方向移动,并且会面向正确的方向,这样控制角色移动的功能就完成了,
可能有人会说,这是一个 2D 横版游戏,根本没有必要使用一个包含 4 个方向的摇杆,只需要使用“一左一右”的两个按钮控制方向就可以了。使用两个按钮来控制方向其实也非常的简单。
我们在场景中增加两个按钮,表示左右键。
然后,新建 2 个通知,一个通知“向左移动”,一个通知“向右移动”。
这两个按钮的上的逻辑非常的简单,当我按住按钮时,它们给游戏中的角色发送对应的通知。
最后,来到角色上,接收这两个通知,然后只需要根据通知调用“行为”中的“向左/右移动”积木即可。
最后,我们来预览一下。
这样我们就实现两种移动控制方式,一种使用“摇杆”控制,一种使用“左右按钮”控制,其实“摇杆”插件只不过是自动给我们处理了向左向右的移动而已。
好了,今天的内容就到这里了,对于横版游戏中角色的移动控制技能,你掌握了吗?
嗨!大家好,我是小蚂蚁。欢迎关注我的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。
以上是关于1.Unity2D 横版 移动+跳跃+跳跃优化+长按高跳的主要内容,如果未能解决你的问题,请参考以下文章