RPG游戏-小地图系统

1.地图资源的制作

通常有三种方式:
1)实时渲染场景;
2)预渲染顶视图+润色
3)纯美术制作
这里采用第二种方式

(1)使用图片MASK方式设置小地图的蒙层,这里的Mask图片采用的是圆形的白色图片
在这里插入图片描述

(2)将地图图片放在MASK图片的节点下
在这里插入图片描述
(3)效果如下所示
在这里插入图片描述

(4)在地图下方加入一个cube与地图同宽高(需要加入碰撞体),用来后来绑定脚本记录坐标和进行坐标计算并投影在小地图。
在这里插入图片描述

2.MiniMap的脚本

(1)首先是pivot和anchor的区别:

参考文章: pivot和anchor的区别

(2)然后是localPosition和anchoredPosition方法的区别:

  1. localPosition表示的是子物体的pivot相对于父物体的pivot的坐标
  2. anchoredPosition表示的是子物体的pivot相对于anchor的坐标
  3. 3.当子物体的anchor与父物体的pivot坐标重合时anchoredPosition3D与localPosition相等
    参考文章:localPosition和anchoredPosition方法的区别
using Models;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Managers;
public class UIMiniMap : MonoBehaviour
{
    public Image minimap;
    public Image arrow;//角色箭头
    public Text MapName;
    private Transform playerTransform;
    public Collider MinimapBoundingBox;
    void Start()
    {
        InitMiniMap();
    }
    void InitMiniMap()
    {
        this.MapName.text = User.Instance.CurrentMapData.Name;
        if (this.minimap.overrideSprite == null)
        {
            this.minimap.overrideSprite = MiniMapManager.Instance.LoadCurrentMiniMap();
        }
        this.minimap.SetNativeSize();
        this.minimap.transform.localPosition = Vector3.zero;
        this.playerTransform = User.Instance.CurrentCharacterObj.transform;//获取角色对象实例
    }
    // Update is called once per frame
    void Update()//坐标转换:世界坐标->小地图坐标
    {
        float realWidth = MinimapBoundingBox.bounds.size.x;
        float realHeight = MinimapBoundingBox.bounds.size.z;
        float relaX = playerTransform.position.x - MinimapBoundingBox.bounds.min.x;//MinimapBoundingBox.bounds.min.x->碰撞体左下角的X坐标
        float relaY = playerTransform.position.z - MinimapBoundingBox.bounds.min.z;

        float pivotX = relaX / realWidth;
        float pivotY = relaY / realHeight;
        //获取玩家在小地图的中心点位置
        this.minimap.rectTransform.pivot = new Vector2(pivotX, pivotY);
        this.minimap.rectTransform.localPosition = Vector2.zero;//相对于父物体pivot的子物体pivot位置
        this.arrow.transform.eulerAngles = new Vector3(0,0, -this.playerTransform.eulerAngles.y);
        //小地图是2D坐标 标准XYZ 角色是3D坐标 绕Y旋转
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值