Featured image of post 麦田物语开发日记(一)

麦田物语开发日记(一)

2D俯视角游戏麦田物语基础素材整理

素材整理

将图片设置设置为预设值

将一个图片设置好需要的样式后,点击

image-20221118223955310

将该样式进行保存,然后可以应用于其他图片

导入人物素材

为了保证角色的图层属于同一个类别,因此我们需要在一个父物体中设置Sort Group用于归类所有的需要渲染的图层。

由于是2D游戏有图层之间的关系,因此需要设置一个单独的渲染图层,在edit layer中新增一个新的sort layer,将sort Layer设置为Instance表示所有和人物有关的渲染都用该图层,并将所有的内容实例相关的sort layer都设置该图层

父物体

子物体

注意需要将所有的内容的渲染的参考点Sprite Sort Point设置为Pivot,这样才能保证覆盖的正确性。

设置图层覆盖条件

在Unity中默认以Z轴为渲染覆盖的判定,由于在2D俯视角游戏中没有z轴的概念,因此采用y轴作为判断覆盖的条件(即某个GO的y轴大于另一个GO的y轴的位置,即可以实现图层的覆盖)

因此需要在edit -> project setting-> graphics->transparency Sort Axis中将x和z设置为0,y设置为1,同时向mode设置为CustomAxis 即可实现。

实现人物的移动

为人物添加碰撞体和刚体(注意俯视角的游戏 重力一定要设置为0)

人物的移动方向可以通过input.getAxis的方式获得,而具体的方向需要通过x轴和y轴进行组合。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
private void PlayerInput(){
    _inputX = Input.GetAxis("Horizontal");
    _inputY = Input.GetAxis("Vertical");

    // 添加移动方向
    // 限制按下两个方向键的时候的移动速度(防止斜方向的速度快于单一方向移动速度)
    if (_inputY != 0 && _inputX != 0){
        _inputX = _speedLimit * _inputX;
        _inputY = _speedLimit * _inputY;
    }
    _movementInput = new Vector2(_inputX, _inputY);
}

具体的移动方式在2D横板游戏中是给rigid body添加一个力,但在俯视角的游戏中通常是获得当前坐标,加上方向坐标 * 移动速度

1
2
3
4
private void Movement(){
    // 乘以deltaTime是为了修正在不同设备上的差距
    _rb.MovePosition(_rb.position + _movementInput * speed * Time.deltaTime);
}

两个方法的调用

1
2
3
4
5
6
7
private void Update(){
    PlayerInput();
}
// 由于FixedUptda是固定时间更新一次,因此不同帧数也会有相同的内容
private void FixedUpdate(){
    Movement();
}

绘制地图

  • 首先为需要执行的内容绘制对应的图层,比如多层的地面,水沟,土地等

image-20221120235626249

sorting layer用于处理所有渲染的顺序关系,其中越靠后的物体优先级越高,越后渲染(在2D图层中,也就会在低优先级图层的上方)

layers用于处理所有和碰撞和相机射线(是否被相机所显示,以及遮挡剔除效果)有关的内容

  • 通过设置一个不变的场景来避免每次切换场景都重新生成数据

新建一个场景,然后将场景直接拖入主场景的hierachy面板中,并删除其camera,然后将对应的地图结构存储进入新的场景

image-20221121000306105

这样我们就能始终用不变的人物信息和摄像头来控制场景

此时可以将该场景作为一个模板数据,这样就可以创建多个不同的地图,完成不同场景的切换效果。

  • 为tile maps设置调色盘

点击tile map后,选择image-20221121001227280

创建一个新的调色盘,然后将所有被切割好的素材拖拽进入调色盘中,就可以通过调色盘对地图进行绘制了,注意需要选中对应的Tile Map,该tile map需要先设置好对应的sorting layer

  • 有规律地绘制地图

创建绘制规则地图的2D->Tile -> Rule Tile 然后设置具体的绘制规则

image-20221121200156809

  • 消除2D游戏的瓦片缝隙

设置一个Sprite Atlas用于将整个地图打包为一个图片2D - Sprite Atlas, 然后将所有需要使用的素材都放入该Atlas中,并设置对应的压缩方式

image-20221121204253332

设置相机

创建Cinemachine,跟随玩家,然后再主相机中添加``设置适合于当前项目的内容image-20221121204443759

然后在CM中添加对应的Pixel Perfect Camera,

并且为CM设置合适的Dead Zoom等内容

image-20221121205209022

为瓦片地图添加碰撞

为设置的瓦片地图的Collision层添加碰撞组件Tilemap Collider 2D

同时为了保证我们添加的碰撞是一个整体,而不是独立的瓦片,因此需要添加组件Composite Collider 2D(此时会自动添加rigid body组件)

rigid body的类型改为静态,并将tilemap collider 2D修改为Used by composite,并将瓦片渲染关闭

此时即可添加对应碰撞图层,且不会显示该图层。

image-20221121223951995

设置树的预制体

在生成树的预制体,首先需要自定义一颗树,为了定义树的动画,需要将树分为树冠和树桩,此时树的父物体并不能设置sorting group,否则会导致渲染的锚点改变,而出现渲染错误。

然后单独为树冠设置动画即可。

image-20221123193458900 image-20221123193520173

动画则是将所有动画帧都放在动画序列上,在不同的时刻播放不同的树冠的图片即可

Built with Hugo
Theme Stack designed by Jimmy