Jump to content
Unity Insider Forum

movespeed von einem anderen skript aufrufen


acidrain83

Recommended Posts

hy

 

also ich habe eine kugel und einen Charaktercontroller. und der Kugel habe ich  ein Skript hinzugefügt ,und ich will von diesem Skript aus  auf die Variable für die Bewegungsgeschwindigkeit des Charaktercontrollers zugreifen. wie kann man das machen? mit GetComponent<>? bitte um tipps thx

 

 

EDIT: und noch ne kleine frage und zwar hab ich diesen code hier:

#pragma strict

var followobject : Transform; // wird im Inspector ausgewählt
private var targetobject : GameObject;
var distance : int;
var pos_x : float ; 
var pos_y : float ;

function Awake () {
	pos_x = gameObject.transform.position.x;
	pos_y = gameObject.transform.position.x;
	targetobject = GameObject.Find("RollerBall");


}

function Start () {

}

function Update () {
distance = Vector3.Distance(targetobject.transform.position.,followobject.transform.position.);

}

 

bitte nicht über den code allzu schlecht urteilen bin erst am anfang vom lernen....

also geht es das ich in der update function  nur direkt die position x vom targetobject und followobject abfrage?

 

 

 

EDIT2: und ich hab auch noch diesen code hinzugefügt aber es gibt probleme mit dem GameObject

if (distance <5 || distance > 5)
{
    followobject.transform.position = Vector3.Lerp(followobject.position,targetobject.position);

}

 die fehlermeldung lautet dann:

"position" is not a member of UnityEngine.GameObject

 

wie kann ich das sonst schreiben? oder besser noch wie kann ich im skript sagen das targetobject direkt das objekt sein soll wo ich das skript hinzugefügt habe?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich schreib mal alles, was mir so einfällt und hoffe, damit das richtige abzudecken :)

Fangen wir mal hierbei an.

Du weist ja einen neuen Vektor zu, und zwar dieser Eigenschaft:

followobject.transform.position = ...

Hierbei kannst du das "transform" weglassen, denn "followobject" referenziert bereits die Transform-Komponente. Nun ist es aber so, dass alle Komponenten alle Komponenten auf ihrem GameObject kennen - und damit meine ich nicht "alle anderen"! Du kannst z.B. die Licht-Komponente nach der Transform-Komponente fragen oder umgekehrt. Du kannst aber auch die Transform-Komponente nach der Transform-Komponente fragen, und genau das tust du hier.

Man kann also auch schreiben:

followobject.transform.transform.transform.position = ...

ist aber nicht sinnvoll :)

Weiter rechts jedenfalls machst du das auch und schreibst direkt "followobject.postition".

Weiter zur Exception.

Noch weiter rechts schreibst du

targetobject.position

und das geht nicht. Der Grund: Während deine Variable "followobject" eine Transform-Komponente referenziert, ist "targetobject" vom Typ GameObject. Hier musst du also schreiben

targetobject.transform.position

oder, was ich eher empfehlen würde, du änderst die Definition von "targetobject" und schreibst auch

private var targetobject : Transform;

und entsprechend in Awake

targetobject = GameObject.Find("RollerBall").transform;

Du verlagerst also einfach das ".transform" von Update nach Awake. Das ist gut, weil es dann nur einmal aufgerufen werden muss.

Als nächstes:

vor 16 Stunden schrieb acidrain83:

also geht es das ich in der update function  nur direkt die position x vom targetobject und followobject abfrage?

Jau:

Debug.Log(Vector3.Distance(targetobject.transform.position, followobject.transform.position)); // Distanz ausgeben
Debug.Log(followobject.position); // Position ausgeben

Beachte die Punkte, die ich aus der ersten Zeile entfernt habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

also ich habe eine kugel und einen Charaktercontroller. und der Kugel habe ich  ein Skript hinzugefügt ,und ich will von diesem Skript aus  auf die Variable für die Bewegungsgeschwindigkeit des Charaktercontrollers zugreifen. wie kann man das machen? mit GetComponent<>?

