

创建Roguelike随机地下城(三)
M STUDIO
Unity 价值专家|零基础入门砸门人|毕设拯救者
阅读 4065
2020年2月10日
创建墙壁、地面、主角、相机移动!
文章内容主要包括代码部分(仅在Connect请收藏),图片说明。详细的 Tilemap 的绘制请大家留移步B站观看视频:
https://www.bilibili.com/video/av87865722 https://www.bilibili.com/video/av87865722
首先奉上视频中使用的素材,素材原作者网站:
https://elthen.itch.io https://elthen.itch.io
很多小伙伴网络原因无法登陆或下载,介于作者免费提供用素材用于学习,所以在这里提供下载,请大家尊重作者:
首先创建Tilemap的部分:
我们会为15种房间开门的墙壁分别绘制 Tilemap ,为了保证多个房间的墙壁重合时不会穿帮,我们会在四角留有额外重合部分

留意墙壁及Tilemap添加的Component
别忘记Sorting Layer设置比“门”高1层。Tilemap添加了Tilemap Collider 2D之后,额外添加Composite Collider 2D将碰撞体合为一体。注意:会自动添加Rigidbody 2D,所以将Body Type改成Static,避免墙壁掉出屏幕~
复制Gird的部分,然后粘贴在其他所有的Walls的Prefab里。
同样的方法我们也要绘制好我们的Ground,同时添加“门”的素材:

也要保证门的位置在多个房间重叠时不穿帮
为房间添加一个边界 RoomArea 并添加 Box Collider 2D 可以刚好是房间之间的位置尺寸。
创建人物及代码:
素材切割及动画创建就不赘述了,请看视频。主要留意Top down俯视角人物的碰撞体应该在脚下的位置:

Rigidbody 的 Gravity Scale 改成0
人物移动及动画切换的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rb;
Animator anim;
public float speed;
Vector2 movement;
void Start()
{
rb = GetComponent();
anim = GetComponent();
}
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
if (movement.x != 0)
{
transform.localScale = new Vector3(movement.x, 1, 1);
}
SwitchAnim();
}
private void FixedUpdate()
{
rb.MovePosition(rb.position + movement * speed * Time.fixedDeltaTime);
}
void SwitchAnim()
{
anim.SetFloat("speed", movement.magnitude);
}
}
最后我们来做相机的跟随
思路:相机应该在人物移动到下一个房间时,切换到对应房间的坐标位置。所以我们用之前创建的房间的 RoomArea 来判断人物碰撞表示进入房间,创建相机代码并挂在在 Main Camera 上:
using UnityEngine;
public class CameraController : MonoBehaviour
{
public static CameraController instance;
public float speed;//相机移动速度
public Transform target;//目标坐标
private void Awake()
{
instance = this;
}
void Update()
{
if (target != null)
transform.position = Vector3.MoveTowards(transform.position, new Vector3(target.position.x, target.position.y, transform.position.z), speed * Time.deltaTime);
}
public void ChangeTarget(Transform newTarget)//函数方法在Room中判断碰撞进入后调用
{
target = newTarget;
}
}
所以在房间的 Prefab 上挂载的 Room 脚本里添加碰撞的判断:
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
CameraController.instance.ChangeTarget(transform);
}
}
切记不要忘记给 Player 添加对应的标签哦!
最终效果:
内容详情,请关注B站视频讲解~
发挥你的创意,构建属于你的随机地下城吧~谢谢大家记得收藏哦~
发布于技术交流
24条评论

问
AI
全新AI功能上线
1. 基于Unity微调:专为Unity优化,提供精准高效的支持。
2. 深度集成:内置于团结引擎,随时查阅与学习。
3. 多功能支持:全面解决技术问题与学习需求。

问
AI