目录

资源包下载

创建地图

地面素材切割成块,铺路

创建调色板

铺路

小池子的构造

把树添加到场景中

为树添加碰撞体

场景构造效果

游戏角色导入

添加刚体和碰撞体

勾选冻结旋转

创建PlayerControl.cs

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

摄像机跟随

摄像机跟随范围调整

设置遮挡效果

设置不可通行的区域

对碰撞区域进行优化

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

游戏动画的实现

建立一个动画状态集

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

资源包下载

unity接入高德地图 unity创建地图_Ruby

创建地图

unity接入高德地图 unity创建地图_unity接入高德地图_02

unity接入高德地图 unity创建地图_Ruby_03

 

地面素材切割成块,铺路

unity接入高德地图 unity创建地图_System_04

具体设置:

unity接入高德地图 unity创建地图_System_05

1)纹理类型 设置如上图

2)调整Sprite模式为 多个

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

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

unity接入高德地图 unity创建地图_Time_06

附:Sprite 占位符

创建调色板

unity接入高德地图 unity创建地图_unity接入高德地图_07

unity接入高德地图 unity创建地图_Time_08

unity接入高德地图 unity创建地图_Ruby_09

笔刷

unity接入高德地图 unity创建地图_System_10

区域块

unity接入高德地图 unity创建地图_Ruby_11

 

把元素填充到tilemap中

铺路

unity接入高德地图 unity创建地图_System_12

 

小池子的构造

选取边界的块来填充边界

unity接入高德地图 unity创建地图_Ruby_13

效果

unity接入高德地图 unity创建地图_unity接入高德地图_14

 

把树添加到场景中

unity接入高德地图 unity创建地图_Time_15

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

unity接入高德地图 unity创建地图_Ruby_16

unity接入高德地图 unity创建地图_Ruby_17

unity接入高德地图 unity创建地图_System_18

为树添加碰撞体

unity接入高德地图 unity创建地图_Time_19

注意:

场景素材均设置为预制体

unity接入高德地图 unity创建地图_Ruby_20

unity接入高德地图 unity创建地图_Time_21

把树拖到预制体文件夹中

unity接入高德地图 unity创建地图_Ruby_22

unity接入高德地图 unity创建地图_System_23

包括树、草、莲花,房子

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

应用到场景的所有对象上

unity接入高德地图 unity创建地图_unity接入高德地图_24

场景构造效果

unity接入高德地图 unity创建地图_Time_25

创建一个空对象

unity接入高德地图 unity创建地图_System_26

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

unity接入高德地图 unity创建地图_Ruby_27

 

游戏角色导入

unity接入高德地图 unity创建地图_Ruby_28

添加刚体和碰撞体

并把重力关闭

unity接入高德地图 unity创建地图_unity接入高德地图_29

unity接入高德地图 unity创建地图_System_30

否则

unity接入高德地图 unity创建地图_System_31

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

unity接入高德地图 unity创建地图_System_32

打开刚体选项 模拟

这样才能发生碰撞

unity接入高德地图 unity创建地图_Time_33

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

unity接入高德地图 unity创建地图_Time_34

勾选冻结旋转

即可解决

unity接入高德地图 unity创建地图_Time_35

创建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对象上即可

unity接入高德地图 unity创建地图_Ruby_36

给树,房子添加碰撞盒

unity接入高德地图 unity创建地图_System_37

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

unity接入高德地图 unity创建地图_Ruby_38

unity接入高德地图 unity创建地图_System_39

unity接入高德地图 unity创建地图_unity接入高德地图_40

unity接入高德地图 unity创建地图_Time_41

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

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插件

unity接入高德地图 unity创建地图_Time_42

unity接入高德地图 unity创建地图_System_43

创建2D跟随摄像头

unity接入高德地图 unity创建地图_System_44

摄像头绑定角色对象

unity接入高德地图 unity创建地图_Time_45

摄像机跟随范围

unity接入高德地图 unity创建地图_Time_46

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

摄像机跟随范围调整

unity接入高德地图 unity创建地图_Ruby_47

(这个参数用着不错)

unity接入高德地图 unity创建地图_Time_48

 

 

设置遮挡效果

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

unity接入高德地图 unity创建地图_Time_49

效果

unity接入高德地图 unity创建地图_unity接入高德地图_50

 

设置不可通行的区域

给瓦片地图 tilemap 添加碰撞器

unity接入高德地图 unity创建地图_Ruby_51

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

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

解决方法:

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

unity接入高德地图 unity创建地图_unity接入高德地图_52

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

unity接入高德地图 unity创建地图_System_53

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

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

unity接入高德地图 unity创建地图_System_54

设置好后出现紫色方块

unity接入高德地图 unity创建地图_Time_55

效果

unity接入高德地图 unity创建地图_Ruby_56

对碰撞区域进行优化

添加复合碰撞器

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

unity接入高德地图 unity创建地图_unity接入高德地图_57

unity接入高德地图 unity创建地图_System_58

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

