赞
踩
图上是体力条跟随着主角,主角左移,体力条就跟着左移。
首先我们需要知道主角单位对于屏幕
PlayerScreen = Camera.main.WorldToScreenPoint(Player.transform.position);
然后需要知道一开始UI和主角得屏幕相对位置之间得距离参数,利用这个参数就能使UI一直跟着主角。
offest.x = PlayerScreen.x - transform.position.x;
offest.z = PlayerScreen.z - transform.position.z;
offest.y = transform.position.y;
Update里面一直获取主角对于屏幕的相对位置,然后在进行相减,就可以一直保持了。
void Update()
{
PlayerScreen = Camera.main.WorldToScreenPoint(Player.transform.position);
transform.position = PlayerScreen;
transform.position = new Vector2(transform.position.x - offest.x, offest.y);
}
不过我发现了,如果我在编辑器里面全屏运行,会出现UI靠的很近,我觉得非常奇怪,因为代码已经提前计算好了他们之间的距离,后面也是根据这个距离用来保持。
于是我发现,是因为一开始屏幕是小屏化的,Start一开始获取的offest差值是小屏时候的距离差,所以放大之后,UI就会靠的非常近,所以我就一时偷懒,直接一个协程,让他慢一秒在开始获取。
IEnumerator Wait()
{
yield return new WaitForSeconds(1f);
Player = GameObject.FindGameObjectWithTag("Player").transform;
PlayerScreen = Camera.main.WorldToScreenPoint(Player.transform.position);
offest.x = PlayerScreen.x - transform.position.x;
offest.z = PlayerScreen.z - transform.position.z;
offest.y = transform.position.y;
IsRun = true;
}
最后代码如下:
public class UIFollowShow : MonoBehaviour { private Transform Player; private Vector3 offest; private Vector3 PlayerScreen; private bool IsRun; // Start is called before the first frame update void Awake() { StartCoroutine(Wait()); } // Update is called once per frame void Update() { if (IsRun) { PlayerScreen = Camera.main.WorldToScreenPoint(Player.transform.position); transform.position = PlayerScreen; transform.position = new Vector2(transform.position.x - offest.x, offest.y); } } IEnumerator Wait() { yield return new WaitForSeconds(1f); Player = GameObject.FindGameObjectWithTag("Player").transform; PlayerScreen = Camera.main.WorldToScreenPoint(Player.transform.position); offest.x = PlayerScreen.x - transform.position.x; offest.z = PlayerScreen.z - transform.position.z; offest.y = transform.position.y; IsRun = true; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。