数据准备
在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.anchorMin
和RectTransform.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); } }
|