Unity 2D 学习笔记:游戏实例Sunnyland

01安装软件&导入素材

1.去unity官网下载软件,地址:https://unity.cn,我用的是2018.4.5版本,Mac版,下载安装完成后,如下图。
在这里插入图片描述
2.新建项目,在素材商店中搜索Sunnyland,找到后选择导入import。
在这里插入图片描述
在这里插入图片描述

02编辑素材&Tilemap

1.首先添加游戏背景,使用像素背景照片是每单元格100像素,这样会使图片显示的非常小,所以先更改每单元像素值为16。
在这里插入图片描述
在这里插入图片描述

左上角选择按钮
在这里插入图片描述
分别对应:选择、移动、旋转、放大缩小、调整边框、其他选择
分别对应快捷键:Q W E R T Y

2.添加unity 2D 常用的功能Tilemap(瓦片地图)
在这里插入图片描述
3.tilemap创建好了,那么我们怎么在上面绘画呢,这就要创建我们的tile,选择window->2D->Tile Palette。新建一个文件夹map,放置我们的素材,将tileset素材拖进tile palette,自定义切割方法,16*16,然后就可以用tile palette中的元素在tilemap中绘制场景了。
在这里插入图片描述
在这里插入图片描述

03图层layer&角色建立

1.需要调整背景和我们绘制的场景会图层顺序,否则会出现覆盖现象。首先选择back背景,在Sprite Renderer中选择Sorting Layer,添加新的layer。
2.如图,我已经创建了两个新的Layer,越在下面显示的Layer就越会出现在场景的前面。这是一种方法。还有一种方法是,比如back和tilemap的图层都是Default,那么可以调整他们的Order in Layer大小,比如1会显示在0的前面。
在这里插入图片描述
在这里插入图片描述
3.添加游戏角色
方法1:选择Sunnyland-Sprites-player-idle-将他们的单元格像素值改成16,然后拖拽进scene中。(不常用)
方法2:新建一个Sprite,将图片渲染成2D精灵,以拖拽的方式将小狐狸角色图片与其绑定
在这里插入图片描述
在这里插入图片描述

这里要介绍下add component,添加组件功能,它是使角色进行各种动作的关键。
在这里插入图片描述

4.首先为小狐狸添加刚体,然后为小狐狸和陆地添加碰撞体。小狐狸添加碰撞体和tilemap不同。

刚体是指Rigidbody 2D组件,使纸片一样的角色变成实际的物体,拥有物理的效果,如重力、阻力等。
在这里插入图片描述

小狐狸使用这个,这个是以一个盒子状的正方形为碰撞面积,可以通过edit collider调整碰撞面积大小。
在这里插入图片描述
瓦片地图使用这个,是以瓦片地图的所有像素单元格为碰撞面积。
在这里插入图片描述
5.通过以上组件,小狐狸可以成功掉落在地面上了
在这里插入图片描述

04角色移动

1.操作游戏需要使用键盘上的按键,玩家可以在Edit-Project Settings-Input-Axes中查看或更改自己的操作按键。使角色移动即获取玩家输入的按键,然后根据按键功能编辑角色对应的移动操作。这里就需要写脚本了。
2.新建组件New Script,使用C#语言,可以建个文件夹专门用来放代码。
在这里插入图片描述
3.代码里有两个函数,start()是在游戏开始时运行的代码,update()是游戏在运行过程中每一帧更新变化中都运行的代码。
(1)首先创建两个变量,一个是刚体,一个是速度,command+s保存。
(2)新建一个移动函数,movement(),在update()中调用,获得玩家横向输入的按键结果,用变量horizontalmove保存,当玩家摁下d,其结果等于1,摁下a时等于-1,角色不横向移动时为0。设置刚体的速度变化为矢量值。
(3)将rigidbody 2D中的constraints中的z轴冻结,小狐狸可以移动了。
在游戏运行过程中更改代码或者属性是不会进行保存的,如果想保存更改的调试,可以通过下面操作进行,即复制粘贴组件。
在这里插入图片描述

代码:

public class NewBehaviourScript1 : MonoBehaviour
{
    public Rigidbody2D rb;
    public float speed;
    public float jumpforce;

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

    }