Ja. Aber erstmal musst du aber dein Charakter Objekt, oder Script an dein Kugel Script einbinden.

Als Erstes erstellst du public Variable z.b als GameObject:

public GameObject spieler;

Dann erscheint auf dem Script eine neue Variable Spieler, da kannst du dein Spieler Objekt einbinden.

Jetzt kannst du im Script auf deine Spieler Variablen wie Geschwindigkeit zugreifen:

public GameObject spieler;

void Start() {
	spieler.GetComponent<Scriptname>().speed = neuerWert;
}
Zitat

EDIT2: und ich hab auch noch diesen code hinzugefügt aber es gibt probleme mit dem GameObject


if (distance <5 || distance > 5)
{
    followobject.transform.position = Vector3.Lerp(followobject.position,targetobject.position);

}

die fehlermeldung lautet dann:

"position" is not a member of UnityEngine.GameObject

Warum du die Fehlermeldung bekommst, hat schon Sascha erklärt. Allerdings wenn du das gefixt hast, wirst du noch eine Fehlermeldung bekommen und zwar wegen Lerp. Dieser erwartet neben zwei Vector3, noch einen dritten float Parameter.

hier kannst du genauer über die Funktion nachlesen : https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html
 

Und noch eine Kleinigkeit nebenbei, statt:

if (distance <5 || distance > 5) {}

kann man auch:
 

if (distance != 5) {}

schreiben :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

woow also erstmal danke euch für die tollen antworten

 

aber ich muss dazusagen das ich UnityScript benutze und vielleicht ist deshalb der ein oder andere fehler doch keiner?oder auch nicht . lol

und ich weiß das UnityScript nicht aktuell oder gut ist aber dieser kurs ist leider noch für diese sprache.aber ich mache ihn trotzdem noch weiter

weil  ich denke das ich trotzallem noch einiges dazulernen kann.   danach mache ich kurse mit c# als programmiersprache.  (angefangen hat alles mit GAMEMAKER)

 

 

ich weiß jetzt nicht ganz genau ob diese frage beantwortet wurde oder nicht weil ich es nur schnell durchlesen konnte und mir noch nicht die zeit nehmen konnte alles zu verstehen.was aber noch kommt. deshalb frage ich hier nochmal.

 

ich hab ein script das ich einer kugel hinzugefügt habe.

und in diesem script will ich eine variable erstellen die diese kugel beinhaltet.

 

und gibt es zufällig eine DEUTSCHE DOKUMENTATION von Unity? also natürlich hab ich schon gesucht aber nichts gefunden.doch vielleicht hat ja jemand privat etwas dergleichen erstellt.

 

weitere Fragen und Antworten zu euren Posts werde ich geben wenn ich am Abend genug zeit habe dafür.Mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb acidrain83:

und gibt es zufällig eine DEUTSCHE DOKUMENTATION von Unity? also natürlich hab ich schon gesucht aber nichts gefunden.doch vielleicht hat ja jemand privat etwas dergleichen erstellt.

Wir haben mal angefangen, das als Community zu übersetzen, das hat sich aber im Sand verlaufen. Auf lange Sicht kommt man sowieso nicht um Englisch herum.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok ja wahrscheinlich hast du recht.

 

ich bräuchte noch nen kleinen tipp und zwar gibt es die möglichkeit in einem skript abzufragen ob im Inspector eine bestimmte variable assigned wurde bzw eine zahl vergeben wurde?

ich habe die variable  distance und dafür jetzt diesen code:

 

function Update () {


dis = Vector3.Distance(followobject.transform.position,targetobject.transform.position);

if (dis != distance)
{
   followobject.transform.position = Vector3.Lerp(followobject.position,targetobject.transform.position,Time.deltaTime * 0.5);

   }
}

 

