数据准备

Enums中添加左右手模式的枚举

1
2
3
4
5
public enum HandMode
{
RIGHT,
LEFT
}

DataKeys中添加存档文件中左右手模式的键值。

1
2
//左右手模式
public const string HAND_MODE = "HandMode";

GameStateModel中添加此枚举变量,并在GameStateModel的构造函数中设定值。

1
2
3
4
5
public GameStateModel() 
{
HandMode = (HandMode)DataMgr.Instance.Get<int>(DataKeys.HAND_MODE);
}
public HandMode HandMode { get; set; }

MsgEvent中添加切换左右手的事件id

1
public const int EVENT_CHANGE_HAND = 6;

添加新的工具类

在Utility文件夹中新建GameUtil工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using UnityEngine;

public class GameUtil
{
public static void ChangeHandPos(RectTransform rect)
{
float xValue = Mathf.Abs(rect.anchoredPosition.x);
if (GameStateModel.Instance.HandMode == HandMode.LEFT)
{
SetPosData(rect, Vector2.zero, xValue);
}
else
{
SetPosData(rect, Vector2.right, -xValue);
}
}
private static void SetPosData(RectTransform rect,Vector2 anchorValue,float x)
{
rect.anchorMin = anchorValue;
rect.anchorMax = anchorValue;
var pos = rect.anchoredPosition;
pos.x = x;
rect.anchoredPosition = pos;
}
}

先修改RectTransform.anchorMinRectTransform.anchorMax修改Shield和Bomb图标的锚点位置。然后将x的数值赋值回RectTransform即可。一定要先修改锚点,再修改坐标,否则图标不会正确移动。

当在右手模式时,锚点在右下角((0,1)也就是Vector2.up),x的数值是负值,当在左手模式时,锚点在左下角((0,0)也即是Vector2.zero),x的数值是正值,所以我们先取x的绝对值,然后根据左右手模式的不同设置x的正负。

Shield和Bomb

修改Shield脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public override void Show()
{
base.Show();
//...
MessageMgr.Instance.AddListener(MsgEvent.EVENT_CHANGE_HAND, this);
UpdateCount();
UpdateState();
UpdateHandState();
}
public override void Hide()
{
//...
MessageMgr.Instance.RemoveListener(MsgEvent.EVENT_CHANGE_HAND,this);
}
public void ReceiveMessage(params object[] args)
{
//...
UpdateHandState();
}
private void UpdateHandState()
{
GameUtil.ChangeHandPos(transform.GetRect());
}

修改Bomb脚本和上面相同。

GamePauseController

给按钮添加切换左右手模式的触发函数。

1
2
3
4
5
6
7
8
9
10
11
12
protected override void InitChild()
{
//...
transform.ButtonAction("Hand", ChangeHand);
}
private void ChangeHand()
{
var hand = GameStateModel.Instance.HandMode;
GameStateModel.Instance.HandMode = hand == HandMode.LEFT ? HandMode.RIGHT : HandMode.LEFT;
MessageMgr.Instance.DispatchMsg(MsgEvent.EVENT_CHANGE_HAND);
DataMgr.Instance.Set(DataKeys.HAND_MODE,(int)GameStateModel.Instance.HandMode);
}

GamePauseView

修改一下按钮的文字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[BindPrefab(Pathes.PAUSE_VIEW,Consts.BIND_PREFAB_PRIORITY_VIEW)]
public class GamePauseView : ViewBase
{
protected override void InitChild()
{
}
public override void UpdateFun()
{
base.UpdateFun();
ChangeHand();
}
private void ChangeHand()
{
var hand = GameStateModel.Instance.HandMode;
var text = hand == HandMode.LEFT ? "右手" : "左手";
UIUtil.Get("Hand/Text").SetText(text);
}
}