我正在尝试在具有能量条的2d Unity(C#)中创建冲刺功能,因此不能无休止地使用它。我想念什么?
我试图使sprint成为函数,并在按下X键时调用它。试图乘以它的位置,但是我在短距离内有眨眼的能力。
\\ this is my movement script, other variables we're declared earlier in the code
void Update() {
Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
mv = mi.normalized * speed;
}
private void FixedUpdate() {
rb.MovePosition(rb.position + mv * Time.fixedDeltaTime);
}
我希望该代码使按下X键时播放器的速度达到正常速度的两倍,但只能在能量用尽时使用。
答案 0 :(得分:0)
看不到您对“能源”的实现,但我只是使用
public float energy;
// How much is energy reduced per second?
public float decreaseSpeed;
如果按x,则提高速度
private void Update()
{
Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
mv = mi.normalized * speed;
if(Input.GetKey(KeyCode.X) && energy > 0)
{
// Reduce energy by decreaseSpeed per second
energy -= decreaseSpeed * Time.deltaTime;
// if needed avoid negative value
energy = Mathf.Max(0, energy);
// double the move distance
mv *= 2;
}
}
建议在Time.deltaTime
中也使用Time.fixedDeltaTime
代替FixedUpdate
(请参见Time.fixedDeltaTime
)
答案 1 :(得分:0)
在Update
中检查是否是sprint轴(在项目输入设置中创建一个Sprint
轴)。另外,有一个变量来确定短跑过程中能量棒的消耗速度:
public float energyBarDrainRate = 1f;
private bool isSprinting = false;
void Update() {
isSprinting = Input.GetAxis("Sprint") > 0f;
Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
mv = mi.normalized * speed;
}
然后在fixedupdate中,检查能量条是否足以耗尽该框架,如果确实耗尽了能量并提高该框架的有效移动速度:
private void FixedUpdate() {
float energyToDrain = energyBarDrainRate * Time.deltaTime
bool drainSprint = energyAmount > energyToDrain ;
float effectiveMv = mv;
if (drainSprint && isSprinting) {
effectiveMv = mv * 2f;
energyAmount -= energyToDrain;
}
rb.MovePosition(rb.position + effectiveMv * Time.deltaTime);
}