创建一个Canvas,添加一个Image作为小地图的背景图,重命名为MiniMap,在MiniMap下再创建一个Image,重命名为PlayerIcon,PlayerIcon下创建一个Image
这样旋转MiniMap下PlayerIcon,图标就能旋转
给MiniMap添加代码
public static MiniMap Instance;
private Transform playerIcon;
private Transform player;
void Awake()
{
Instance = this;
playerIcon = transform.Find("PlayerIcon");
player = GameObject.FindGameObjectWithTag(Tags.Player).transform;
}
void Update()
{
playerIcon.localEulerAngles = new Vector3(0, 0, -player.localEulerAngles.y);
}
player为玩家,playerIcon 为MiniMap下的PlayerIcon,通过获取玩家的旋转来改变playerIcon 的旋转,Instance为单例,可以在其他的脚本中掉用此脚本,但是只能使用一次,如果有多个物体,单例就只能找到第一个,因为单例是静态对象,无法改变
之后还有如敌人,奖励等这样的物体需要通过小地图指引方向的,在此脚本下添加如下代码:
public GameObject GetMapIcon()
{
GameObject go = Instantiate(MapIcon, transform.position, transform.rotation);
go.name = "MapIcon";
go.transform.parent = transform;
return go;
}
可以根据所需要的图标数量创建多个代码,根据自已需求取名MapIcon是所需图标的预制体
go.transform.parent = transform;的意思就是创建的这个图标在MiniMap下,作为它的子对象,然后返回一个GameObject ,就是创建的图标,在如下代码中调用获取
private Transform icon;
private Transform player;
private RectTransform rect;
void Awake()
{
player = GameObject.FindGameObjectWithTag(Tags.Player).transform;
}
void Start()
{
if(tag == "Map")
{
icon = MiniMap.Instance.GetMapIcon().transform;
}
rect = icon.GetComponent<RectTransform>();
}
void Update()
{
Vector3 offset = transform.position - player.position;
//offset /= 3;
float x = offset.x;
float y = offset.z;
if (x > 100)
x = 100;
else if (x < -100)
x = -100;
if (y > 100)
y = 100;
else if (y < -100)
y = -100;
rect.anchoredPosition = new Vector3(x, y, 0);
}
void OnDestroy()
{
if (icon != null)
Destroy(icon.gameObject);
}
判断tag是否为Map,然后通过Instance调用,之前脚本中图标生成的函数,获取图标的位置,通过对比玩家的位置,来显示在小地图上。
重点:图标位置的改变不是Transform,而是RectTransform ,所以根据父对象改变位置,不能使用LocalPosition,而是要获取RectTransform组件后使用anchoredPosition。
offset 为玩家和物体之间的距离,但是,图标和玩家之间的距离可能会很大或很小,而小地图大小一定,所以需要把offset除或乘一个数,根据自身情况调试,而且可以判断大小来给他一个最大范围,这样就可以把它控制在小地图内,而不会跑出小地图。
OnDestroy是当物体销毁时执行,奖励被拾取或敌人被消灭时,物体被销毁,这时小图标同样需要被销毁。