我可以看到你是想让玩家 只能在地面时执行避开(dodge)和滚动/冲刺(roll/dash)动作。要实现此功能,你可以通过检查玩家是否处于地面的状态来控制避开和滚动/冲刺动作的触发。

下面是你需要做的修改:

  1. PlayerMovement 类中添加两个新的变量 isDodgingisRolling,用于控制玩家当前是否处于避开或滚动/冲刺状态。
  2. Update() 方法中,检查玩家是否处于地面(通过 isGrounded() 方法),如果是,则清空 isDodgingisRolling 变量。
  3. 创建一个新方法 Dodge(),该方法执行避开动作并设置 isDodgingtrue
  4. 创建一个新方法 RollDash(), 该方法执行滚动/冲刺动作并设置 isRollingtrue
  5. FixedUpdate() 方法中,检查 isDodgingisRolling 变量,如果它们为 true,则执行相应动作。

下面是具体的修改代码:

private bool isDodging;
private bool isRolling;

// ...

private void Update()
{
    // ...

    if (isGrounded())
    {
        isDodging = false;
        isRolling = false;
    }

    if (Input.GetKeyDown(KeyCode.Escape))
    {
        Dodge();
    }

    if (Input.GetKeyDown(KeyCode.Space))
    {
        RollDash();
    }

    // ...
}

private void Dodge()
{
    isDodging = true;
    // 执行避开动作,如改变玩家位置或速度
}

private void RollDash()
{
    isRolling = true;
    // 执行滚动/冲刺动作,如改变玩家速度或加速
}

private void FixedUpdate()
{
    // ...

    if (isDodging)
    {
        // 执行避开动作
    }

    if (isRolling)
    {
        // 执行滚动/冲刺动作
    }

    // ...
}

以上修改代码仅供示例,如果你需要更复杂的功能,则需要根据具体需求修改代码。

至于I-frame(意外框)的实现,可以通过在玩家避开时暂时使其透明或者变小来实现。

你需要添加以下代码:

private Renderer renderer;

private void Start()
{
    renderer = GetComponent<Renderer>();
}

private void Dodge()
{
    isDodging = true;
    renderer.enabled = false;
    // 执行避开动作
    Invoke("ResetDodging", attackTime);
}

private void ResetDodging()
{
    isDodging = false;
    renderer.enabled = true;
}

以上代码会在玩家避开时暂时使其透明,可以通过调整参数attackTime来控制暂停多长时间。