Unity_____UI等比映射制作小地图

小地图的制作

小地图的制作是游戏开发中最最常见的一个小功能。平常教学视频里教的小地图的制作是 在角色的子级下再建一个camera,这种方法可扩展性比较低,而且性能上相当耗(具体怎么耗我目前太菜还不清楚原理,Emmm,以后肯定会知道的)。现在我们要用这个方法则是通过等比例的将场景地形映射到UI上。
具体代码如下:

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

public class MipMap: MonoBehaviour
{
    //小地图场景图
    Transform mipMapImage;
    //小地图中的人物位置
    Transform playerImage;
    //小地图中怪物位置
    Transform monsterImage;
    //场景中人物的位置
    Transform playerTrans;
    // 场景中怪物的位置
    Transform monsterTrans;

    //场景地形

    Transform plane;
    /// <summary>
    /// 地形宽度
    /// </summary>
    /// 
    float pWidth;
    //地形长度
    float pHeight;

    //小地图的尺寸
    Vector2 mipMapSize;
    //等比例映射后角色在小地图的位置
    Vector2 playerPos;
    //玩家相对于场景地形的坐标
    Vector3 playerLocalPos;

    //等比例映射后怪物在小地图的位置
    Vector2 monsterPos;
    //怪物相对于场景地形的坐标
    Vector3 monsterLocalPos;

    /// <summary>
    /// 旋转角
    /// </summary>
    Vector3 RotAngle;

    float pRateX, pRateY, pPosX, pPosY;
    float mRateX, mRateY, mPosX, mPosY;

    void Start()
    {
        mipMapImage = GameObject.Find("MiniMapImage").transform;
        playerImage = GameObject.Find("PlayerIcon").transform;
        playerTrans = GameObject.Find("unitychan").transform;

        monsterImage = GameObject.Find("MonsterIcon").transform;
        monsterTrans = GameObject.Find("BoxUnityChan").transform;

        plane = GameObject.Find("Plane").GetComponent<MeshFilter>().transform;
        pWidth = plane.GetComponent<MeshFilter>().mesh.bounds.size.x;
        pHeight = plane.GetComponent<MeshFilter>().mesh.bounds.size.z;
        mipMapSize = mipMapImage.GetComponent<RectTransform>().sizeDelta;



    }

    void Update()
    {
        PlayerRate();
        PlayerMipMapWave();
        MonsterRate();
        MonsterMipMapWave();


        Debug.Log(playerTrans.localEulerAngles);
    }
    /// <summary>
    /// 角色在地形上的比例
    /// </summary>
    public void PlayerRate()
    {
        playerLocalPos = playerTrans.position - plane.transform.position;
        pRateX = playerLocalPos.x / pWidth;
        pRateY = playerLocalPos.z / pHeight;

        //Debug.Log(playerTrans.position);
        //Debug.Log(plane.transform.position);


    }

    /// <summary>
    /// 角色移动与旋转
    /// </summary>
    public void PlayerMipMapWave()
    {
        pPosX = mipMapSize.x * pRateX;
        pPosY = mipMapSize.y * pRateY;
        playerPos.x = pPosX;
        playerPos.y = pPosY;
        playerImage.localPosition = playerPos;
        RotAngle = playerImage.localEulerAngles;
        RotAngle.z = 90- playerTrans.localEulerAngles.y;
        playerImage.localEulerAngles = RotAngle;



    }
    /// <summary>
    /// 怪物在场景地形下的比例
    /// </summary>
    public void MonsterRate()
    {
        monsterLocalPos = monsterTrans.position - plane.transform.position;
        mRateX = monsterLocalPos.x / pWidth;
        mRateY = monsterLocalPos.z / pHeight;

        //Debug.Log(playerTrans.position);
        //Debug.Log(plane.transform.position);


    }
    /// <summary>
    /// 怪物移动与旋转
    /// </summary>
    public void MonsterMipMapWave()
    {
        mPosX = mipMapSize.x * mRateX;
        mPosY = mipMapSize.y * mRateY;
        monsterPos.x = mPosX;
        monsterPos.y = mPosY;
        monsterImage.localPosition = monsterPos;
        RotAngle = monsterImage.localEulerAngles;
        RotAngle.z = 90 - monsterTrans.localEulerAngles.y;
        monsterImage.localEulerAngles = RotAngle;



    }
}

代码上已经注释的很清楚了,原理也很简单就是将场景和场景中的人物等比例的缩放到UI之上,其中需要注意的一点是 角色的朝向问题,这里如果直接用角色的欧拉角的话 角色的朝向会向相反的方向旋转 这里 我们采用RotAngle.z = 90 - monsterTrans.localEulerAngles.y 来解决角色的转向问题 这样角色的转向就正常了。下面贴一张效果图:
这里写图片描述
这里的小地图的Sprite并不是用这个场景等比例做的,所以会有些偏差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值