das problem ist das sich das followobject erst bewegen soll wenn man im inspector der variable distance etwas zugewiesen hat.

doch er bewegt sich natürlich gleich weil unity es ja so macht das wenn man eine variable nicht gleich mit einem wert initialisiert vergibt er eine 0.

und da die variable  dis    nicht gleich distance ist bewegt er sich auch sofort.

kann man das irgendwie abfragen?

 

 

und noch eine kleine aber wichtige frage:

es hat auch mit dem code von diesem post zu tun. ich hatte ja   "if distance != 5" und das followobject bewegte sich auch nur bis zu einer distance von 5.aber sobald ich mit meinem targetobject springe springt das followobject zwar auch aber nicht so hoch und es geht dann plötzlich bis zur position des targetobjects.und wenn ich mit dem targetobject nach links gehe also mich dem followobject nähere und somit die distance unter 5 ist kommt das followobject auf die position vom targetobject. wie mache ich das es dann trotzdem die distanz einhaltet und dann in die andere richtung geht?

 

und kann man auch so auf eine variable von einem anderen skript zugreifen?

move = GetComponent<Ball>().m_MovePower;

weil ich will die variable nicht verändern sondern einfach den speed übernehmen.

und ich hab den code versucht von TheOnlyOne aber der funktioniert bei mir nicht   ist der auch für UnityScript?oder nicht.

oder was mache ich falsch...

 

danke für eure hilfe tut mir leid falls ich viel schreibe aber will natürlich alles wissen...lol

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb acidrain83:

weil unity es ja so macht das wenn man eine variable nicht gleich mit einem wert initialisiert vergibt er eine 0.

Das ist nicht Unity. Das macht jede Programmiersprache so, die ich kenne.

Wenn du nicht willst, dass das Script arbeitet, deaktiviere es mit enabled. Wenn nur ein Teil des Scripts nicht ausgeführt werden soll, brauchst du ein boolean-Feld, dessen Wert in einer if-Abfrage abgefragt wird.

vor 4 Stunden schrieb acidrain83:

und noch eine kleine aber wichtige frage:

Ist ziemlich unmöglich, da zu folgen. Ohne weiteren Code oder wenigstens ein paar Bildern was da passiert kann man da schwer helfen.

vor 4 Stunden schrieb acidrain83:

und ich hab den code versucht von TheOnlyOne aber der funktioniert bei mir nicht   ist der auch für UnityScript?oder nicht.

Nein, das ist C#.

vor 4 Stunden schrieb acidrain83:

weil ich will die variable nicht verändern sondern einfach den speed übernehmen.

Du willst den Wert einer Variable für eine Kalkulation benutzen? Dann kannst du die Variable einfach in deine Formel einbauen.

Wie bereits besprochen, kannst du dafür den Namen der Klasse deiner Komponente benutzen, um ein Feld zu definieren.

var ball : Ball;

Dann ziehst du da deinen Ball rein und kannst mit dessen öffenltichen Werten arbeiten.

Debug.Log(ball.m_movePower);

"ball.m_movePower" kannst du dann benutzen, wie du willst. Dazu gehört, es in eine mathematische Formel einbauen oder an eine Methode wie Vector3.Lerp übergeben zu können, sofern der Typ des Wertes passt. GetComponent ist da erst einmal nicht vonnöten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

und ich hab den code versucht von TheOnlyOne aber der funktioniert bei mir nicht   ist der auch für UnityScript?oder nicht.

UnityScript wird von Unity nicht mehr unterstützt, du machst dir nur unnötig schwer. Programmier gleich in C#, denn alle moderne Tutorials sind auch in C#.

Zitat

das problem ist das sich das followobject erst bewegen soll wenn man im inspector der variable distance etwas zugewiesen hat.

Ich weiß nicht ob man das irgendwie prüfen kann, ob Variable per Script oder per Inspector initialisiert wurde. Man könnte aber den Zustand der Variable abspeichern und erst nach ersten Veränderung erst bewegen lassen. Aber damit macht man sich unnötig kompliziert und es ist sinnvoller einer neue bool Variable zu erstellen und mit ihr im Inspektor das Verfolgen zulassen oder nicht. z.B:

