Unity_____UI等比映射制作小地图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a435931517/article/details/82592119

小地图的制作

小地图的制作是游戏开发中最最常见的一个小功能。平常教学视频里教的小地图的制作是 在角色的子级下再建一个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并不是用这个场景等比例做的,所以会有些偏差。

猜你喜欢

转载自blog.csdn.net/a435931517/article/details/82592119