Jump to content
Unity Insider Forum

Gegner geht durch Wände


Get-Smart

Recommended Posts

Hallo

 

Ich will ein Zombie Spiel machen fürs Handy, bloß das Problem ist das die Zombies durch Wände gehen. Ich habe denn 3D Zombie Model ein BoxCollider gegenben und ihn mit einem Rigidbody belegt doch das alles hilft nichts.

 

Ich hab schon in verschiedenen Forums nachgeguckt ob es so ein Problem schon mal gab und ich bin auch fündig geworden doch die Lösung hab ich entweder nicht verstanden oder die hat nicht funktioniert. Doch irgendwie meinten die das es am script lag.

var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var myTransform : Transform; //current transform data of this enemy
var isNotDead : boolean = true;
var health : float = 100;
var Player : GameObject;


var timer: float = 300; // set duration time in seconds in the Inspector


function Awake()
{
myTransform = transform; //cache transform data for easy access/preformance
}
function Start()
{
 target = GameObject.FindWithTag("Player").transform; //target the player

}
function Update () {


 if (timer > 0){
 }
 else {
 Destroy(Player);
 }




if(health < 1){

 isNotDead = false;
 animation.Play("die");
 Destroy(gameObject, 1);
}

if(isNotDead){

 //rotate to look at the player
 myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
 Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);



 var distance = Vector3.Distance(target.position, myTransform.position);
 if (distance < 2.0f) {
	animation.Play("zombieIdle");
//GameObject.FindGameObjectsWithTag ("Player");
//Destroy (Player);
  timer -= Time.deltaTime;



 }
 else{  
  //move towards the player
  myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;

 }

}






}

function ApplyDamage1(dmg : float){
health -= dmg;
}
function OnTriggerEnter (other : Collider) {
if(other.gameObject.tag == "City") {
Debug.Log ("Enter");
moveSpeed = 0;
}
}

 

Ich hab unten auch probiert mit OnTriggerEnter zu arbeiten doch das funktioniert auch nicht (es kommt zwar keine Fehlermeldung aber es passiert auch nichts).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also einmal muss natürlich jede Wand einen Collider haben, der Zombie muss einen Collider haben und ein Rigidbody muss auch vorhanden sein.

Kollisionen werden nur ausgewertet, wenn mindestens ein Rigidbody bei den 2 Collidern dabei ist.

 

Dein Problem, da du das ja alles hast) ist die Art und Weise, wie du dich bewegst.

Du lässt der Physik, die die kollisionen berechnet keine chance, da du den Zombie direkt positionierst. Er bewegt sich nicht von Punkt a nach Punkt b, sondern wird quasi dahin teleportiert. Da umgehst du die Collider und schwupps ist der Zombie in der Wand.

 

Bewege den Zombie mal so:

transform.Translate(Vector3.forward *moveSpeed*Time.deltaTime);

Link zu diesem Kommentar
Auf anderen Seiten teilen

malzbie hat das Problem schon beim Namen genannt. transform.Position kollidiert nicht. Du musst die Griffel eigentlich komplett von transform.Position, und auch von transform.Translate, lassen wenn du mit Movement irgendwo kollidieren willst. Entweder nimmst du da einen Charactercontroller. Und dann mit Move oder Simple Move arbeiten. Oder du arbeitest mit Rigidbody und Forces.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja wie Tiles und malzbie schon sagten, das was du mit transform.position += etc. machst Teleportiert den Spieler nur statt ihn wirklich zu bewegen. Auch transform.Translate ist nicht die schönste Methode, da es auch dort immer wieder schwierigkeiten mit dem Zusammenspeil Physikengine gibt. Außerdem bieten dir dinge wie AddForce bei einem Rigidbody viel mehr Einstellungsmöglichkeiten bzw, kannst du genauer auf die Bewegung und auf die Kräfte (wenn dein Character gegen eine Wand läuft oder ein Objekt zur seite schiebt) eingehen. Schau dir mal ein paar Tutorials an, zur Bewegung von Objekten. Ich kann dir das von Sascha ans Herz legen: http://forum.unity-community.de/topic/1975-scripten-in-der-praxis-der-charactercontroller/ es hat mir auch geholfen und er erklärt auch die einzelnen Vorgehensweisen. Oder wenn es mit mehr Bild sein soll, finde ich das Tutorial von StarmanRoyal auch sehr hilfreich: http://www.youtube.com/watch?v=lPUr0VSJylw

 

Schau dir am besten beide mal an, dann wirst du auch schnell herausfinden was du falsch gemacht hast ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie, auch wenn Translate jetzt einwandfrei läuft, bedeuted das nicht, dass das auch nach dem nächsten Unity Release noch so ist. Es funktioniert gerade zufälligerweise, aber man kann nicht davon ausgehen, dass es im allgemeinen funktioniert, da es nicht über die Physik Engine läuft.

Wenn man hingegen die Physik Engine direkt nutzt, funktioniert es. Man muss übrigens nicht mir Forces arbeiten, sondern kann auch beispielsweise MovePosition nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja klar ist das nen rechter Kruscht wenn man da extra nen CC oder Rigidbody+Forces verwenden muss wenns nur ne Kleinigkeit ist. Und wenn es tut ist es auch okay.

 

Mit Rigidbody und VCC bist du aber physiktechnisch auf der sichersten Seite. Spätestens wenn du das Ding mit nem physikgesteuerten Player, Gegner oder Gegenstand interagieren assen musst kannst du mit Translate in arge Schwierigkeiten kommen. Ich habe deswegen meine sich bewegenden Plattformen auf forces umgebaut. Mein Player sprang ab und zu durch die Plattform durch. Das Ding war vorher transform.Translate basiert :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@dantus:

Das funktioniert nicht zufällig sondern ganz genauso, als wenn ich mit Move einen Rigidbodybefehl nutze oder über Forces den Körper bewege.

Es ist in all den Fällen so, dass der Körper pro Frame ein Stück geschoben wird. Wenn ein Kontakt mit einem Collider zusatnde kommt, dann wird das registriert und die Physik greift.

Ist die Bewegung zu schnell und/oder die Framerate zu gering, dann kann es sein, dass der Weg zwischen 2 Frames zu groß ist und die Kollision nicht ausgeführt wird.

Eben war er noch vor dem Collider und im nächsten Frame ist er schon dahinter.

Klar, beim Rigidbody habe ich noch ein paar Sachen, die diesen Missstand überprüfen und korrigieren können. Aber auch da nur bis zu einem gewissen Punkt.

 

@tiles:

Physik ist auch immer performance. Wenn man für iOS programmiert, wird man schnell auf gewisse Dinge verzichten lernen. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie, da muss ich dir widersprechen. Im allgemeinen funktioniert es nicht, wenn du direkt die Position über ein Transform modifizierst. Nimm das Beispiel von Tiles. Wenn der Spieler auf etwas beweglichem steht, was ja nicht ein allzu spezieller Fall ist, musst du häufig extrem tricksen, damit es auch in Kombination mit Translate oder direkten Modifikationen der Position funktioniert.

Wenn man aber von Anfang an auf Rigidbodies setzt, ist man ganz klar auf der stabileren Seite.

Für die Physik Engine ist es ein Unterschied, ob die Bewegung über ein Rigidbody oder ein Transform ausgeführt wird. Aus dem Grund wird es instabil, wenn ein Spieler sich auf einem physikalischen Objekt befindet, aber über Transform gesteuert wird.

Die Bewegung über Transform sollte in Update passieren, während physik-basierte Bewegungen in FixedUpdate gemacht werden sollten. Da Update und FixedUpdate nicht je einmal pro Frame aufgerufen werden, ist deine Aussage im allgemeinen nicht richtig. Die physikalischen Objekte können pro Frame mehrmals korrigiert werden, abhängig von Fixed Timestep.

Natürlich gibt es auch da ab bestimmten Geschwindigkeiten ein Tunneling.

 

Auch wenn es für dich funktioniert, technisch gesehen ist es im allgemeinen falsch. Für deinen Fall mag es stimmen, du musst aber einige Abstriche in Kauf nehmen, damit es auch stabil bleibt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@dantus:

Es geht mir nicht darum euch zu bekehren. Ich will und kann nicht sagen, dass transform.translate besser ist als ein move eines rigidbodys.

 

Ich wehre mich aber gegen Aussagen, die aus der Luft gegriffen sind.

Was hat translate mit den Unity Version zu tun?

Wieso kann ich mein translate nicht genauso in der FixedUpdate ausführen?

Wo ist die Physikengine entscheidend für die Bewegung eines Körpers von a nach b?

 

translate moved genauso gut oder schlecht wie ein rigidbody.

Die collision wird nicht über die Bewegung ausgewertet, sondern über den Collider!

Es wird ja weiterhin ein Rigidbody und ein Collider genutzt.

 

Ich brauche bei einem einfachen IOs Spiel wo sich langsame Zombies bewegen einfach keine erweiterten Physiken. Ich kann sogar die Collider weg lassen und arbeite über Entfernungen oder Rasterarrays!

 

Aber darum geht es nicht. Ich habe lediglich eine Möglichkeit aufgezeigt, mit der sein Vorhaben funktioniert und die performant ist.

Da müssen wir nicht um gewisse Gegebenheiten phillosophieren.

Und ein "könnte sein, dass... " lasse ich nicht so ohne weiteres gelten. Bau mir ein Beispiel, wo translate versagt und move nicht.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine Konstruktion über Raycasts geht aber komplett am Collisioncase über Physik vorbei. Wenn du irgendwo Physik drinhast solltest du auch mit Physik weitermachen. Das ist zumindest meine Meinung dazu.

 

Natürlich führen viele Wege nach Rom. Und letztenendes ist erlaubt was funktioniert :)

 

Bau mir ein Beispiel, wo translate versagt und move nicht.

 

Ein Beispiel habe ich oben schon gebracht. Ich hatte eine Plattform die über Translate horizontal bewegt wurde. Und immer mal wieder fiel mein Player beim draufspringen durch die Plattform durch. Das passiert nun mit meiner Rigidbodylösung nicht mehr. Die Plattform stoppt am Player ab. Und wandert nicht mehr durch ihn hindurch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Tiles: Wenn ich über Entfernungsmessungen gehe, dann muss es nicht zwangsläufig mit nem Raycast gemacht werden. Außerdem hätte ich dann auch gar keine Collider mehr drin. ;) Da geht also nix vorbei.

 

Ja, du hast erwähnt, dass du Probleme mit nem Aufzug hattest. Das ist aber noch kein Beweis. Ich will schon sehen, dass der Code auch in Ordnung ist. ;)

 

 

In unserem Spiel DungeonLore mache ich ALLES mit translate. Jedes Monster und der Player nutzen es. Da gab es noch nie ein Problem mit ner Kollision. Selbst wenn viel im Screen ist und das iPad1 auf 15FPS runter geht, funktioniert die Kollision tadellos.

Ich behaupte nicht einfach das es funktioniert sondern spreche aus Erfahrung.

 

 

Natürlich kann es sein, dass es gewisse Konstellationen gibt, wo translate Fehler bringt. Das passiert aber auch bei anderen Funktionen oder Befehlen in Unity.

 

Und ganz wichtig: Wenn die Zombies nicht Aufzug fahren müssen, was spricht dann noch gegen translate?

Du gibst doch deinen Objekten auch nur die Sachen mit, die sie auch machen müssen. Oder können alle deine physikalischen Objekte auch schwimmen, fliegen und schweben? ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Malzbie, wenn wirklich alles über Translate läuft ist das wieder eine andere Geschichte. Das läuft im Update. Physikgeschichten aber im Fixed Update. Die Mischung macht die Sache haarig. Und Kollisionen sind in Unity leider eh eine ganz spezielle Geschichte bei der ich auch heute noch gern und viel fluche -.-

 

Ja, du hast erwähnt, dass du Probleme mit nem Aufzug hattest. Das ist aber noch kein Beweis. Ich will schon sehen, dass der Code auch in Ordnung ist. ;)

 

Ich wüsste jetzt nicht was man bei einem transform.Translate(Vector3.forward *moveSpeed*Time.deltaTime); grossartig falsch machen könnte. Mit genau dem Code läuft mir eine Plattform die mir entgegenkommt schlicht durch meinen CC durch. Und genau das war das Problem mit der Plattform. Kam man beim aufspringen auch nur leicht auf die Kante wars das. Dann wanderte die Plattform durch den Player, bzw. er fiel dann halt runter weil er keine Boden mehr hatte :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Get-Smart:

Prima. :)

 

@ Tiles:

Ach im zusammenhang mit einem CC!!! Ja das ist natürlich was Anderes. Aber der CC ist eh nicht so dolle. Wenn du bei dem z.B. den Collider in der Größe änderst (weil er z.B. gerade am Springen ist und sich zusammen gezogen hatte) dann flutscht der auch durch stehende Objekte durch. In dem Falle würde ich ganz klar auf den CC tippen, weil der ja ständig nach unten gedrückt wird.

Sei's drum. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...