我有这样的代码,可以在Unity:中处理按钮组合
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputBufferScriptTest: MonoBehaviour {
public enum FightInput {
Up,
UpRight,
Right,
DownRight,
Down,
DownLeft,
Left,
UpLeft,
LightPunch,
MediumPunch,
HeavyPunch,
LightKick,
MediumKick,
HeavyKick
}
List<FightInput> recentInputs = new List<FightInput>();
public List<FightInput> Special1Inputs = new List<FightInput>();
public List<FightInput> Special2Inputs = new List<FightInput>();
// Update is called once per frame
void Update() {
if (Input.GetKeyDown(KeyCode.W))
{
recentInputs.Add(FightInput.Up);
Debug.Log("UP");
}
if (Input.GetKeyDown(KeyCode.S))
{
recentInputs.Add(FightInput.Down);
Debug.Log("DOWN");
}
if (Input.GetKeyDown(KeyCode.A))
{
recentInputs.Add(FightInput.Left);
Debug.Log("LEFT");
}
if (Input.GetKeyDown(KeyCode.D))
{
recentInputs.Add(FightInput.Right);
Debug.Log("RIGHT");
}
if (Input.GetKeyDown(KeyCode.U))
{
recentInputs.Add(FightInput.LightPunch);
Debug.Log("LIGHT PUNCH");
}
if (Input.GetKeyDown(KeyCode.I))
{
recentInputs.Add(FightInput.MediumPunch);
Debug.Log("MEDIUM PUNCH");
}
if (Input.GetKeyDown(KeyCode.O))
{
recentInputs.Add(FightInput.HeavyPunch);
Debug.Log("HEAVY PUNCH");
}
if (Input.GetKeyDown(KeyCode.J))
{
recentInputs.Add(FightInput.LightKick);
Debug.Log("LIGHT KICK");
}
if (Input.GetKeyDown(KeyCode.K))
{
recentInputs.Add(FightInput.MediumKick);
Debug.Log("MEDIUM KICK");
}
if (Input.GetKeyDown(KeyCode.L))
{
recentInputs.Add(FightInput.HeavyKick);
Debug.Log("HEAVY KICK");
}
for (int i = recentInputs.Count - 1, j = Special1Inputs.Count - 1; i >= 0 && j >= 0; --i, --j) {
FightInput input = recentInputs[i];
FightInput nextSpecial1Input = Special1Inputs[j];
if (input != nextSpecial1Input) {
break;
} else if (j == 0) {
//Combo was entered, do Special1 then empty the list
Debug.Log("Special1!");
recentInputs.Clear();
}
}
for (int i = recentInputs.Count - 1, j = Special2Inputs.Count - 1; i >= 0 && j >= 0; --i, --j) {
FightInput input = recentInputs[i];
FightInput nextSpecial2Input = Special2Inputs[j];
if (input != nextSpecial2Input) {
break;
} else if (j == 0) {
//Combo was entered, do Special2 then empty the list
Debug.Log("Special2!");
recentInputs.Clear();
}
}
float secondsSinceLastInput = 0;
secondsSinceLastInput += Time.deltaTime;
if (secondsSinceLastInput > 1) {
recentInputs.Clear();
}
}
}
它的工作原理是我制作一个特殊攻击列表(例如public List<FightInput> Special1Inputs = new List<FightInput>();
(。然后在编辑器中,我可以选择触发特殊攻击需要多少按钮,然后我会得到一个下拉列表,选择链中每一步都应该按下哪个按钮。问题是,如果我想有5次特殊攻击,我必须重复public List<FightInput> Special1Inputs = new List<FightInput>();
5次,分别命名它们,并复制和粘贴for循环5次,使它们对应于正确的特殊攻击。有没有办法在编辑器中添加特殊攻击?我在想,这就像是一个";添加特殊攻击";字段,然后一旦我这样做,我就可以命名特殊攻击,并给它输入的数量和所需的按钮。或者也许有一种更好的方法来处理这件事,我还没有意识到
您可能需要一个类似List<List<FightInput>>
的List<FightInput>
列表。遗憾的是,要想在unity编辑器中工作,您需要编写一个包装器才能使用它:
[Serializable]
public class InputList
{
public List<FightInput> fightInputs;
}
public List<InputList> specialAttacks;
这样,您将能够在不创建多个变量的情况下分配多个特殊攻击。只要确保更改循环——您需要将当前循环放在一个更大的循环中,该循环在specialAttakcs列表上迭代。
https://i.stack.imgur.com/MfBlc.jpg-编辑器中的结果
当然,如果你愿意的话,你可以创建自定义编辑器来添加特殊攻击。如果你想走这条路,也许你应该考虑使用ScriptableObject。