// Update is called once per frame,不是所有电脑能达到60帧/s的运行速度,fixedupdate可以很好适应不同电脑上的运动效果,使其更加平滑,不跳帧。
    void FixedUpdate()
    {
        Movement();
    }

    void Movement()
    {
        float horizonalmove = Input.GetAxis("Horizontal");
        float facedirection = Input.GetAxisRaw("Horizontal");

        if (horizonalmove != 0)
        {
            rb.velocity = new Vector2(horizonalmove * speed * Time.deltaTime, rb.velocity.y);//Time.deltaTime乘以他的物理时钟的运行百分比,可以使在不同设备上运行平滑不跳帧
        }

        if (facedirection != 0)
        {
            transform.localScale = new Vector3(facedirection, 1, 1);
        }

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
        }
    }
}

05角色方向&跳跃

1.调整角色方向的方法和角色移动相似,只是需要改变小狐狸变量scale,代码如上。
2.跳跃
(1)新建一个跳跃力的变量public float jumpforce;
(2)如果用户按下跳跃键,Input.GetButtonDown(“Jump”),就将刚体的速度(移动)变成矢量,x的值不变,y轴值变为跳跃力,调整跳跃力的大小,这样小狐狸就可以跳啦。在这里插入图片描述

06动画效果Animation

主要实现小狐狸的站立移动动画效果
简单方法:在我们的Animation文件夹新建一个Animation,然后将其拖拽到小狐狸上即可。
1.首先为小狐狸创建动画控制器,添加动画控制组件Animator。
2.Animator需要一个Controller,我们在我们的Assets资源中建立一个文件夹专门用来放所有的动画,然后新建一个Animator Controller,起名叫Player,将其拖拽到组件Animator中。Animator可以控制小狐狸的动画了。
在这里插入图片描述
在这里插入图片描述
2.然后为小狐狸创建站立动画,选择Window-Animation-Animation,会出现一个时间轴,然后就可以创建动画了,先选择Player,点击Animation中的新建,创建原地站立动画idle,记得将素材中的图片改为每单元格16个像素值大小,可以调整采样频率改变动画速度。在这里插入图片描述
3.为小狐狸新建跑动动画,先选择小狐狸,然后新建动画,操作如上图。
在这里插入图片描述
4.控制两个动画之间的切换,添加剪头,箭头上可以设置切换的条件。设置参数running,用来作为判断切换动画的条件,新建浮点型参数running用来判断小狐狸是否在跑动。设置小狐狸由站立到跑动的切换条件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.怎样才能控制参数的变化呢?这要通过写小狐狸的脚本代码来实现。先获取动画控制animator,然后在角色移动中过程中设置animator的参数值。小狐狸就可以跑起来了。

1.private Animator animator;//获取动画组件

2.
       //角色移动,实现小狐狸由站立动画变成跑动动画
        if (horizonalmove != 0)
        {
            rb.velocity = new Vector2(horizonalmove * speed * Time.deltaTime, rb.velocity.y);
            //Time.deltaTime平滑不跳帧
            animator.SetFloat("running", Mathf.Abs(facedirection));//设置动画参数
        }

07跳跃下落动画&LayerMask

1.在Animation下拉菜单中创建jump动画,然后在Animator中设置动画之间的关系。从站立过程动画变成跳跃动画,设置参数jumping,Bool型,用来作为切换的条件。然后在小狐狸的脚本中写上变成跳跃的逻辑。
在这里插入图片描述

       //角色跳跃
        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
            animator.SetBool("jumping", true);
        }

2.为小狐狸创建下落动画,基本操作如上,但是需要判断小狐狸是否接触到了地面,所以要获取表示小狐狸碰撞体的变量和表示地面的变量LayerMask(LayerMask表示图层蒙版),这就要为我们的地面单独创建一个Layer,并将其值赋给表示地面的变量。
在这里插入图片描述
在这里插入图片描述
代码如下图:

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

public class NewBehaviourScript1 : MonoBehaviour
{
    private Rigidbody2D rb;
    private Animator animator;
    public Collider2D coll;
    public float speed;
    public float jumpforce;
    public LayerMask ground;
    public int Cherry;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    // fixedupdate可以很好适应不同电脑不同帧数的运行效果,使其平滑不掉帧
    void FixedUpdate()
    {
        Movement();
        SwithAnim();
    }

