PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einheiten AUF Gebäuden platzieren


DerFlamer
10.03.2013, 10:14
Hallo,
ich hoffe dieser Post ist in der richtigen Kategorie, da es ja bei Usermade Missions anscheinend nur um fertige Missionen geht.

Meine Frage ist ob es ein (einfaches) Skript gibt welches mir erlaubt Einheiten bei ihrer Initialisierung auf ein Gebäude zu verschieben.

Mir ist bewusst dass man mit 'Elevation' die Höhe angeben kann, allerdings funktioniert es auf diese Weise nur mit viel Ausprobieren, da die Einheiten manchmal im Gebäude hängen oder aber mehrere Meter fallen.

MfG,
DerFlamer

Asso-Loki
10.03.2013, 11:19
Naja, eine "einfache" rundum-glücklich Lösung wird es dazu wohl nicht geben, aber folgender Ansatz kann weiterhelfen:

Einheit neben dem gewünschten Gebäude platzieren. In die init- Zeile der Einheit folgender code: nul= this execVM "scriptname.sqf"Das Script dazu: _soldat= _this;
_haus= nearestObject [position _soldat, "Building"];
_hausMass= boundingBox _haus;
_hoehe= ((_hausMass select 1) select 2);
_soldat setPos (_haus modeltoworld [0,0,_hoehe]);Der Soldat wird etwa in der Mitte des Dachs platziert.

Soll der Soldat aber nicht in der Mitte des Dachs stehen, sondern an einem der Dachränder oder Ecken, braucht es die Mitgabe von mehr Parameter an das Script um den Befehl "boundingBox" entsprechend auszuwerten.

DerFlamer
10.03.2013, 11:47
Hallo loki,

danke erstmal für deinen Code :)
Ich habe leider (sehr) wenig Ahnung vom Skripten in Arma, da ich mich erst seit einigen Tagen damit beschäftige.

Zum Verständnis:


_soldat= _this;
_haus= nearestObject [position _soldat, "Building"];

oder (?)
_haus= nearestObject [position _this, "Building"];

Erklärt sich von selbst.


_hausMass= boundingBox _haus;
_hoehe= ((_hausMass select 1) select 2);


Was genau liefert "boundingBox" für Werte? Eine Variable mit Höhe, Breite und Länge? Naja, kann mir ja erstmal egal sein solange es funktioniert :)

_soldat setPos (_haus modeltoworld [0,0,_hoehe]);
Wenn ich das richtig verstehe, wird hier die Entfernung vom Boden der Mitte des Hauses aus das Objekt platziert. - Könnte man nicht einfach von der Startposition des Objektes aus die Höhe verändern?

MfG,
DerFlamer

JoeJoe87577
10.03.2013, 11:51
Guckst du Wiki http://community.bistudio.com/wiki/boundingBox
Die beiden Links hier am besten speichern, hilft meistens weiter:
http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2 (Die funktionieren auch in ArmA 3) und http://community.bistudio.com/wiki/Category:Arma_3:_New_Scripting_Commands_List

DerFlamer
10.03.2013, 11:54
Würde das funktionieren?


_hausMass= boundingBox nearestObject [position _this, "Building"];
_hoehe= ((_hausMass select 1) select 2);
this setPos[getPos this select 0,getPos this select 1,(getPos this select 2)+_hoehe];


Quelle:
Dinge schweben lassen mit "this setpos" / Funktioniert "this setunitpos" nicht mehr? - Forum des German Gamers Club e.V. (http://www.g-g-c.de/forum/showthread.php?t=3872)

DerFlamer
10.03.2013, 12:04
Hallo Joe,

ein Ja hätte mir auch gereicht ;)
Ich kannte die Seite schon habe aber nicht nachgeguckt weil es mir wie schon gesagt nicht so wichtig ist (solange es funktioniert) :)

Da ich es jetzt allerdings verstehe könnte ich mir ein paar Skripte machen die jeweils eine Position auf dem Dach eines Gebäudes abdecken, wobei ich damit sehr eingeschränkt wäre.

Ich teste jetzt mal meinen zusammengebastelten Code.

MfG,
DerFlamer

JoeJoe87577
10.03.2013, 12:19
War auch nicht böse gemeint, nur als Info.
Aber ein kleiner Denkanstoß, die boundingBox gibt dir doch max und min Werte zurücke, mach dir doch ein Script, dass zwischen diesen max und min werten zufällig auswählt und dann da Einheiten plaziert.

DerFlamer
10.03.2013, 13:05
Ich hab's auch nicht böse verstanden ;)

Gute Idee, aber im Moment möchte ich dass sie genau da stehen wo ich sie haben will, was allerdings nicht wirklich funktioniert.

Ich habe im Missionsverzeichnis (C:\Users\NAME\Documents\Arma 3 Alpha\missions\MISSION) ein Skript mit dem Namen "PlaceOnTop.sqf" erstellt.

Ich habe es einmal mit diesem Code

_hausMass= boundingBox nearestObject [position _this, "Building"];
_hoehe= ((_hausMass select 1) select 2);
this setPos[getPos this select 0,getPos this select 1,(getPos this select 2)+_hoehe];

und einmal mit diesem

_hausMass= boundingBox nearestObject [position _this, "Building"];
_hoehe= ((_hausMass select 1) select 2);
this setPos[getPos this select 0,getPos this select 1,(getPos this select 2)+_hoehe+1];

