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