让我们添加一些细节
小细节
首先添加一个传入参数GameObject go到基类函数execute
public abstract class Commend
{
public abstract void execute(GameObject go);
}
对应的移动命令变成了这样
//移动命令
public class MoveCommend : Commend
{
Unit unit;
public override void execute(GameObject go)
{
unit = go.GetComponent<Unit>();
unit.move();
}
}
然后在按钮响应 InputHandle 中添加一个按钮
//接受命令的物体
public GameObject go;
然后添加一个
//使被点击的物体接受命令
private void OnMouseDown()
{
GetComponentInParent<InputHandel>().go = gameObject;
}

恭喜你unity 按键,你可以切换接受命令的对象了。只需将Unit组件分别添加到两个对象中,点击对应的对象,就会成为接受命令的对应对象。当然,缺点是两个对象必须具有相同的顺序。
点击小球,按下j键,小球就会移动。然后点击长方体,按j键,会变成长方体移动。
自定义按钮
下一项工作是自定义按钮。
Unit功能基本不变
因为键盘不能全部用完,需要加一个空命令
public class NullCommend : Commend
{
public override void execute(GameObject go)
{
}
}
里面没有什么可写的。当按钮无效时,将命令分配给它。
键盘响应功能
public class InputHandel : MonoBehaviour
{
//26键对应命令数组
public Commend[] keys = new Commend[26];
//接受命令的物体
public GameObject go;
//改变按钮绑定时关闭按钮响应
public bool changeTime;
private void Start()

{
//26键初始化
for(int i=0; i<26; i++)
{
keys[i] = new NullCommend();
}
keys[9] = new MoveCommend(); //j
keys[10] = new JumpCommend();//k
changeTime = true;
}
private void Update()
{
inputListen();
}
//按钮响应
void inputListen()
{
if (changeTime)
{
for (int i = 0; i < 26; i++)
{
//ASCII码转换成键盘对应按键
int x = 97 + i;
char y = (char)x;
string s = y.ToString();

if (Input.GetKey(s))
{
//调用对应按键命令
keys[i].execute(go);
}
}
}
}
}
1、需要一个changeTime来决定是否响应,因为输入字母算作按钮响应。
2、开始初始化是默认设置j、k游戏动态,其他键设置为空命令
3、每帧更新监视器
4、input 需要将 ASCII 转换为键盘对应的按键。一帧循环26次,当按下其中一个按钮时,执行相应的命令。
有人会问,在哪里切换绑定?不用担心,创建一个新的 UI 以输入所需的键
当点击更改按钮时,之前设置的changeTime开始发挥作用,将其设置为false。暂停按钮监控,然后在两个文本框中输入所需的击键。最后点击确定就大功告成了。
界面功能
public class UI : MonoBehaviour
{
public GameObject move;
public GameObject jump;
public InputHandel inputHandel;
char[] moveButton;
char[] jumpButton;
//从文本框读取字母,并添加功能
public void change()

{
moveButton = move.GetComponent<InputField>().text.ToCharArray();
jumpButton = jump.GetComponent<InputField>().text.ToCharArray();
int i = (int)moveButton[0];
int j = (int)jumpButton[0];
if (i>=65 && i<=90)
{
i -= 65;
}
else
{
i -= 97;
}
if(j>=65 && j<=90)
{
j -= 65;
}
else
{
j -= 97;
}
//Debug.Log("i:" + i + "j:" + j);
//将命令赋予对应的keys[i]
for(int x=0; x<26; x++)

{
if(x == i)
{
inputHandel.keys[i] = new MoveCommend();
}
else if(x == j)
{
inputHandel.keys[j] = new JumpCommend();
}
else
{
inputHandel.keys[x] = new NullCommend();
}
}
inputHandel.changeTime = true;
}
//暂定按钮响应
public void startChange()
{
inputHandel.changeTime = false;
}
}
1、 字符存储相应的字母。由于 ASCII 的限制unity 按键,只能绑定 AZ 的 26 个按钮。当然,大写和小写都可以识别。
2、 分配命令时,注意分配有用的功能。无用的按钮需要设置为空命令,否则会出现功能冲突。因为一开始都已经设置为空3D场景,所以不会报空错误。
结语
以上就是基于命令模式的unity角色切换和按键绑定的全部内容。第一次写这篇技术文章,不足之处还请见谅。
最后,为游戏设计模式推荐一波数据出处。再次感谢您的阅读。