versucht. Im zweiten Code ist die Höhe inkrementiert worden.

In dem Initialization-Feld steht jetzt dieser Code

nul= this execVM "PlaceOnTop.sqf";


Allerdings scheint das Skript nicht zu funktionieren, der Soldat steht im Haus :(

Asso-Loki
10.03.2013, 15:23
Das hast Du schön "rationalisiert". :daumen:

Deine letzte Zeile hat einen Syntax- Fehler (Unterstrich beim _this vergessen) und einen kleinen Logik- Fehler (statt getpos _this select 2 + irgendetwas reicht schlicht _hoehe).

Und weil Du es so gerne "rationalisiert" magst halt so :D
_this setPos [getpos _this select 0, getpos _this select 1, ((boundingBox ( nearestObject [position _this, "Building"]) select 1) select 2)]; für das Script oder gleich so this setPos [getpos this select 0, getpos this select 1, ((boundingBox ( nearestObject [position this, "Building"]) select 1) select 2)] direkt in der Init- Zeile der Einheit (hierbei aber alle Unterstriche bei this weglassen).

Allerdings ist der Code so etwas "Fehleranfälliger". Zum einen muss man wieder im Editor die Einheit genau Positionieren. Da man sich aber in der 2-D- Ansicht des Editors nicht immer auf die vollständige Übereinstimmung der Gebäude- Icons mit dem tatsächlichen Objekt verlassen kann (zumindest in den bisherigen Teilen), kann das gerne mal mehrere Anläufe brauchen, bis die Einheit dort steht, wo man sie haben möchte.

In Missionen bei welchen viele Objekte initialisiert werden müssen, können zeitliche Verschiebungen bei der Abarbeitung auftreten. Das kann zur Folge haben dass eine Einheit z.B. zuerst vom Kollisionsmodell des Gebäudes leicht verschoben wird, bevor sein Initialisierungs- Code ausgeführt wurde und deshalb nicht exakt dort steht, wo man sie gerne hätte. Im schlimmsten Fall wird die Einheit nach ausserhalb des Gebäudes verschoben und steht dann auch nach Abarbeitung ihres Initialisierungs- Code ausserhalb des Gebäude, respektive fällt aus der vorgegeben Höhe auf den Boden und ist dann eventuell verletzt oder gar futsch.

Aufgrund meiner teilweisen echt bizarren Erfahrungen mit scripten in ArmA, bevorzuge ich eher möglichst stabile Lösungen mit etwas mehr Variablen- Einsatz und "aufwendigerem" Vorgehen (modelToWorld).

Trotzdem empfehle ich Dir erstmal die Variante welche Du gleich in die Init- Zeile der Einheit schreiben kannst. Das machst Du einmal, danach kopierst Du die Einheit beliebig oft und setzt sie zu den Gebäuden Deiner Wahl. Tauchen dabei "Überaschungen" auf, kannst Du Dich dann ja immer noch mit "aufwendigeren" Lösungsansätzen beschäftigen.

DerFlamer
10.03.2013, 16:20
Das hast Du schön "rationalisiert".


Dankeschön :D


Deine letzte Zeile hat einen Syntax- Fehler (Unterstrich beim _this vergessen)


Das ist dämlich :sauer:


einen kleinen Logik- Fehler (statt getpos _this select 2 + irgendetwas reicht schlicht _hoehe).


Jap, absolut falsch den zu übernehmen :D


Und weil Du es so gerne "rationalisiert" magst halt so


Wie kommst du eigentlich dazu diesen Begriff zu nehmen? Ich hätte einfach "zusammenfassen" gesagt ;)


Allerdings ist der Code so etwas "Fehleranfälliger". [...]
n Missionen bei welchen viele Objekte initialisiert werden müssen, können zeitliche Verschiebungen bei der Abarbeitung auftreten. Das kann zur Folge haben dass eine Einheit z.B. zuerst vom Kollisionsmodell des Gebäudes leicht verschoben wird, bevor sein Initialisierungs- Code ausgeführt wurde und deshalb nicht exakt dort steht, wo man sie gerne hätte.


Das war mir bewusst, das nehme ich aber (grade) für hohe (und seltene) Gebäude, die ich nicht kenne gerne in Kauf. Von einer Sorte Türme weiß ich inzwischen aber dass ich Einheiten 4,6m hoch setzen muss :)


Aufgrund meiner teilweisen echt bizarren Erfahrungen mit scripten in ArmA, bevorzuge ich eher möglichst stabile Lösungen mit etwas mehr Variablen- Einsatz und "aufwendigerem" Vorgehen (modelToWorld).


Das merke ich mir, danke! :)


Und nochmal zu dem "rationalisieren"/zusammenfassen:

Ich finde sowas wie
_soldat= _this;
nicht wirklich nötig.
Ich mag es nicht ganz ausführlich aber auch nicht in einer Zeile, ich ziehe die goldene Mitte vor ;)

Nochmal vielen Dank! :) :daumen:

Asso-Loki
10.03.2013, 23:56
"Rationalisieren" fand ich auch nicht toll, aber weil mir nichts besseres in den Sinn gekommen ist - wie zusammenfassen - hab ich es halt in Anführungszeichen verwendet. :ugly:

_Soldat= _this ist wirklich nicht unbedingt nötig. Ich konnte aber auch nicht wissen, was ich Dir zumuten kann ;), deshalb lieber deutlich und ausführlich, damit Du besser nachvollziehen kannst, was es bezweckt.