【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);
        }

    }
}
<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值