unity制作映射小地图

  刚开始敲代码就在制作小地图,现在还在制作小地图,不过区别在于以前看不懂,现在能看懂了。不说了,说多了都是泪。今天就记录一下制作小地图的过程。
 一、场景位置
  根据我的理解,场景要放在坐标系的区域内,不要放在坐标轴上,否则计算会很容易把自己搞蒙。
在这里插入图片描述

 二、放置参照物
  就如我们一中那张图,我们把模型放在左上角的区域,本来我们应该用模型的地面的坐标来计算,但是因为有时候建模的不规范,地面的坐标中心不一定是规规矩矩的,所以一劳永逸,我们就放置一个参照物。上图中的小圆圈就是我们的参照物。而玩家是在方框内移动。
 三、计算玩家在场景中的位置
  我们把玩家叫做player,参照物叫做minimapOrigin,地面叫做realMap。我们先获取地面的长宽,然后用玩家的坐标减去参照物的坐标,再除以地面的宽高,就能够分别得到玩家在地面上的位置。

  widthRate = (player.position.z - minimapOrigin.position.z) / realMapWidth;
  heightRate = (player.position.x - minimapOrigin.position.x) / realMapHeight;

 四、摆放小地图
  我们在UI上创建一个小地图的UI,然后在创建一个子节点当作玩家。因为我们的参照物在地面的右下角,所以我们把玩家的锚点也设置在右下角,方便计算。
在这里插入图片描述
在这里插入图片描述
 五、映射玩家位置
  我们把刚才得到的玩家在地面的位置比率乘以小地图的长宽,然后赋值给小地图上玩家节点,就能在小地图上看到玩家当前所在的位置了。

 playerIcon.anchoredPosition = new Vector2 (-minimap.rect.width * widthRate, minimap.rect.height * heightRate);

 六、设置小地图玩家的方向
  在静止时,计算3D场景中玩家Y轴和小地图上玩家图标Z轴的角度差,通过换算,就能设置小地图上玩家图标的方向了。

 playerIcon.rotation = Quaternion.Euler (0, 0, 180 - player.localEulerAngles.y);

 七、详细代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MiniMapController : MonoBehaviour {

    [SerializeField, Tooltip ("小地图的实物原点参照物")]
    private Transform minimapOrigin = null;

    [SerializeField]
    private Transform realMap = null;

    [SerializeField]
    private Transform player = null;

    [SerializeField]
    private RectTransform minimap = null;

    [SerializeField]
    private RectTransform playerIcon = null;

    private float realMapWidth = 0;

    private float realMapHeight = 0;

    private float widthRate = 0;

    private float heightRate = 0;

    // Start is called before the first frame update
    void Start () {

        realMapWidth = realMap.GetComponent<MeshRenderer> ().bounds.size.z;
        realMapHeight = realMap.GetComponent<MeshRenderer> ().bounds.size.x;

    }

    // Update is called once per frame
    void Update () {
        UpdateMinimapMod ();
    }

    private void UpdateMinimapMod () {
        widthRate = (player.position.z - minimapOrigin.position.z) / realMapWidth;
        heightRate = (player.position.x - minimapOrigin.position.x) / realMapHeight;

        playerIcon.anchoredPosition = new Vector2 (-minimap.rect.width * widthRate, minimap.rect.height * heightRate);

        playerIcon.rotation = Quaternion.Euler (0, 0, 180 - player.localEulerAngles.y);

    }
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值