【unity】分享一个2D小游戏的完整制作教程——小球跳圈

前言


1.准备游戏材质

  • 工具使用PS

  • 剪切这么几个不同颜色的圆环,切开 (注意要PNG格式的哦)
    在这里插入图片描述

  • 准备一个红旗 (注意要PNG格式的哦)
    在这里插入图片描述

2.进入编辑器,处理四色环的逻辑

  • 来到unity中,对我们准备好的png照片进行分割
    在这里插入图片描述
  • 在这里切割哦,完成后点apply
    在这里插入图片描述
  • 切好之后,将换的4个部分放到场景中,用一个父物体装着,并且调整好位置,使转动父物体的Z轴,环也能正常绕中心点转动!
    在这里插入图片描述
  • ok接下来我们写个脚本,让这个环在游戏开始的时候就以一定的速度转起来(100的角速度)之后环就可以转动了!
/// <summary>
/// 圈转动
/// </summary>
public class Rotator : MonoBehaviour
{
    public float rotateSpeed = 100f;

    private void Update()
    {
        //每秒转100度
        transform.Rotate(0f,0f,rotateSpeed*Time.deltaTime);
    }

}
  • 因为涉及到小球碰撞环的逻辑,因此需要给四个环都上一个碰撞器组件,因为的不规则物体,所以上一个多边形的碰撞器
    在这里插入图片描述
  • 这样一个关卡就差不多完成了(除了还没有上tag~)

3.玩家控制小球逻辑

  • 新建一个2DObject的小球,并且Sprite选择一个Knob
    在这里插入图片描述

  • 因为小球需要收到模拟的重力作用,因此给一个Rigibody,重力设置为3,并且锁定其x和z轴的运动,只让其在Y轴进行运动
    在这里插入图片描述

  • 因为要考虑到与环的碰撞,因此给其来一个碰撞器,选中Is Trigger,这样即使碰撞到了,小球不会被弹开,会穿过,但是不影响碰撞的回调
    在这里插入图片描述

  • 接下来我们来写小球的脚本

  • 首先写一个小球跳跃的逻辑,当点击鼠标左键,或者空格,小球向上跳跃~并且第一次跳跃前设置重力为0,开始游戏后,小球重力规模设置为3.

private void Update()
{
    if (Input.GetButton("Jump") || Input.GetMouseButtonDown(0))
    {
        if (firstBegin)
        {
            rb.gravityScale = 3;
            firstBegin = false;
        }
        rb.velocity = Vector2.up * jumpForce;
    }
}
  • 关于小球碰撞后的回调方法OnTriggerEnter2D,如果碰到的是tag为color changer的物体就改变颜色,然后将碰到的物体销毁(这个color changer其实就是一个隐藏起来的物体,用来让小球穿过一个环之后更改颜色的);如果碰到了和当前颜色不同的颜色环,那么记作游戏失败,重新加载场景(也就是回到起点)
private void OnTriggerEnter2D(Collider2D col)
{
    //碰撞的对象col
    if (col.CompareTag("color changer"))
    {
        SetRandomColor();
        Destroy(col);
        return;
    }
    if (!col.CompareTag(currentColor))
    {
        //回到出生点
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
    if (col.CompareTag("win point"))
    {
        SceneManager.LoadScene("Win");
    }
}
  • 大概放在这个位置,这样小球碰到就可以更改颜色!(当然这个color changer也需要一个碰撞器,用来检测)在这里插入图片描述

  • 环形的四部分也需要分别按照颜色名,上一个不同的Tag,用于和小球当前的颜色进行对比。
    在这里插入图片描述

  • 关于生成颜色的方法如下:使用随机数,给小球当前颜色赋值。

private void SetRandomColor()
{
    int index = Random.Range(0, 4);
    switch (index)
    {
        case 0:
            currentColor = "bule";
            sr.color = blueColor;
            break;
        case 1:
            currentColor = "yellow";
            sr.color = yellowColor;
            break;
        case 2:
            currentColor = "pink";
            sr.color = pinkColor;
            break;
        case 3:
            currentColor = "purple";
            sr.color = purpleColor;
            break;
    }
}
  • 再给终点的红旗一个碰撞体,并且给一个Tag给它,用来检测是否游戏胜利,胜利的话专门加载一个胜利的场景!
    在这里插入图片描述
  • 记得将这个场景放入Build Setting中,不然加载不出来哦
    在这里插入图片描述这样Player部分就完成啦!Player的完整代码如下:
/// <summary>
/// 小球跳动
/// </summary>
public class Player : MonoBehaviour
{
    public float jumpForce = 10f;

    public Rigidbody2D rb;

    public string currentColor;
    public SpriteRenderer sr;

    public Color blueColor;
    public Color yellowColor;
    public Color pinkColor;
    public Color purpleColor;
    private bool firstBegin = true;

    private void Start()
    {
        SetRandomColor();
        rb.gravityScale = 0;
    }

    private void SetRandomColor()
    {
        int index = Random.Range(0, 4);
        switch (index)
        {
            case 0:
                currentColor = "bule";
                sr.color = blueColor;
                break;
            case 1:
                currentColor = "yellow";
                sr.color = yellowColor;
                break;
            case 2:
                currentColor = "pink";
                sr.color = pinkColor;
                break;
            case 3:
                currentColor = "purple";
                sr.color = purpleColor;
                break;
        }
    }

    private void Update()
    {
        if (Input.GetButton("Jump") || Input.GetMouseButtonDown(0))
        {
            if (firstBegin)
            {
                rb.gravityScale = 3;
                firstBegin = false;
            }

            rb.velocity = Vector2.up * jumpForce;
        }
    }

    private void OnTriggerEnter2D(Collider2D col)
    {
        //碰撞的对象col
        if (col.CompareTag("color changer"))
        {
            SetRandomColor();
            Destroy(col);
            return;
        }

        if (!col.CompareTag(currentColor))
        {
            //回到出生点
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }

        if (col.CompareTag("win point"))
        {
            SceneManager.LoadScene("Win");
        }
    }
}

4.关于摄像机部分

  • 小球一直上跳,当小球的高度高于摄像机时,摄像机应该跟随小球的y值进行上移动,因此再给摄像机一个这样的脚本,我们的游戏就完成了!
public class followPlayer : MonoBehaviour
{
    public Transform playerTransform;

    private void Update()
    {
        if (playerTransform.position.y > transform.position.y)
        {
            transform.position = new Vector3(transform.position.x, playerTransform.position.y, transform.position.z);
        }

    }
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>