2016-07-24 6 views
0

Ich möchte meinen Spieler durch Objekte, die ihn für ein paar Sekunden treffen, unverwundbar machen, nachdem er in die Mitte des Spiels zurückgesetzt wurde, was bedeutet, dass ich ihm nichts antun will und ich möchte nicht, dass der Spieler für 5 zieht Sekunden, aber ich bin mir nicht sicher, wie ich das machen soll! Ich habe es gesucht, aber die Ergebnisse, die ich gefunden habe, stimmen nicht mit meinem Code überein. Wie auch immer das ist mein playermovement Skript:Unity2D: Wie mache ich meinen Player für X Zeit unverwundbar?

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

}

Und das ist mein Spieler Gesundheit Skript:

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; 

} 

}

So einfacher zu sein, ich möchte, dass meine machen Spieler, der nicht in der Mitte des Bildschirms zurückgesetzt werden kann, wird 5 Sekunden lang von Gegnern getroffen und Spieler, die meinen Spieler spielen, können sich 5 Sekunden lang nicht bewegen. Vielen Dank! (Mein Spiel ist ein topdown 2d klicken, um Spiel zu verschieben)

Antwort

0

Ich denke, das sollte den Trick tun. Zumindest weisen Sie in die richtige Richtung.

Einfache Erklärung, ich änderte unbesiegbar zu einer Zeit, eine Zeit in der Zukunft. Dann fügen wir einfach eine Zeit in der Zukunft zu irgendeinem Ereignis hinzu, und von diesem Ereignis bis zum Punkt in der Zukunft wollen wir ihn unbesiegbar.

Also bei jedem Ereignis, wo er Schaden nehmen würde, überprüfen wir, ist jetzt in der Zukunft unbesiegbar oder in der Zukunft von jetzt unbesiegbar. das ist dein Bool.

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

, wenn Sie eine Hilfsmethode wie dieser wollen

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

Dann können Sie in der if(invincible <= DateTime.Now) mit if(IsInvincible()) ändern Sie Ihre public void Damage(int dmg)

+0

Danke wieder für die Beantwortung, eine Frage aber: Date ein bool? –

+0

Nop, DateTime ist so, wie es eine Date Time angibt, was bedeutet, dass es der Typ ist, den wir verwenden, wenn wir die Zeit auswählen. wie int ist ganze Zahlen, Bool ist wahr/falsch usw. Ich habe eine Beschreibung von dem, was passiert. Also DateTime.Now ist die Zeit auf deinem Computer JETZT !!!! hehe –

+0

Es tut mir leid, verstehe ich nicht wirklich, ersetze ich "DateTime.Now" mit der Zeit auf meinem Computer, oder bin ich Missverständnis. Danke aber –

Verwandte Themen