Unity 社区
101
24

创建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
很多小伙伴网络原因无法登陆或下载,介于作者免费提供用素材用于学习,所以在这里提供下载,请大家尊重作者:
Tileset + Player.zip
38.0 KB
首先创建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