public bool follow;
...
if(dis != distance && follow)
{
	///mach was
}

 

Zitat

es hat auch mit dem code von diesem post zu tun. ich hatte ja   "if distance != 5" und das followobject bewegte sich auch nur bis zu einer distance von 5.aber sobald ich mit meinem targetobject springe springt das followobject zwar auch aber nicht so hoch und es geht dann plötzlich bis zur position des targetobjects.und wenn ich mit dem targetobject nach links gehe also mich dem followobject nähere und somit die distance unter 5 ist kommt das followobject auf die position vom targetobject. wie mache ich das es dann trotzdem die distanz einhaltet und dann in die andere richtung geht? 

Das liegt daran, dass wenn deine Distance genau 5 ist, verfolgt dein Objekt nicht. Er folgt dir also immer, außer wenn distance genau 5 ist. Deine If-Anweisung macht aus logischer Sicht so wenig Sinn :D Willst du machen, dass das Objekt nur dann folgt wenn Distance nicht größer als 5 ist? Dann geht das so:
 

if(dis <= distance && follow) //mit follow bool Variable
{
//mach was
}
Zitat

move = GetComponent<Ball>().m_MovePower;

genau so geht das, und deine m_MovePower wird da auch nicht verändert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok danke für eure tollen antworten.

@TheOnlyOne

also ich will machen das die kugel   also das "followobject"  den charakter also das "targetobject"  auf der x und y achse verfolgt mit einem frei einstellbaren abstand den man im inspector einstellen kann.

mit dem code den ich geschrieben hab im letzen post verfolgt das "followobject" das "targetobject" auch . aber nicht auf der y achse(zumindest nicht richtig wie oben schon beschrieben)

und es funktioniert auch nur wenn ich nur nach rechts gehe mit dem targetobject.

 

danke für eure hilfe ich weiß für euch ist das kindergarten code aber wie gesagt bin ich noch am anfang!

ich werde mir mehr zeit nehmen müssen um das zu meistern.

 

ach noch eins:

wegen vector3.lerp.....   der erste punkt in den klammern ist  die position von wo gestartet werden soll, der zweite punkt die zielposition und die dritte ist dann die geschwindigkeit oder?

und die geschwindigkeit kann alles mögliche sein oder?bedeutet das wenn ich bei der geschwindigkeit -0.5 nehmen würde das er dann auf die andere seite gehen würde? weil in der dokumentation steht etwas von 

When t = 0 returns a. When t = 1 returns b. When t = 0.5 returns the point midway between a and b

das verstehe ich nicht ganz. würde mich über eine erläuterung freuen.

 

mfg

 

 

 

EDIT:

habs jetzt so gemacht:

var eingabe : boolean = false;
var distance: int;
var dis: int;
function Update () {

dis = Vector3.Distance(followobject.transform.position,targetobject.transform.position);


if (distance !=0 && distance != dis)
{
	eingabe = true;
	followobject.transform.position = Vector3.Lerp(followobject.position,targetobject.transform.position,Time.deltaTime * 0.5);
	Debug.Log("Wert wurde geändert und ist bereit");
}
}

und das mit dem boolean war ne gute idee! das funktioniert auch jetzt toll. ausser halt das mit der y achse und das ich nur rechts gehen kann. aber ich mach mir noch mehr gedanken dazu.danke für eure tollen tipps.

 

aber ich benutze für den charakter den rollerball. und der wird je nachdem wie lange man eine taste hält immer schneller. ich hab die distanz zum beispiel auf 7 gestellt und dadurch  das der rollerball immer schneller wird ,springt die anzeige der distanz manchmal auf 8 und dann wieder 7. kann man das auch lösen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb acidrain83:

var distance: int; var dis: int;