unity接入高德地图 unity创建地图_unity接入高德地图_59

选择由复合使用

unity接入高德地图 unity创建地图_Time_60

unity接入高德地图 unity创建地图_unity接入高德地图_61

效果

unity接入高德地图 unity创建地图_System_62

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

unity接入高德地图 unity创建地图_System_63

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

场景碰撞盒子设置为静态

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

unity接入高德地图 unity创建地图_System_64

这样场景才不会下坠

  • 这是啥错误

unity接入高德地图 unity创建地图_Ruby_65

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

unity接入高德地图 unity创建地图_unity接入高德地图_66

  • 一个bug

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

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

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

unity接入高德地图 unity创建地图_System_67

unity接入高德地图 unity创建地图_Time_68

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

unity接入高德地图 unity创建地图_System_69

找到虚拟摄像机的扩展

添加CM视野局限器

unity接入高德地图 unity创建地图_Ruby_70

confine v.限制

unity接入高德地图 unity创建地图_Ruby_71

新建一个空对象

unity接入高德地图 unity创建地图_Ruby_72

添加多边形碰撞器

unity接入高德地图 unity创建地图_Time_73

unity接入高德地图 unity创建地图_Time_74

编辑边界

unity接入高德地图 unity创建地图_System_75

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

unity接入高德地图 unity创建地图_Ruby_76

绑定边界对象

unity接入高德地图 unity创建地图_Time_77

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

以免人物被挤出地图

unity接入高德地图 unity创建地图_unity接入高德地图_78

unity接入高德地图 unity创建地图_Time_79

效果

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

unity接入高德地图 unity创建地图_Time_80

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

游戏动画的实现

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

建立动画文件夹

unity接入高德地图 unity创建地图_Time_81

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

unity接入高德地图 unity创建地图_Ruby_82

unity接入高德地图 unity创建地图_unity接入高德地图_83

unity接入高德地图 unity创建地图_Ruby_84

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

unity接入高德地图 unity创建地图_Time_81

unity接入高德地图 unity创建地图_Time_86

unity接入高德地图 unity创建地图_System_87

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

unity接入高德地图 unity创建地图_Ruby_88

选择三角形文件

unity接入高德地图 unity创建地图_System_89

看到右下角这一栏

unity接入高德地图 unity创建地图_unity接入高德地图_90

把它往上拉

unity接入高德地图 unity创建地图_Time_91

把Ruby对象拖入才能播放

unity接入高德地图 unity创建地图_Time_92

动画播放速度略快

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

12->4 帧

unity接入高德地图 unity创建地图_Ruby_93

  • 为啥我的面板没有采样

unity接入高德地图 unity创建地图_Ruby_94

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

unity接入高德地图 unity创建地图_unity接入高德地图_95

unity接入高德地图 unity创建地图_System_96

调整跑动方向

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

unity接入高德地图 unity创建地图_System_97

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

unity接入高德地图 unity创建地图_Ruby_98

记得勾选这个,才能翻转

unity接入高德地图 unity创建地图_Time_99

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

unity接入高德地图 unity创建地图_System_100

共4*2种状态

 

建立一个动画状态集

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

unity接入高德地图 unity创建地图_System_101

unity接入高德地图 unity创建地图_Time_102

unity接入高德地图 unity创建地图_Ruby_103

Ruby动画集绑定到Ruby对象上

双击打开

unity接入高德地图 unity创建地图_Time_104

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

unity接入高德地图 unity创建地图_Ruby_105

unity接入高德地图 unity创建地图_Time_106

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

unity接入高德地图 unity创建地图_System_107

unity接入高德地图 unity创建地图_System_108

unity接入高德地图 unity创建地图_unity接入高德地图_109

unity接入高德地图 unity创建地图_Ruby_110

添加参数

unity接入高德地图 unity创建地图_unity接入高德地图_111

修改混合树类型

unity接入高德地图 unity创建地图_System_112

设定参数

unity接入高德地图 unity创建地图_Ruby_113

修改参数

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

unity接入高德地图 unity创建地图_System_114

unity接入高德地图 unity创建地图_Time_115

同理,添加跑动状态

unity接入高德地图 unity创建地图_Ruby_116

unity接入高德地图 unity创建地图_unity接入高德地图_117

添加状态转换

 

unity接入高德地图 unity创建地图_System_118

unity接入高德地图 unity创建地图_Time_119

 

单击

unity接入高德地图 unity创建地图_System_120

unity接入高德地图 unity创建地图_unity接入高德地图_121

状态转换条件

unity接入高德地图 unity创建地图_System_122

速度大于0.1跑动

unity接入高德地图 unity创建地图_Ruby_123

速度小于0.1静止站立

unity接入高德地图 unity创建地图_Ruby_124

 

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

unity接入高德地图 unity创建地图_System_125

修改speed->runspeed

发生重名

unity接入高德地图 unity创建地图_Ruby_126

修改脚本

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种状态

unity接入高德地图 unity创建地图_System_127

unity接入高德地图 unity创建地图_unity接入高德地图_128