http://game.ceeger.com/forum/read.php?tid=10766&fid=16#read_123739
小地图有很多方法,自己写了一个。(帖子里面发图好不方便,啥时候改进一下下呢)
原理: 小地图的原理其实很简单就是算一个比例尺,类似于我们初中学的等比三角形的知识。 第一 ,首先在实际场景中确定一个起始点,我在这里是建立了一个空物体作为起始点,如下图: ![]() ![]() 第二,算比例。 实际场景中的人物距离起始点的距离比例(x,y的差值)(请注意我这里的坐标都是从左到右变大,从下到上值变大,界面也 是这样) xdistance = 人物.x - 起始点.x; ydistance = 人物.z - 起始点.z; 然后用 xScale = xdistance /场景的长度;yScale = ydistance/场景的高度 (场景的长度也就是AB之间的距离,场景的高度也就是CD间的距离,如下图) ![]() 这样我们就得到了一个比例尺了 第三: 我们放2个NGUI的控件slideredsprite类型 如图: ![]() ![]() arrow就是红色箭头,minimapBackground是背景,由于Ngui里面可能你加了缩放,和只适应的脚本,所以你要用这个箭头测一下你 的minimapBackground 的长宽,我是直接拖动arrow这个控件来看看背景的尺寸的大概是长170,宽20 第四:换算 代码我直接就贴上来了: yScale = (player.transform.position.z - (-10))/20f; xScale = (player.transform.position.x - (-89))/170f; Vector3 vec = new Vector3(44+434*xScale,323+150*yScale,0f); arrowTransform.localPosition = vec; 44和323是小地图背景图最左下脚的坐标,我是以他为起始点,这是因为我要对于场景起始点 这段代码放到update里面 第五:保持箭头指向的是摄影机的方向(因为我的代码里面摄影机的方向和人物前进方向是一样的) ![]() 注意:我这里人物的z轴指向和箭头y方向一致 arrowTransform.localEulerAngles = new Vector3(0,0,-mainCamera.transform.localEulerAngles.y); 我这里有个负号是因为我的轴向是和摄影机方向相反 最后我发一下完整代码: public class MiniMap : MonoBehaviour { private GameObject player; private float xScale; private float yScale; private Transform arrowTransform; private GameObject mainCamera; void Start () { player = GameObject.Find("Player"); arrowTransform = GameObject.Find("UI/UICamera/Anchor/Panel/Arrow").GetComponent<Transform>(); mainCamera = GameObject.Find("MainCamera"); } void Update () { yScale = (player.transform.position.z - (-10))/20f; xScale = (player.transform.position.x - (-89))/170f; Vector3 vec = new Vector3(44+434*xScale,323+150*yScale,0f); arrowTransform.localPosition = vec; arrowTransform.localEulerAngles = new Vector3(0,0,-mainCamera.transform.localEulerAngles.y); } } |
|