Unity2D:如何让我的玩家在X时间内无懈可击?

时间:2016-07-24 16:34:10

标签: c# unity3d

我希望让他的球员在重置到比赛中心之后让对手击中他几秒钟后无法击球,这意味着我不想让任何伤害他的球员,我不希望球员移动5秒,但我不知道该怎么做!我搜索了它,但我发现的结果与我的代码不符。无论如何这是我的playermovement脚本:

private Animator anim;
public float speed = 15f;
public static Vector3 target;
private bool touched;
private bool canmove;
Vector3 startPosition;


void Start () {
    target = transform.position;
    anim = GetComponent<Animator> ();
}

void Update () {
    if (Input.GetMouseButtonDown (0)) {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = 10; // distance from the camera
        target = Camera.main.ScreenToWorldPoint(mousePosition);
        target.z = transform.position.z;
    }
        transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime);

    var movementDirection = (target - transform.position).normalized;

    if (movementDirection.x != 0 || movementDirection.y != 0) {
        anim.SetBool ("walking", false);
        anim.SetFloat("SpeedX", movementDirection.x);
        anim.SetFloat("SpeedY", movementDirection.y);
        anim.SetBool ("walking", true);
    }
}

void FixedUpdate () {
    float LastInputX = transform.position.x - target.x;
    float LastInputY = transform.position.y - target.y;

    if (touched) {
        if (LastInputX != 0 || LastInputY != 0) {
            anim.SetBool ("walking", true);
            if (LastInputX < 0) {
                anim.SetFloat ("LastMoveX", 1f);
            } else if (LastInputX > 0) {
                anim.SetFloat ("LastMoveX", -1f);
            } else {
                anim.SetFloat ("LastMoveX", 0f);
            }
            if (LastInputY > 0) {
                anim.SetFloat ("LastMoveY", 1f);
            } else if (LastInputY < 0) {
                anim.SetFloat ("LastMoveY", -1f);
            } else {
                anim.SetFloat ("LastMoveY", 0f);
            }
        }
    }else{
        touched = false;
        anim.SetBool ("walking", false);            
    }
}

}

这是我的播放器健康脚本:

public int curHealth;
public int maxHealth = 3;
Vector3 startPosition;
bool  invincible = false;

void Start ()
{
    curHealth = maxHealth;
    startPosition = transform.position;
}


void Update ()
{

    if (curHealth > maxHealth) {
        curHealth = maxHealth;
    }
    if (curHealth <= 0) {

        Die ();
    }
}

void Die ()
{
    //Restart
    Application.LoadLevel (Application.loadedLevel);
}


public void Damage(int dmg)
{
    curHealth -= dmg;
    Reset();
}

void Reset ()
{
    transform.position = startPosition;
    PlayerMovement.target = startPosition;

}

}

所以更简单一点,我想让我的玩家无懈可击(一旦他重新回到屏幕中央)被敌人击中5秒钟,玩我的玩家的人不能移动5秒钟。谢谢! (我的游戏是自上而下的2d点击移动游戏)

2 个答案:

答案 0 :(得分:0)

我认为这应该可以解决问题。至少指出你正确的方向。

简单的解释,我改变了无敌是一个时间,一个未来的时间。 然后我们只是在某个事件中为将来添加一个时间,从那个事件开始到将来我们希望他立于不败之地。

所以在每次他会受到伤害我们检查的事件中,现在都是无敌的未来,或者在未来的现在是无敌的。那是你的布尔。

DateTime invincible = DateTime.Now;

public void Damage(int dmg)
{
    if(invincible <= DateTime.Now)
    {
        curHealth -= dmg;
        Reset();
    }
}

void Reset ()
{
    transform.position = startPosition;
    PlayerMovement.target = startPosition;
    invincible = DateTime.Now.AddSeconds(5);
}

如果你想要像这样的辅助方法

bool IsInvincible(){
    return invincible <= DateTime.Now;
}

然后,您可以在if(invincible <= DateTime.Now)

中使用if(IsInvincible())更改public void Damage(int dmg)

答案 1 :(得分:0)

在游戏开发中,您必须牢记所有事情都在框架更新中发生。我喜欢使用协程在Unity中实现无敌框架。协程只是一种与主更新循环并行运行并在下一次更新中恢复的方法。

float dmg = 100.0f;
bool isHitByEnemy = false
bool isInvulnerable = false

void Demage()
{
    //some dmg logic

    if (isHitByEnemy && isInvulnerable == false)
    {
        StartCoroutine("OnInvulnerable");
    }
}

IEnumerator OnInvulnerable()
{
    isInvulnerable  = true;
    dmg = 0.0f; 

    yield return new WaitForSeconds(0.5f); //how long player invulnerable

    dmg = 100.0f;
    isInvulnerable  = false;
}