采用
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos)方法。
#region 返回鼠标点击的位置-Vector2 ReturnMouseDownPos()
private Vector2 ReturnMouseDownPos() {
Vector2 pos;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos))
//if语句判断的是bool返回值,而真正要获取的是点击的位置信息。
{
return pos;
}
else {
return pos;
}
}
#endregion
pos是以canvas为基准的坐标系,该代码将坐标系转换为了以Point中心为基准的
Vector2 relativePos = new Vector2((pos.x - this.transform.localPosition.x), (pos.y - this.transform.localPosition.y));
float distance = Mathf.Sqrt((relativePos.x*relativePos.x) + (relativePos.y*relativePos.y));
使用直角三角形边长计算公式
Mathf.Sqrt()方法代表根号。
1、 距离小于30像素,移动虚拟摇杆
if (distance <= 30f)
{
//缩起控制按钮,开始跟随鼠标移动
Narrow(ControlPanel);//缩小虚拟摇杆底盘
isFollowMouse = true;//开启移动模式
}
2、距离大于30像素,改变方向
分别通过判断x和y的正负号,来确定移动的方向,并且修改方向属性。
if (Mathf.Abs(relativePos.x) >= Mathf.Abs(relativePos.y))
{
if (relativePos.x >= 0)
{
heroDistance = HeroDistance.Right;
UpdateCountrolDirection();
}
else
{
heroDistance = HeroDistance.Left;
UpdateCountrolDirection();
}
}
else
{
if (relativePos.y >= 0)
{
heroDistance = HeroDistance.Top;
UpdateCountrolDirection();
}
else
{
heroDistance = HeroDistance.Bottom;
UpdateCountrolDirection();
}
}
检测对象属性的变化,根据实际的要求进行相应的反馈。
#region 根据移动方向改变控件的显示和运动方向-UpdateCountrolDirection()
private void UpdateCountrolDirection() {
if (!isFollowMouse && GameControl._instance.gameState == GameControl.GameState.Playing) {
if (heroDistance == HeroDistance.None)
{
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
GameControl._instance.direction = GameControl.Direction.None;
}
else if (heroDistance == HeroDistance.Top)
{
//判断如果与现在的方向完全相反,将不起作用
if (GameControl._instance.direction != GameControl.Direction.Bottom) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[0].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Top;
}
}
else if (heroDistance == HeroDistance.Bottom)
{
//判断如果与现在的方向完全相反,将不起作用
if (GameControl._instance.direction != GameControl.Direction.Top) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[1].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Bottom;
}
}
else if (heroDistance == HeroDistance.Left)
{
//判断如果与现在的方向完全相反,将不起作用
if (GameControl._instance.direction != GameControl.Direction.Right) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[2].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Left;
}
}
else if (heroDistance == HeroDistance.Right)
{
//判断如果与现在的方向完全相反,将不起作用
if (GameControl._instance.direction != GameControl.Direction.Left) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[3].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Right;
}
}
}
}
#endregion