Unity2D入门—Sprout Lands (类星露谷物语)
第一章 角色移动及地图搭建
文章目录
前言
五一假期玩了一段时间星露谷物语,突发奇想想做一个类似星露谷物语的休闲游戏(主要是摆了好长时间了hhh)。为此,作者找了很多素材,奈何都不尽人意。然后就在B站上看到看到一个名为《Sprout Lands》的类星露谷物语游戏的素材符合作者的心里预期,于是乎就去 itch.io 上找到了大佬的素材,发现居然提供免费一部分的素材,当然想用到所有素材就得使用超能力了,但是毕竟作者只是为了学习而已,就使用了免费的素材,感谢上天的馈赠。(PS:本来想用米家游戏的素材的,但没有找到,并且作者对于像素画一点经验都没有,大哭)
一、角色移动
1.创建项目
做游戏的第一步就是创建项目,做好一切准备工作,至于安装的相关事宜,请看我的Pixel Adventure 1实战的开头部分。创建好后我们再创建Scripts、Prefabs、Animation以及Video这几个文件夹用于存放脚本、预制体、动画以及音频等素材。
2.素材分割
当拿到素材的时候,我是一脸懵的,和Pixel Adventure 1的素材不同,Sprout Lands的素材没有提前分割好,还得我们自己来分割。然后,查了资料发现,Unity可以使用Sprite Editor的自动分割的方法。这里有几个参数需要说一下,首先就是 Pixels Per Unit 这个参数是我们分割时每一个角色的大小,是创作者在绘制的时候就确定的,比如Sprout Lands的大小就是16x16的;接着就是 Sprite Mode,根据 Unity手册 如果分割图像包含多个对象的话,需要将Sprite Mode改为Multiple;然后就是 Filter Mode, 我们需要将其改成Point(no filter), 由于我们是做的像素游戏,那么就不需要使用 Bilinear 和 Trilinear 这两个会使图像变得平滑的插值方法;最后就是 Compression , 这个参数会压缩图像,坏处就是降低视觉质量。
至于将图像分割出来的方法就很简单了,只需要点击Sprite Editor,然后点击Slice中的Slice就可以完美分割啦。
3.创建动画
这里我们总共需要创建8个动画,静止和运动各4个。静止动画包括:静止朝下(Idle_Down)、静止朝上(Idle_Up)、静止朝左(Idle_Left)、静止朝右(Idle_Right)。运动动画包括:朝下运动(Move_Down)、朝上运动(Move_Up)、朝左运动(Move_Left)、朝右运动(Move_Right)。最后将所有动画放入Animation文件夹中。
4.混合树(BlendTree)
BlendTree是Animator中的一种特殊状态类型,允许通过不同程度地合并多个动画来实现动画的平滑混合。这里有人就要问了,为什么不直接使用Animator进行动画切换非要使用BlendTree?其实,用一张图就可以说明关键所在。下面这张图是作者之前一个项目的Animator,一眼看上去线很多、很乱,而这就是关键所在。试想一下,如果再多几个动画的话,估计找线都要找半天。
而下面这张图,则是作者使用了BlendTree之后的的Animator,明显看出简洁了很多。
使用BlendTree还有以下这些优点:
1、平滑过渡 混合树允许你根据一个或多个参数(如速度、方向等)来平滑地混合多个动画片段。这种混合可以产生更自然、更流畅的动画过渡效果,比直接使用状态机进行动画切换更加平滑。
2、灵活性 混合树允许你对动画的混合进行精细控制,通过调整权重和过渡曲线等参数,可以实现更细致、更复杂的动画效果。而状态机则更侧重于描述对象在不同状态之间的转换逻辑,对于动画本身的控制较为有限。
3、动态性 混合树可以根据游戏运行时的情况动态地调整动画的混合效果。例如,角色的移动速度、转向角度等参数可以在游戏过程中实时改变,混合树会根据这些参数的变化来实时更新动画的混合效果。这使得混合树能够适应更多的游戏场景和需求。
4、复杂性管理 在复杂的动画系统中,直接使用状态机可能会导致状态之间的转换逻辑变得复杂且难以管理。而混合树可以通过将多个动画片段组合在一起,形成一个统一的动画控制单元,从而简化动画系统的设计和实现。
5、重复利用 混合树中的动画片段可以被多个不同的混合树所复用,从而提高了动画资源的利用率。而状态机中的状态通常与特定的对象或行为相关联,难以实现动画资源的重复利用。
总地来说,BlendTree能提供更高级别的动画控制和更自然的过渡效果,使得在Unity中创建复杂、自然的动画效果变得更加容易和高效。 因此,在需要创建高质量动画效果的游戏开发中,使用混合树是一个很好的选择。
5.混合树的使用
首先,在Animator中右击Create State - > From New Blend Tree,创建两个混合树,一个是Idle混合树,另一个是Move混合树,图如上所示。接着我们需要创建几个参数,horizontal和vertical(int, 用于获取水平和垂直按键参数) 、isMove(bool, 用于Idle和Move切换) 。
接着,我们选择的Blend Type (混合类型) 为 2D Simple Directional (这是根据需要混合动画的性质决定的,具体要求 参考) ,对于Parameters参数第一个参数选择vertical、第二个参数选择horizontal,这是由于在添加动画时获取的参数第一个是X轴的参数、第二个是Y轴的参数。在Motion属性中 ( 混合树的子节点,代表要混合的动画片段),点击 + - > Add Motion Field创建4个 运动场(Motion Field) ,并将对应的动画拖入Motion属性中,并根据对应的按键参数设置对应的参数,第一张是静止动画混合树,第二张是运动动画混合树。
6.混合运动脚本
这里大部分的代码都很好理解,主要介绍一下 direction.magnitude > 0,这一部分主要是用于判断静止和运动的,表示的是矢量坐标到原点距离,无参数(静止)输入时direction.magnitude 应该为0,反之则是运动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CatMovement : MonoBehaviour
{
[SerializeField] private float speed = 3;
private Animator anim;
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");
Vector2 direction = new Vector2(x, y);
if(direction.magnitude > 0) //magnitude返回矢量坐标到原点距离
{
anim.SetBool("isMove", true);
anim.SetFloat("horizontal", y);
anim.SetFloat("vertical", x);
}
else
{
anim.SetBool("isMove", false);
}
transform.Translate(direction * speed * Time.deltaTime);
}
}
二、地图搭建
1、地图资源分割(以grass资源为例)
参数设置如下图所示,在Sprite Editor中的操作比较重要,Slice类型选择Grid By Cell Size, 而Pixel Size根据作者给出的参数为16x16大小。最后,将分割获得的Palettle全部保存到Palettle文件夹中。
2、分层搭建
创建地图时采用分层设计的主要原因:分层使得开发者可以将不同类型的元素(如背景、地面、障碍物、道具等)分别放置在不同的层上,从而实现独立的控制和交互。
我们将地图分为以下几个图层:Env_Background、Env_Ground_Bottom、Env_Ground_Top、Env_Building、Interactable(可交互的)、Game
这里我们将Default默认为Env_Background,接着将各个图层的Tilemap创建出来
Env_Background: 水面 、Env_Ground_Bottom: 草地、漂浮物 、Env_Ground_Top: 悬崖、围栏
效果如下图所示,图中用到的基本都是贴图,不涉及交互的相关内容。
总结
这一章只是对项目的地图贴图部分以及人物简单移动操作做了规划和设计,交货什么的等下面几章再做,估了好久了,希望能在暑假把这个项目做完把。(对于地图设计,参照原游戏的地图还原了一部分)