一、创建项目
模板:2D 核心模板
二、导入素材
从Package manager导入素材:M Farm RPG Assets Pack
素材设置:
Sprite Mode:Multiple
Pixels Per Unit:20
Filter Mode:Point(no filter)
Compression:None
将图片设置作为一个预设:设置按钮 - Save current to... - 选择文件夹 - 创建。
使用预设:设置按钮 - Select Preset - 选择预设
素材切割:
Sprite Editor - Slice - 选择类型 - 选择Method - Slice - Apply
三、创建Player
创建父物体Player - 创建子物体Shadow、Body、Hair、Arm - 在Player中添加Sorting Group
设置为Y轴渲染:
Edit - Project Settings - Graphic -
如图设置
四、实现Player基本移动
创建Player代码和变量
创建Movement实现俯视角四方向移动
using UnityEngine;
public class Player : MonoBehaviour
{
private Rigidbody2D rb;
public float speed;
private float inputX, inputY;
private Vector2 movementInput;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
PlayerInput();
}
private void FixedUpdate()
{
Movement();
}
private void PlayerInput()
{
//if(inputY == 0) 取消斜方方向移动
inputX = Input.GetAxisRaw("Horizontal");
//if(inputX == 0) 取消斜方方向移动
inputY = Input.GetAxisRaw("Vertical");
//斜方向速度
if(inputX != 0 && inputY != 0)
{
inputX = inputX * 0.6f;
inputY = inputY * 0.6f;
}
movementInput = new Vector2(inputX, inputY);
}
private void Movement()
{
rb.MovePosition(rb.position + movementInput * speed * Time.deltaTime);
}
}
五、创建基本地图结构
设置Tilemap
制作Template Scene 用于在场景中加载不同地图
六、幻想乡地图考据
【东方project】幻想乡柱状地图阅读指南 - 哔哩哔哩 (bilibili.com)
MineCraft幻想乡 - THBWiki · 专业性的东方Project维基百科 - TBSGroup (thwiki.cc)
七、摄像机设置
添加Cinemachine - 设置2D Camera跟随 - 调整Cinemachine设置
添加Pixel Perfect相机设置比例 320*180
创建Sprite Atlas - 放入图片素材 - 避免缝隙
添加Cinemachine Confiner扩展工具
添加Bounds并设置Polygon Collider2D边界
添加代码让 Cinemachine 或者跨场景的边界 Bounds
private void SwitchConfinerShape()
{
PolygonCollider2D confinerShape = GameObject.FindGameObjectWithTag("BoundsConfiner").GetComponent<PolygonCollider2D>();
CinemachineConfiner confiner = GetComponent<CinemachineConfiner>();
confiner.m_BoundingShape2D = confinerShape;
//Call this if the bounding shape's points change at runtime
confiner.InvalidatePathCache();
}
八、景观树制作
创建父物体Tree - 创建子物体Top、Trunk - 在Trunk中添加Collider 2D - 在Top中添加Animator制作树叶晃动动画 - 在父物体Tree中添加Collider2D - 将物体保存成Prefab
九、实现景观物体遮挡半透明
添加DOTween插件
物体添加如下代码
using UnityEngine;
using DG.Tweening;
[RequireComponent(typeof(SpriteRenderer))]
public class ItemFader : MonoBehaviour
{
private SpriteRenderer spriteRenderer;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
/// <summary>
/// 逐渐恢复颜色
/// </summary>
public void FadeIn()
{
Color targetColor = new Color(1, 1, 1, 1);
spriteRenderer.DOColor(targetColor, Settings.fadeDuration);
}
/// <summary>
/// 逐渐半透明
/// </summary>
public void FadeOut()
{
Color targetColor = new Color(1, 1, 1, Settings .targetAlpha);
spriteRenderer.DOColor(targetColor, Settings.fadeDuration);
}
}
Player添加如下代码
public class TriggerItemFader : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
ItemFader[] faders = other.GetComponentsInChildren<ItemFader>();
if(faders.Length > 0)
{
foreach(var item in faders)
{
item.FadeOut();
}
}
}
private void OnTriggerExit2D(Collider2D other)
{
ItemFader[] faders = other.GetComponentsInChildren<ItemFader>();
if (faders.Length > 0)
{
foreach (var item in faders)
{
item.FadeIn();
}
}
}
}
Settings代码:
public class Settings
{
public const float fadeDuration = 0.35f;
public const float targetAlpha = 0.45f;
}