    void Movement()
    {
        float horizonalmove = Input.GetAxis("Horizontal");
        float facedirection = Input.GetAxisRaw("Horizontal");//使用Raw可以只取整数

        //角色移动
        if (horizonalmove != 0)
        {
            rb.velocity = new Vector2(horizonalmove * speed * Time.deltaTime, rb.velocity.y);
            //Time.deltaTime平滑不跳帧
            animator.SetFloat("running", Mathf.Abs(facedirection));//设置动画师参数
        }

        if (facedirection != 0)
        {
            transform.localScale = new Vector3(facedirection, 1, 1);
        }

        //角色跳跃
        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
            animator.SetBool("jumping", true);
        }
    }

    void SwithAnim()
    {
        animator.SetBool("idle", false);
        if (animator.GetBool("jumping"))
        {
            if (rb.velocity.y < 0)
            {
                animator.SetBool("jumping", false);
                animator.SetBool("falling", true);
            }
        }else if (coll.IsTouchingLayers(ground))
        {
            animator.SetBool("falling",false);
            animator.SetBool("idle", true);
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Collection")
        {
            Destroy(collision.gameObject);
            Cherry += 1;
        }
    }
}

08修复移动错误

1.由于小狐狸使用的是Box Collider 2D,盒子碰撞器是的判定是位置上一个矩形,而矩形大小、位置信息全部都是用浮点数,浮点数的运算就有精度问题,例如多了0.0001,然后判定为有一点点的高度差,矩形没弧度,没法像圆球一样滚动着过去、也没法滑动过去(假定存在润滑),所以会卡住,这里要给小狐狸的下半身添加一个圆形碰撞器,就可以解决这个问题了。
在这里插入图片描述
在这里插入图片描述
2.将小狐狸脚本中的变量声明类型由public改为private可以将变量隐藏,然后在start()函数中赋给private类型变量的值即可。
3.在unity官网中有很多中文文档,教程视频可供学习,官网地址:unity.cn

09镜头控制Cinemachine

1.比较简单的方法。让Main Cemera的镜头position的x和y和小狐狸的保持一致即可。在cemera中创建一个脚本,代码如下:

public class CemeraControl : MonoBehaviour
{
    public Transform player;
    void Update()
    {
        transform.position = new Vector3(player.position.x, 0, -10f);//cemera的轴默认是-10f
    }
}

2.比较好用的方法。点击Window-Package Manager-Cinemachine进行安装,安装完成后点击Cinemachine-Create 2D Cemera,新创建的CM vcam1会替代掉原本的Main Cemera。将小狐狸赋值给CM vacm1的follow变量,然后调整参数即可控制镜头。
将背景拉长
在这里插入图片描述
在这里插入图片描述
3.解决镜头跳出背景的问题,选择CM vacm1的添加扩展Cinemachine Confiner(限制),可以看出它需要一个Bounding Shape 2D,那么就为我们的背景添加个多边形碰撞体,作为Cinemachine的限制区域,记得将背景的碰撞体调为触发器形式,将其拖拽到CM vacm1中即可。
在这里插入图片描述
在这里插入图片描述

10物品收集&Prefabs

1.新建樱桃的Sprite,然后将chrry的图片渲染成2D模型,将cherry的Sorting Layer图层设置到前面,为cherry创建一个Animator,然后在资源中新建一个文件夹用来管理收集物品的动画,在其中创建文件夹cherry,新建一个Animator Controller,将其拖拽到Animator中,然后点击cherry,新建动画即可。
2.为cherry添加碰撞体,并设置为触发器形式,当小狐狸碰到cherry时,樱桃消失,并记录个数。
在这里插入图片描述
3.为cherry添加标签collection,并将其碰撞器设置为is trigger,如果另一个碰撞器2D进入了触发器,则调用OnTriggerEnter2D。小狐狸脚本中代码如下:

public int Cherry;
...
private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Collection")
        {
            Destroy(collision.gameObject);
            Cherry += 1;
        }
    }

4.在资源库中新建一个Prefabs文件夹,即预制文件夹,将cherry、Player拖进来即可作为一个模板,方便下次使用。
5.command+d可以快速复制,可用来复制多个樱桃。
6.速度speed乘以Time.deltaTime可以保证在不同性能、帧率的电脑上保持同样的最终运行速度。
7.为了使页面更加好看,可以添加多个图层。
8.添加一棵树或房子到场景中。首先在Hierarchy结构中新建一个Create Empty空的分类,命名为Environment,将房子拖到这个分类中,选择它对应的图层即可。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值