繁体   English   中英

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

[英]Unity2D: How to make my player invulnerable for X amount of time?

我想让我的玩家在他重新回到游戏中心后几秒钟内不受物体击中他的伤害,这意味着我不想伤害他,我不想让玩家移动 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 点击移动游戏)

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

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

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

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;
}

然后你可以在你的public void Damage(int dmg)中用if(IsInvincible())改变if(invincible <= DateTime.Now) public void Damage(int dmg)

在游戏开发中,您必须牢记一切都发生在帧更新中。 我喜欢在 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM