Zum Inhalt wechseln

Change

malzbie

malzbie

Registriert: 04. Jun 2010
Offline Zuletzt aktiv: Heute, 10:37 Uhr
*****

Im Thema:[Character Controller] Bewegung in der Luft während des Sprunges seltsam

Heute, 10:00 Uhr

Wenn ich mich kurz einmischen darf.
Ich habe mir die 3 Scripte angeschaut und bin etwas verwirrt. Mir kommt es so vor, als überschreibst du dir die Variablen gegenseitig und setzt Variablen an mehreren Stellen.

Im Sprungscript setzt du beim Knopfdruck inAir auf true. Fragst gleich danach ab, ob inAir true ist (was ja so ist, weil eben schon gesetzt).
LookRight und LookLeft ist auch in mehreren Bereichen doppelt drin.
(du fragst ab ob der Knopf für rechts gedrückt wurde. Wenn ja kommt die Abfrage ob er schon nach rechts schaut, wenn nicht drehst du ihn.
2 Abfragen weiter setzt du die Variable wieder, aber nur in einer Else....

Dann definierst du, das inAir auf false geht, wenn der Contorller isGroundet ist. Ok.
Aber in den anderen Scripten setzt du manuell inAir auf false:


if (script.inAir == true && script2.isButtonDown == false) { // nur wenn in der Luft und der andere Knopf ist nicht gedrückt
   direction = transform.TransformDirection(Vector3.left);	// meine Richtung geht nach links								
   controller.SimpleMove(direction * speed);   // bewege mich nach links
   Debug.Log("IN DER LUFT LINKS!");												  
} else {				 // ich bin nicht in der Luft ODER der andere Knopf ist nicht gedrückt											
   script.inAir = false;   // ich setze mich einfach mal auf false obwohl ich in der Luft sein könnte
   lookLeft = true;  // linke Variable wird gesetzt. Wurde aber oben schon gesetzt!
   direction = transform.TransformDirection(Vector3.left);  // es wird wieder die gleiche Richtung gesetzt
   controller.SimpleMove(direction * speed); // und auch in selbe Richtung bewegt
...

Das ist vielleicht nicht der Fehler, aber tortzdem nicht gut. Weil wenn du inAir UND ButtonDown abfragst, kann es ja durchaus sein, das inAir true ist und nur der Button nicht....oder umgekehrt. Jedenfalls setzt du inAir auf false, wenn eine der 2 Bedingungen nicht erfüllt ist. Aber warum?
inAir ist doch solange true, bis der Controler isGroundet ist. Und im Sprungscript wird inAir sowieso wieder auf true gesetzt solange er nicht am Boden ist.

In allen Scripten sind Doppelungen drin. Ich würde dir empfehlen diese Doppelungen ersteinmal zu beseitigen.
Außerdem würde ich die Scripte anders aufbauen. Und zwar nur die Touches der Buttons auswerten und diese Info an ein zentrales Script übergeben. In diesem Script hättest du dann alle Events vereinigt und könntest viel übersichtlicher programmieren, wann welche Animation kommt und wie sich der Controller bewegt. So musst du nicht irgendwelche Variablen eines anderen Scriptes zurück setzen.
Quasi so:
Wenn Touch auf Knopf links dann sende dem script links=true.
Wenn Touch auf Links zuende, dann sende dem Script links=false.
So auch für die anderen Buttons.
Im zentralen script fragst du alle Buttons ab und entscheidest was wann passieren soll.
Wenn links und rechts dann mache nix.
Wenn nur links und nicht inAir dann mache dies
Wenn nur rechts und nicht inAir dann mache das Andere.
Wenn Sprung und isGrounded dann springe und setzte inAir
Wenn inAir und links dann mache folgendes...

So sollest du es mal versuchen, denn dann ist die Gefahr des überschreibens der Variablen viel geringer und du weisst auch ganz genau, wann welche Bedingung abgefragt wird.

Ich hoffe, du verstehst was ich meine und es hilft dir. :)


EDIT: Ich habe viel zu lange gebraucht, der Thread ist ja schon viiiiel weiter! :D
Naja..

Im Thema:Analoge Tachoanzeige

Heute, 08:52 Uhr

Das macht Unity! Klar. Man muss nur hin gucken! :P

Im Thema:Audioclip per Script abspielen

Heute, 08:50 Uhr

Es gibt 2 Wege um einen AudioClip im Script zu steuern und abzuspielen.
1.
Du hängst eine Audiosource Komponente an dein Gameobjekt wo das Script drauf ist.
Geht es nur um einen Sound, kannst du den Sound gleich in die AUdiosource legen.
Geht es um mehrer Sounds, musst du dir Variablen erzeugen denen du dann im Inspector die Sounds zuweist.
Bei der Audiosource machst du aber auf jeden Fall den Haken bei "Play on Awake" raus.
Hier kommt jetzt das (pseudo)Script mit mehreren Sounds:

var sound1: AudioClip; // soundfile im inspector dieser var zuweisen
var sound2: AudioClip; // hier auch

function Update(){
   if(spiele1){
	  if(audio.isPlaying){ // läuft schon ein sound, dann aus damit
		 audio.Stop();
	  }
	  audio.clip=sound1; // wähle den Clip
	  audio.volume=1.0; // setze die Lautstärke
	  audio.Play(); // starte den Sound
	  spiele1=false; // Bedingung zurück setzen, damit der Ton nicht ständig gestartet wird.
   }
   if(spiele2){
	  if(audio.isPlaying){
		 audio.Stop();
	  }
	  audio.clip=sound2;
	  audio.volume=0.5;
	  audio.Play();
	  spiele2=false;
   }
}

Solltest du nur einen Sound schon direkt der Source zugewiesen haben, brauchst du natürlich kein clip zuweisen.

2.
Unity hat eine Möglichkeit ein komplettes Soundobjekt zu erstellen, welches sich nach dem Abspielen selber zerstört.
Das funktioniert ganz gut, ist aber nicht sehr resourcen schonend.
Auch hier nutzt du den Inspector um die Clips dem Script zuzuweisen.

var sound1:AudioClip;

function Update(){
   if(spiele1){
	  AudioSource.PlayClipAtPoint(sound1,transform.position,1.0); // man stellt bei dieser Funktion auch die Position des Sounds ein. Sehr nützlich!
   spiele1=false;
   }
}

Ich hoffe, das die Beispiele helfen.

Im Thema:Analoge Tachoanzeige

Gestern, 19:24 Uhr

@Marrrk :
Wenn du mit mono in JS programmierst, dann siehst du keine roten Linien. Mono ist ganz klar auf c# ausgelegt und hat mit JS seine schwächen. Es ist genauso, als würdest du mit einem einfachen Texteditor arbeiten.
Die Konsolenmeldungen kommen natürlich.

Im Thema:die richtigen Physikeinstellungen finden

Gestern, 09:15 Uhr

Schwieriges Thema.
Mir ist aber aufgefallen, dass dieses Zittern nur mit dem kleinen roten Würfel passiert. Somit denke ich, dass du das Problem mit größeren Maßstäben in den Griff bekommen solltest.
Du könntest außerdem noch an der Kollisionserkennung vom Rigidbody rum spielen. Es hilft manchmal, wenn man von discrete auf continous geht.
Sonst wüsste ich jetzt auch nicht was du tun kanns.