Unity 2D 地图Demo的创建

目录

资源包下载

创建地图

地面素材切割成块,铺路

创建调色板

铺路

小池子的构造

把树添加到场景中

为树添加碰撞体

场景构造效果

游戏角色导入

添加刚体和碰撞体

勾选冻结旋转

创建PlayerControl.cs

用刚体移动可以消除画面抖动

摄像机跟随

摄像机跟随范围调整

设置遮挡效果

设置不可通行的区域

对碰撞区域进行优化

消除蓝色的边界外视野,将视野局限于地图内

游戏动画的实现

建立一个动画状态集

参考课程案例设计 一 2D 游戏场景、玩家角色、敌人角色等。利用脚本控制角色运动和角色动画播放。 
熟悉以下操作并实现有关功能: 
1. 游戏资源导入 
2. Sprite 精灵图片编辑 
3. Tile 调色板编辑 
4. 2D 场景瓦片地图编辑 
5. 玩家角色、敌人角色编辑(刚体+碰撞体) 
6. 利用 2D 素材制作动画剪辑 
7. 角色 Animator 动画状态机编辑—混合树 
8. 玩家角色移动控制 
9. 2D 场景摄像机跟随等 

资源包下载

创建地图

 

地面素材切割成块,铺路

具体设置:

1)纹理类型 设置如上图

2)调整Sprite模式为 多个

3)每单位像素由初始值100改为64。极其重要!

4)点击上图左下角按钮,切片并保存

附:Sprite 占位符

创建调色板

笔刷

区域块

 

把元素填充到tilemap中

铺路

 

小池子的构造

选取边界的块来填充边界

效果

 

把树添加到场景中

调整tilemap图层顺序为-10,树就可以正常显示了

为树添加碰撞体

注意:

场景素材均设置为预制体

把树拖到预制体文件夹中

包括树、草、莲花,房子

调整树的碰撞盒大小后(对预制体修改后)

应用到场景的所有对象上

场景构造效果

创建一个空对象

把背景元素全部拖入到里面,方便管理

 

游戏角色导入

添加刚体和碰撞体

并把重力关闭

否则

若掉出地图,则设置重力为0

打开刚体选项 模拟

这样才能发生碰撞

不知道这是什么情况,Ruby被撞翻了...

勾选冻结旋转

即可解决

创建PlayerControl.cs

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

public class PlayerControl : MonoBehaviour
{
    public float speed = 15f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");

        Vector2 position = transform.position;
        position.x += moveX * speed * Time.deltaTime;
        position.y += moveY* speed * Time.deltaTime;

        transform.position = new Vector2(position.x, position.y);
    }
}

绑定到Ruby对象上即可

给树,房子添加碰撞盒

调整树与Ruby的碰撞盒至合适的大小

用刚体移动可以消除画面抖动

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

public class PlayerControl : MonoBehaviour
{
    public float speed = 15f;
    Rigidbody2D rbody;//定义2d刚体

    // Start is called before the first frame update
    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();//获取2d刚体
    }

    // Update is called once per frame
    void Update()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");

        Vector2 position = transform.position;
        position.x += moveX * speed * Time.deltaTime;
        position.y += moveY* speed * Time.deltaTime;

        transform.position = new Vector2(position.x, position.y);
        rbody.MovePosition(position);//用刚体移动可以消除画面抖动
    }
}

 

摄像机跟随

要安装cinemachine插件

创建2D跟随摄像头

摄像头绑定角色对象

摄像机跟随范围

(该图参数效果不太好,很奇怪)

摄像机跟随范围调整

(这个参数用着不错)

 

 

设置遮挡效果

自定义轴,改z为0,2d没有z轴,y为1

效果

 

设置不可通行的区域

给瓦片地图 tilemap 添加碰撞器

  • 添加了瓦片地图碰撞盒,却没有碰撞效果,没有被卡在原地 4/16最后一个视频 进度条:44:44(已解决)

所有瓦片碰撞器类型默认为精灵,表现为人物运动不会被阻碍

解决方法:

