当前位置:   article > 正文

Unity 2D 地图Demo的创建_unity tile map demo

unity tile map 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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. public class PlayerControl : MonoBehaviour
  6. {
  7. public float speed = 15f;
  8. // Start is called before the first frame update
  9. void Start()
  10. {
  11. }
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. float moveX = Input.GetAxisRaw("Horizontal");
  16. float moveY = Input.GetAxisRaw("Vertical");
  17. Vector2 position = transform.position;
  18. position.x += moveX * speed * Time.deltaTime;
  19. position.y += moveY* speed * Time.deltaTime;
  20. transform.position = new Vector2(position.x, position.y);
  21. }
  22. }

绑定到Ruby对象上即可

给树,房子添加碰撞盒

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

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. public class PlayerControl : MonoBehaviour
  6. {
  7. public float speed = 15f;
  8. Rigidbody2D rbody;//定义2d刚体
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. rbody = GetComponent<Rigidbody2D>();//获取2d刚体
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. float moveX = Input.GetAxisRaw("Horizontal");
  18. float moveY = Input.GetAxisRaw("Vertical");
  19. Vector2 position = transform.position;
  20. position.x += moveX * speed * Time.deltaTime;
  21. position.y += moveY* speed * Time.deltaTime;
  22. transform.position = new Vector2(position.x, position.y);
  23. rbody.MovePosition(position);//用刚体移动可以消除画面抖动
  24. }
  25. }

 

摄像机跟随

要安装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

发生重名

修改脚本

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. public class PlayerControl : MonoBehaviour
  6. {
  7. public float speed = 15f;
  8. Rigidbody2D rbody;//定义2d刚体
  9. Animator anim;//定义动画
  10. Vector2 lookDirection = new Vector2(1, 0);//初始向x看
  11. // Start is called before the first frame update
  12. void Start()
  13. {
  14. rbody = GetComponent<Rigidbody2D>();//获取2d刚体
  15. anim = GetComponent<Animator>();//获取动画组件
  16. }
  17. // Update is called once per frame
  18. void Update()
  19. {
  20. float moveX = Input.GetAxisRaw("Horizontal");
  21. float moveY = Input.GetAxisRaw("Vertical");
  22. Vector2 moveVector = new Vector2(moveX, moveY);
  23. if(moveX!=0||moveY!=0)
  24. {
  25. lookDirection = moveVector;
  26. }
  27. Vector2 position = transform.position;
  28. position.x += moveX * speed * Time.deltaTime;
  29. position.y += moveY * speed * Time.deltaTime;
  30. transform.position = new Vector2(position.x, position.y);
  31. rbody.MovePosition(position);//用刚体移动可以消除画面抖动
  32. anim.SetFloat("move X",lookDirection.x);//为动画集赋值
  33. anim.SetFloat("move Y",lookDirection.y);
  34. anim.SetFloat("runspeed", moveVector.magnitude);//状态集的切换由运动矢量决定
  35. //赋值必须与状态集命名一样
  36. }
  37. }

效果

成功实现8种状态

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/305082
推荐阅读