Warum int und nicht float, sicher dass das so funktioniert?
Warum bei dir auf der Y-Achse nicht funktioniert, kann ich nicht sagen. Könnte vllt wegen Steuerung sein, oder wegen Achsen Blockierung.
 

Zitat

das verstehe ich nicht ganz. würde mich über eine erläuterung freuen.

Du hast z.B 10 Unitmeter abstand zwischen Start Position und Ziel Position. Die dritte float Variable akzeptiert nur Werte im Bereich zwischen 0 und 1. Sie bestimmt, wie stark sich beim Aufruf dieser Funktion, Startobjekt zum Zielobjekt bewegt, bezogen auf die gesamt Distanz. Stelle dir am besten das Ganze im Prozentsatz vor. Beim 0, bewegt er sich gar nicht. beim 0.1 bewegt er sich 10% der Distanz, beim 0.5 bewegt er sich 50% der Distanz und beim 1 natürlich 100%, also gesamte Distanz pro Aufruf.

Du hast bei dir da Distanz 5 Unitmeter, oder? Und hast beim dritten Parameter 0.5 stehen. Das sind also 50% von 5 Unitmeter. 50% von 5 Unitmeter ergeben 2,5 Unitmeter. Das heißt, beim ersten Lerp Aufruf bewegt sich dein FollowObjekt gleich um 50% zu dem Target. Und das ganze passiert in einem Frame. Sprich du siehst ihn 5 Meter entfernt und zack plötzlich ist er nur noch 2,5 meter entfernt von dem Target, ist also alles andere als flüssige Verfolgung, sondern mehr eine Teleportation :D

Beim nächsten Update() Aufruf wird bei dir die Position zwischen FollowObject und Target erneut berechnet. Angenommen dein Target hast du gar nicht bewegt in der Zeit, dann beträgt die neue Distanz zwischen beiden Objekten 2,5 Meter. Dann wird wieder Lerp Funktion aufgerufen, und wieder wird Follow Objekt um 0,5 (50%) der Distanz zu dem Target Objekt "teleportiert".
Rechnen wir wieder mal. 50% von 2,5 Meter macht 1,25 Meter. Beim dritten Update() Aufruf von 1,25 Meter 50% macht 0.625 Meter und so weiter bis das Objekt sich fast im Zielobjekt befindet.

Ich hoffe du hast es soweit verstanden. Damit das Ganze etwas flüssiger abläuft, sollte also dritter Parameter deutlich kleiner sein als 0,5. Am besten experementierst du selbst damit ein wenig.

Was dir vermutlich noch aufgefallen ist, dass mit jedem Aufruf die Distanz, die Follow Objekt zurücklegt, immer kleiner wird. Und somit verlangsamt sich FollowObjekt. Es ist also keine konstante bzw. lineare Verfolgung. Viele Unity Entwickler nennen es Smooth Movement. Ob du es genau so haben willst, liegt ganz an dir. Wenn es bei deinen Follow und Target Objekten um Personen handelt, dann ist das vielleicht sogar die bessere Wahl. Ansonsten gibt MoveTordwards Funktion als Alternative mit lineare Bewegung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb TheOnlyOne:

genau so geht das, und deine m_MovePower wird da auch nicht verändert.

Bitte nicht GetComponent in einem Kontext verwenden, wo es immer wieder aufgerufen wird.

vor 12 Stunden schrieb Sascha:

GetComponent ist da erst einmal nicht vonnöten.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke für eure tollen antworten werde mir später zeit nehmen um sie mir durchzulesen und weiter daran zu arbeiten.

vielleicht funktioniert es nicht auf der y achse weil ich den controller für den rollerball benutze...vielleicht sollte ich einfach den firstperson character controller verwenden.

 

ja mit int funktioniert es. ich wollte nicht float machen da es nicht unbedingt so genau sein muss .

weitere antworten und fragen folgen dann später wenn ich zeit habe. danke für alles mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...