引言
这个游戏主要是练手之用,全程跟的siki的一个课程,游戏使用最新的unity6制作。
项目使用的技术主要有:unity物理引擎,射线检测,inputSystem,animation、animator组件,UGUI系统,shader Graph,场景转换等。
架构设计
场景设计
游戏主要只有三个场景——开始界面、加载界面、游戏界面。
代码组织架构
游戏流程
代码实现
输入控制
使用unity新版输入系统inputSystem。需要先在场景中创建一个空物体Gameinput用于挂载输入脚本。创建GameInput脚本,把他添加到场景中的空物体GameInput上。
在Projec栏右键Create –> Input Actions

创建后可自行命名,事实上unity的模版已经自带了一个input Acions。可以删掉或自行处理。
然后我们双击打开,看到以下界面:

然后我们开始添加Action Map,点击加号即可:

接下来添加Actions,同样点击加号即可,我们可以命名为Move:

最后添加绑定,还是点击加号,这里添加的是二维移动的绑定:

添加后是这样的:

创建后可以对每个Binding进行绑定:

可以用Listen监听按键绑定,也可以搜索。
代码实现如下:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
| using System; using UnityEngine; using UnityEngine.InputSystem;
public class GameInput : MonoBehaviour { public static GameInput instance { get; private set; } private const string GAMEINPUT_BINDING = "gameinput_bingding";
public event EventHandler OnIneractAction; public event EventHandler OnOperateAction; public event EventHandler OnStopGameAction; private GameControl gameControl;
public enum BindingType { Up, Down, Left, Right, Interact, Operate, Stop } private void Awake() { instance = this; gameControl = new GameControl(); if (PlayerPrefs.HasKey(GAMEINPUT_BINDING)) { gameControl .LoadBindingOverridesFromJson( PlayerPrefs .GetString(GAMEINPUT_BINDING) ); } gameControl.Player.Enable(); gameControl.Player.Interact.performed += Interact_Performed; gameControl.Player.Operate.performed += Operate_Performed; gameControl.Player.Stop.performed += Stop_performed; } private void OnDestroy() { gameControl.Player.Interact.performed -= Interact_Performed; gameControl.Player.Operate.performed -= Operate_Performed; gameControl.Player.Stop.performed -= Stop_performed; gameControl.Dispose(); } public Vector3 GetMovementDirectionNormlized() { Vector2 inputVector2 = gameControl.Player.Move.ReadValue<Vector2>();
Vector3 moveDir = new Vector3(inputVector2.x, 0f, inputVector2.y);
moveDir.Normalize(); return moveDir; } public void ReBinding(BindingType bindingType, Action onCompete) { InputAction inputAction = null; int index = -1; gameControl.Player.Disable(); switch (bindingType) { case BindingType.Up: inputAction = gameControl.Player.Move; index = 1; break; case BindingType.Down: inputAction = gameControl.Player.Move; index = 2; break; case BindingType.Left: inputAction = gameControl.Player.Move; index = 3; break; case BindingType.Right: inputAction = gameControl.Player.Move; index = 4; break; case BindingType.Interact: inputAction = gameControl.Player.Interact; index = 0; break; case BindingType.Operate: inputAction = gameControl.Player.Operate; index = 0; break; case BindingType.Stop: inputAction = gameControl.Player.Stop; index = 0; break; default: break; } inputAction.PerformInteractiveRebinding(index) .OnComplete( callback => { callback.Dispose(); gameControl.Player.Enable(); onCompete?.Invoke();
PlayerPrefs.SetString(GAMEINPUT_BINDING, gameControl.SaveBindingOverridesAsJson()); PlayerPrefs.Save(); }).Start(); } public string GetBindingDisplayString(BindingType bindingType) { switch (bindingType) { case BindingType.Up: return gameControl.Player.Move.bindings[1].ToDisplayString(); case BindingType.Down: return gameControl.Player.Move.bindings[2].ToDisplayString(); case BindingType.Left: return gameControl.Player.Move.bindings[3].ToDisplayString(); case BindingType.Right: return gameControl.Player.Move.bindings[4].ToDisplayString(); case BindingType.Interact: return gameControl.Player.Interact.bindings[0].ToDisplayString(); case BindingType.Operate: return gameControl.Player.Operate.bindings[0].ToDisplayString(); case BindingType.Stop: return gameControl.Player.Stop.bindings[0].ToDisplayString(); default: return ""; } }
private void Stop_performed(UnityEngine.InputSystem.InputAction.CallbackContext obj) { OnStopGameAction?.Invoke(this, EventArgs.Empty); }
private void Operate_Performed(UnityEngine.InputSystem.InputAction.CallbackContext obj) { OnOperateAction?.Invoke(this, EventArgs.Empty); }
private void Interact_Performed(UnityEngine.InputSystem.InputAction.CallbackContext obj) { OnIneractAction?.Invoke(this, EventArgs.Empty); } }
|