Hallo zusammen, bei einigen Tests im Asset-Editor kam mir gerade eine echt Irre frage auf.
Warum sind die folgenden Programm-Zeilen bisher noch nicht als Mod für denn Asset-Editor umgesetzt worden ???
//building rotors (cube)
var shader = Shader.Find("Custom/Vehicles/Vehicle/Rotors");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as BuildingInfo;
if(asset.m_material != null) asset.m_material.shader = shader;
if(asset.m_lodMaterial != null) asset.m_lodMaterial.shader = shader;
var w = new Color(255f / 255, 255f / 255, 255f / 255, 1f);
asset.m_material.SetColor("_ColorV0", w);
asset.m_material.SetColor("_ColorV1", w);
asset.m_material.SetColor("_ColorV2", w);
asset.m_material.SetColor("_ColorV3", w);
//prop rotors (stairs and water)
var shader = Shader.Find("Custom/Vehicles/Vehicle/Rotors");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as PropInfo;
if(asset.m_material != null) asset.m_material.shader = shader;
if(asset.m_lodMaterial != null) asset.m_lodMaterial.shader = shader;
var w = new Color(255f / 255, 255f / 255, 255f / 255, 1f);
asset.m_material.SetColor("_ColorV0", w);
asset.m_material.SetColor("_ColorV1", w);
asset.m_material.SetColor("_ColorV2", w);
asset.m_material.SetColor("_ColorV3", w);
//building nobase (store)
var shader = Shader.Find("Custom/Buildings/Building/NoBase");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as BuildingInfo;
if(asset.m_material != null) asset.m_material.shader = shader;
if(asset.m_lodMaterial != null) asset.m_lodMaterial.shader = shader;
var w = new Color(255f / 255, 255f / 255, 255f / 255, 1f);
asset.m_material.SetColor("_ColorV0", w);
asset.m_material.SetColor("_ColorV1", w);
asset.m_material.SetColor("_ColorV2", w);
asset.m_material.SetColor("_ColorV3", w);
Alles anzeigen
Dabei sind es in wirklichkeit ja gerade mal 4 Zeilen, die Mod muss ja nur unterscheiden was gerade gemacht wird, ein Gebäude oder ein Prop.
Die erste Zeile beginnt ja mit var shader, hier wird ja nach dem Rotor-Shader gesucht, was die Funktion Shader.Find halt macht, dies gibt es ja quasi erst seit dem "Natural-Desaster" DLC, denn was ist wohl der Rotor-Shader, der Shader ist zuständig für die Transparenz der Rotorblätter bei den Helikoptern.
Denke mal die Mod kann nicht sehr Aufwendig sein, es müsste ja einfach nur ein Text-Button im Asset-Editor zu sehen sein.
Klickt man darauf, dann wird die Transparenz aktiviert und der Button bläulich, klickt man wieder darauf, wird die Transparenz deaktiviert (sofern es überhaupt geht) aber denke schon das dies möglich ist.
Denn der Shader für die Transparenz wird ja in der IF-Abfrage zugewiesen.
IF (asset.m_material != null) fragt nach ob das Objekt ein Material hat, denn "!=" bedeutet ungleich und das Wort "Null" halt den Wert 0
Das gleiche gilt für die Zeile darunter, hier wird nur das Material des LOD-Objekts abgefragt und gegebenenfalls gesetzt.
Also müssen beide IF-Abfragen erweitert werden in etwa folgenden Befehl.
Variablen Initialisieren denke mal das dies alles nach dem Start des Spiels passiert.
var temp1 = 0
var temp2 = 0
Überprüfen in welchen Modus man gerade ist.
Wenn man im Spiel ist passiert nichts
Ist man im Asset-Editor, dann Button für Transparenz aktivieren.
Abfrage, Button Transparenz gedrückt (ja oder nein), wenn ja folgenden Programm-Code ausführen.
Sonst Warten auf Benutzer Interaktion.
Wird der Asset-Editor verlassen dann die Variablen temp1 und temp2 auf 0 zurücksetzen.
if temp1 = 0
{
if (asset.m_material != null)
{
temp1 = asset.m_material.shader
asset.m_material.shader = shader
}
if (asset.m_lodMaterial != null)
{
temp2 = asset.m.lodMaterial.shader
asset.m_lodMaterial.shader = shader
}
Ändere Status-Anzeige für den Button
}
else
{
asset.m_material.shader = temp1
if temp2 != 0
{
asset.m_lodMaterial.shader = temp2
}
temp1 = 0
temp2 = 0
Ändere Status-Anzeige für den Button
}
Alles anzeigen
So von der Theorie her sollte mein Beispiels-Script funktionieren, ich kenne mich nicht in C# so aus, aber im großen und ganzen ähneln sich ja die Programmiersprachen alle irgendwie.
Wenn man nun den besagten Button
Wird erstmal geprüft ob die Transparez schon aktiviert ist, da aber die Variable temp1 auf 0 steht, wird dann der passende Programm Code dafür ausgeführt, erst wird überprüft ob das Material über einen Shader verfügt, wenn ja, wird zuerst in Temp1 der aktuelle Shader gespeichert, dann erfolgt die Abfrage ob das LOD-Material auch einen Shader besitzt, wenn ja, dann wirdin Temp2 der aktuelle Shader des LOD-Materials gespeichert.
Nun wird der Shader durch den Rotor-Shader ersetzt. und am ende der Status des Button auf bläulich umgestellt, die Transparenz ist nun aktiviert.
Drückt man nun ein weiteres mal den Button, dann wird erst geprüft ob Temp1 = 0 ist, da die Transparenz aber aktuell aktiv ist, wird der Programm-Teil übersprungen und der Teil nach ELSE abgearbeitet.
Hier wird direkt der zuvor gespeicherte Shader wieder als aktueller Shader gesetzt, eine Überprüfung ist hier nicht nötig, da temp1 ja nur gesetz wird, wenn das Material schon einen Shader zuvor hatte.
Mit der Abfrage ob Temp2 ungleich 0 ist, wird sichergestellt das der Shader nur zurück gesetzt wird, wenn ein Shader zuvor gespeichert worden ist.
Am Ende werden beide Variablen wieder auf 0 gesetzt und der Status des Button von Bläulich zu Grau gewechselt.
Wie gesagt, ich denke so eine Mod ist bestimmt möglich, oder gibt es da eine Einschränkung das dies nur über diesen Weg möglich ist.