在Unity中制作小地图有很多方法,有用Render Texture和Raw Image制作的,也有代码制作的,这里我将演示用代码制做一个简易版的小地图,效果图如下:
一、原理
在ui地图上放置一个ui(image)作为图标,检测角色位于世界的方向以及位置,按比例将方向及位置信息同步到ui相对于地图的位置并实时更新。
二、实现过程
这里我使用空物体搭载相机作为我的角色(直接将相机拖为子物体并Reset),使用Plane为地板搭建场景。
搭建好后转为2D截张图(如果你有地图图片可以在后面直接使用,这里我为了让图片贴合场景随意截图了)
创建Canvas以及小地图image,在小地图image上创建他的子物体image,这个image作为主角在地图上的位置标识。
将小地图ui上的image的sprite改为你的小地图图片素材,这里我的是截图。注意你图片的TextureType改为Sprite(2D and UI),记得点击Apply
将你小地图image的sprite改为上面的图片,之后更改主角在地图上的标识image,方法与上述相同。这里我使用自带Knob,如果你的ui可以指定方向那更好了。接下来编写脚本:
private RectTransform rect;
public GameObject player;
public GameObject Floor;
public Image playerimage;
void Start()
{
rect = this.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(Floor.transform.localScale.x, Floor.transform.localScale.z) * 100;
playerimage.rectTransform.sizeDelta = new Vector2(10, 10);
}
void Update()
{
ShowPlayer();
}
public void ShowPlayer()
{
playerimage.rectTransform.anchoredPosition = new Vector3(player.transform.position.x, player.transform.position.z, 0)*10;
playerimage.rectTransform.eulerAngles = new Vector3(0, 0, -player.transform.eulerAngles.y);
}
将创建好的脚本挂在到小地图的ui,map上,打开脚本获取主角、主角ui、小地图ui以及RectTransform组件,注意UI要调整需要获取RectTransform组件。
对于UI他的位置是RectTransform.anchoredPosition
rect =this.GetComponent<RectTransform>();
表示获取到小地图的RectTransform组件
rect.sizeDelta = new Vector2(Floor.transform.localScale.x, Floor.transform.localScale.z) * 100;
由于世界地图边长为1时相对空物体为10,所以面积相对Player角色为100倍,这里将小地图ui的宽高设置为100。
playerimage.rectTransform.sizeDelta = new Vector2(10, 10);
表示确定好角色ui显示的宽高。
playerimage.rectTransform.anchoredPosition = new Vector3(player.transform.position.x, player.transform.position.z, 0)*10;
这里更改角色ui的位置。因为plane的边长1相对于空物体边长为10,所以对于角色ui在地图ui上移动时距离需要乘10倍。注意角色移动时是X_Z轴移动,所以在ui中角色ui的y等于世界角色的z。
playerimage.rectTransform.eulerAngles = new Vector3(0, 0, -player.transform.eulerAngles.y);
这里设置角色ui的角度,只需要判断世界角色对于y轴的旋转并给到角色ui的z轴上即可。