首先,把Ruby的碰撞检测设置成持续的,离散速度过快不够用

水池块儿碰撞器类型设置为精灵Sprite

关闭可以行走的瓦片的碰撞盒

人能走的地方,比如地砖,碰撞器设置为无

设置好后出现紫色方块

效果

对碰撞区域进行优化

添加复合碰撞器

(添加组件后自动添加刚体,中文版亦可用英文进行查找)

把多个小碰撞盒子化为一个整体进行优化

选择由复合使用

效果

  • 为啥整合之后没有阻挡的效果了?

不知道怎么回事,反正最后解决了

场景碰撞盒子设置为静态

此外,自动添加的tilemap刚体属性需要手动调整为静态

这样场景才不会下坠

  • 这是啥错误

已解决,原因是许可证过期,更新一下许可证就好了,unity许可证怎么天天都要更新,毫无人性

  • 一个bug

直行不能穿越边界,是正常的

但是直行的时候,同时按一下左右键,就可以卡过边界

原因:瓦片的碰撞盒子没有整合,中间有缝

消除蓝色的边界外视野,将视野局限于地图内

找到虚拟摄像机的扩展

添加CM视野局限器

confine v.限制

新建一个空对象

添加多边形碰撞器

编辑边界

设置多边形边界为地图边界

绑定边界对象

调整CM视野碰撞体为触发器

以免人物被挤出地图

效果

运动到边界时,视野被局限在地图内

(markdown:上一个方块双回车,再删除)

游戏动画的实现

主角各种角度各种状态的动画

建立动画文件夹

一同选定一组图片作为动画的4帧,拖到对象栏上

作为一个对象放到动画文件夹下

动画文件夹出现以下两个文件

选择三角形文件

看到右下角这一栏

把它往上拉

把Ruby对象拖入才能播放

动画播放速度略快

调整动画播放速度,双击三角形打开

12->4 帧

  • 为啥我的面板没有采样

窗口时间轴那一行最右边有三个点
点一下,show sample rate

调整跑动方向

把动画移动至Ruby属下,添加属性键亮起(原为灰且无法操作)

增加翻转的属性,让其向右跑,沿着x轴水平翻转

记得勾选这个,才能翻转

把运动状态的上下左右的动画都绑定在ruby上,还有静止的上下左右一并绑定上

共4*2种状态

 

建立一个动画状态集

以确保动画与运动状态一致

Ruby动画集绑定到Ruby对象上

双击打开

建立一个静止状态树idle,建立一个跑步状态树run

双击进入idle,添加4个运动

添加参数

修改混合树类型

设定参数

修改参数

把参数与运动状态关联起来

同理,添加跑动状态

添加状态转换

 

 

单击

状态转换条件

速度大于0.1跑动

速度小于0.1静止站立

 

绑定动画状态集,添加到ruby组件上

修改speed->runspeed

发生重名

修改脚本

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

public class PlayerControl : MonoBehaviour
{
    public float speed = 15f;
    Rigidbody2D rbody;//定义2d刚体
    Animator anim;//定义动画
    Vector2 lookDirection = new Vector2(1, 0);//初始向x看

    // Start is called before the first frame update
    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();//获取2d刚体
        anim = GetComponent<Animator>();//获取动画组件
    }

    // Update is called once per frame
    void Update()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");

        Vector2 moveVector = new Vector2(moveX, moveY);

        if(moveX!=0||moveY!=0)
        {
            lookDirection = moveVector;
        }

        Vector2 position = transform.position;
        position.x += moveX * speed * Time.deltaTime;
        position.y += moveY * speed * Time.deltaTime;

        transform.position = new Vector2(position.x, position.y);
        rbody.MovePosition(position);//用刚体移动可以消除画面抖动

        anim.SetFloat("move X",lookDirection.x);//为动画集赋值
        anim.SetFloat("move Y",lookDirection.y);
        anim.SetFloat("runspeed", moveVector.magnitude);//状态集的切换由运动矢量决定
        //赋值必须与状态集命名一样
    }
}

效果

成功实现8种状态

(未完待续,点击此处跳转)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值