https://blog.csdn.net/snowdust/article/details/5895593
目的是在一个限定的区域内,触摸开始,就在这个位置使用转盘来控制人物的行走之类的,类似王者农药的转盘操作,手指之间不能影响。
开始制作:
首先需要ngui插件,自行搜索。
创建UIRoot,分辨率对齐1920*1080
然后创建一个空白的UI2D Sprite
区域是整个屏幕左下角的四分之一
其锚点设置如下,并添加Box Collider组件,与区域保持一致
放入摇杆素材,大小合适。
编写代码:
需要用到UIDragDropItem.cs脚本
新建一个脚本PanController.cs挂载到 PanArea 上,因为它是移动区域。
PanController继承UIDragDropItem,定义如下变量:
public Transform pan, move;//摇杆背景与移动摇杆。
//摇杆pan移动的最远距离
public float range = 110;
private Vector2 orgPos, startPos;//一些初始参数
//输出参数
public float x,y;
重写start方法,让摇杆一开始的透明度低些,并记录此时摇杆pan物体的本地位置。
protected override void Start()
{
base.Start();
pan.GetComponent<UI2DSprite>().alpha = 0.6f;
orgPos = pan.gameObject.transform.localPosition;
}
重写OnPress方法,参数isPressed在按下时为true,松开为false,非常适合摇杆按下的初始化操作和释放操作。
protected override void OnPress(bool isPressed)
{
base.OnPress(isPressed);
if (isPressed)
{
if (UICamera.currentTouchID < 0)//鼠标也会触发,屏蔽鼠标的输入
{
return;
}
//在按下时摇杆pan的透明度提升,并且记录按下时手指的位置startpos,并将其转化,与屏幕的一半相减,让摇杆pan的位置在这里
pan.GetComponent<UI2DSprite>().alpha = 1f;
startPos = Input.touches[UICamera.currentTouchID].position-new Vector2 (Screen.width,Screen.height)/2;
pan.gameObject.transform.localPosition = startPos;
}
else
{
//松开摇杆时,让pan透明度降低,并让里面的按钮回到原点,pan的位置回到没有按下的位置
pan.GetComponent<UI2DSprite>().alpha = 0.6f;
move.localPosition = Vector2.zero;
pan.gameObject.transform.localPosition = orgPos;
}
}
那么在移动时,重写OnDrag方法
protected override void OnDrag(Vector2 delta)
{
Vector2 pos= (Input.touches[UICamera.currentTouchID].position - new Vector2(Screen.width / 2, Screen.height / 2)-startPos);
if (pos.magnitude >= range)
{
x = pos.normalized.x;
y = pos.normalized.y;
move.localPosition = pos.normalized * range;
}
else
{
x = pos.x / range;
y = pos.y / range;
move.localPosition = pos;
}
Debug.Log(x + " ," + y);
//输出了x,与y 其满足x²+x²=1
}
后面是一些文档
visual studio 2019下载慢的 将下面的添加到host,不确定安全性
110.53.72.104 download.visualstudio.microsoft.com
//判断是否存在光传感器来判断是否为模拟器
public bool GetIsSimulator()
{
#if UNITY_ANDROID
AndroidJavaObject sensorManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "sensor");
AndroidJavaObject sensor = sensorManager.Call<AndroidJavaObject>("getDefaultSensor",5); //光传感器
if(sensor == null){
return true;
}else{
return false;
}
# endif
return false;
}