unity实现按钮和攻击对象的选定
下面来看下实现的效果的样子
unity通常用来用类似easytouch的资源来实现对攻击目标的选定
UI里面的效果的实现
这个样子就把一个按钮实现了由到类似于Easytouch的方式了。
下面我们看下代码的实现吧。
//区域半径
[SerializeField]
private int radius = 100;
public int Radius { get { return this.radius; } }
//选择区域按钮的轴
private Vector2 chooseAreaAxis = Vector2.zero;
//上次按钮选择区域按钮的轴
private Vector2 lastChooseAreakAxis = Vector2.zero;
public Vector2 LasttChooseAreaAxis { get { return this.lastChooseAreakAxis; } }
#endregion
UIWidget root;
[SerializeField]
//背景
UISprite bg;
//可拖拽的小物体
[SerializeField]
UISprite thumb;
下面类似于Easytouch,我们也要实现中间的轴,并且将按钮按下时候的UI的蓝色外圈命名为背景。
void Init()
{
bg.enabled = false;
bg.transform.localPosition = Vector3.zero;
thumb.transform.localPosition = Vector3.zero;
SetJoystickSize(radius);
}
#region ngui event
//按下按钮
public override void OnPress(bool isPressed)
{
base.OnPress(isPressed);
if (isPressed)
{
OnBtnPressed.Invoke();
//如果是选定区域按钮
if (isUseChooseArea)
{
bg.enabled = true;
CalculateChooseAreaAxis();
}
}
else
{
//原来的OnPressed函数里的
if (SwipedOutType != -1)
{
OnSwipeOut.Invoke(SwipedOutType);
SwipedOutType = -1;
}
OnBtnUp.Invoke();
if (isUseChooseArea)
{
// PlayController.Instance.DestroyWarning();
CalculateChooseAreaAxis();
bg.enabled = false;
thumb.transform.localPosition = Vector3.zero;
}
}
}
在初始化的时候是要隐藏蓝色外圈的,然后对它们进行居中了Vector3.zero。
下面用来计算便宜的地方,再加上些拖拽的功能,差不多就是可以完成的了。
void CalculateChooseAreaAxis()
{
Vector3 offset = ScreenPos_to_NGUIPos(UICamera.currentTouch.pos);
Vector3 buttonPos = UICamera.currentCamera.transform.InverseTransformPoint(transform.position);
offset -= buttonPos;
if (offset.magnitude > radius)
{
offset = offset.normalized * radius;
}
thumb.transform.localPosition = offset;
lastChooseAreakAxis = chooseAreaAxis;
chooseAreaAxis = new Vector2(offset.x / radius, offset.y / radius);
//问题
onMove.Invoke(chooseAreaAxis);
}
后面我们去定义几个事件去响应按钮的点击和拖拽。
这个点击会比如说唤起OnBtnClick(),同样按下会触发OnOpress函数,此外等等
场景里面实现的效果
这个样子差不多就可以在UI脚本的人物就算完成了,下面要去实现在场景里去实现的大圆和小圆的样子了。
先就是这个的样子。
其实这里的就是用美工做的东西然后实例化去,在场景里面在主角的位置给实例化出来,然后把偏移的位置给传进来,这个样子就是差不多了。
最后再来看下。
代码下载,在NGUI下面使用,继承自UIButton