用UGUI制作可根据手指位置自动定位的隐形遥杆
之前写过遥杆怎么做,这里依然用的是之前的方法,就不介绍了。
之前玩过《蜡烛人》,发现手游版的《蜡烛人》的遥杆是看不见的,手指直接在屏幕左边滑动人物就可以移动,可能是为了增强沉浸感。最近在写2D游戏所以就想来实现一下。
大概思路:
1. 把遥杆UI的GetComponent<Image>().color的透明度改为0;
2.手指落到哪里就修改摇杆的位置在哪里。
显示隐藏摇杆和自动定位的代码(下面的代码挂在摇杆上)如下:
1 public void Hide() 2 { 3 viewport.GetComponent<Image>().color *= new Color(1, 1, 1, 0); // 透明度改为0,用乘法 4 content.GetComponent<Image>().color *= new Color(1, 1, 1, 0); 5 } 6 public void Show() 7 { 8 viewport.GetComponent<Image>().color += new Color(0, 0, 0, 1); // 透明度改为1,用加法 9 content.GetComponent<Image>().color += new Color(0, 0, 0, 1); 10 } 11 public void AutoSetPosition(Vector2 screenPos) 12 { 13 if ((!Input.GetMouseButton(0) || Input.GetMouseButtonDown(0)) && screenPos.x < Screen.width / 2) // 在移动端Input.GetMouseButton(0)表示单指按下 14 { 15 transform.GetChild(0).localPosition = ScreenPosToLocalPos(GetComponent<RectTransform>(), Input.mousePosition); ; // 注意是LocalPosition 16 } 17 18 // 如果采用自动定位的方式,就一定要让stick跟随手指 19 if (Input.mousePosition.x < Screen.width / 2 && Input.GetMouseButton(0)) 20 content.localPosition = ScreenPosToLocalPos(content.parent.GetComponent<RectTransform>(), Input.mousePosition); 21 } 22 23 private Vector2 ScreenPosToLocalPos(RectTransform rt, Vector2 pos) 24 { 25 Vector2 localPoint; 26 RectTransformUtility.ScreenPointToLocalPointInRectangle(rt, pos, null, out localPoint); 27 return localPoint; 28 }
遇到的问题:
1. 一开始我发现手放屏幕上后立即拖动不能拖动stick,因为是先放手,摇杆后根据手定位到手的位置的,所以不能触发拖动事件,所以我就加入了在手机按下时让杆跟随手指移动的代码,在上面有体现。
补充:
1.因为摇杆脚本继承了ScrollRect脚本,ScrollRect中有关控制stick的代码位于LateUpdate中,比Update后执行,所以可能会比自己写的控制Stick的代码后执行,所以我们需要对LateUpdate进行覆写,让ScrollRect中控制Stick的代码不执行,不然的话我们写的代码和ScrollRect中的代码都会对stick进行控制,会出BUG的。代码如下:
protected override void LateUpdate() { // base.LateUpdate(); 控制stick,比如stick的回弹 if (Input.GetMouseButtonUp(0)) content.localPosition = Vector2.zero; if(Input.GetMouseButton(0)) if (content.localPosition.magnitude > radius) content.localPosition = content.localPosition.normalized * radius; stickPos = content.localPosition / radius; }