Jump to content
Unity Insider Forum

Wattsefakk

Members
  • Content Count

    135
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Wattsefakk

  1. Ich würde das eher so sehen. Man hat eine Klasse: public class Mensch{ string Name; int Alter; } Wenn du jetzt Objekte von dieser Klasse speichern willst musst du dem Computer erklären wie er daraus einer Binäre Datei machen soll. Das machen deine Serilization Attriubte die du in deine Klasse schreibst. Diese sorgen dafür das der Compiler weiß wie er die Binären Dateien Deserialisieren muss um sie wieder in Objekte um zu wandeln.
  2. private Playerstate _enum; public Playerstate Enum { get{ return _enum; } set{ _enum = value; // Hier jetzt eine Funktion ausführen die dein Code den du bei Änderung ausführen willst } } So würde ich das ja jetzt machen gibt aber vllt noch andere möglichkeiten
  3. Sascha perfekt danke genau so wollte ich das haben. Danke dir
  4. Moinsen, Ich habe eine Klasse [System.Serializable] public class TextToMesh : Editor { public string charstring; public GameObject Gameobject; public float Heightoffset; } diese möchte ich jetzt in einer anderen Klasse als public TextToMesh[] Test; einfügen. Nun kann ich aber leider nicht im Inspector auf die einzelnen Attribute aus der Klasse TextToMesh zugreifen. Möchte halt einfach ein Array haben wo ich im Editor die einzelnen Attribute setzen kann. Bei einem Object ist das ja kein Problem nur wenn ich die Objecte in ein Array schmeiße kann ich nur solche Objekte einfügen aber kann nicht auf die Attribute zugreifen. Habt ihr da eine Idee?
  5. ah okay dann weiß ich bescheid hab nur gedacht das dies der einfachste weg wär^^ aber dann ist es ja kein problem
  6. Nabend Leuts, warum löst ein Raycast von einem Objekt nicht OnTriggerEnter bei einem anderen Collider aus? Oder bin ich da auf dem falschem Weg? Folgendes soll Funktionieren: Der Spieler schaut auf ein Objekt und dieses Objekt soll das erkennen ob es angeschaut wird. Also dachte ich nehme einen RayCast der in die Blickrichtung den Spielers geht und fertig nur werden im Objekt wedewr OnTriggerEnter noch OnCollisionEnter ausgelöst. Das Objekt hat sowohl einen Collider der auf Trigger gestellt ist als auch einen Rigidbody... Wisst ihr was ich falsch mache?
  7. Nabend, Gibt es eine Möglichkeit Unity zu zwingen in einer höheren Auflösung zu Rendern? Würde das gerne machen in Verbindung meiner VR-Brille. Am besten ist der Skalierungsfaktor frei einstellbar. Benutze dir kostenlose Version.
  8. Wattsefakk

    Springen

    Eigentlich recht einfach da die velocity die Geschwindigkeit ist die das Objekt hat, du willst aber nur einen Kraftimpuls auf das Objekt ausführen. Das würde ich so machen: gameObject.GetComponent<Rigidbody>().AddForce(x, y, z, ForceMode.Impulse); Dann einfach für x,y,z die entsprechenden Variablen einfügen oder feste Werte eingeben. Nochmal zum lachlesen Rigidbody.AddForce
  9. So wie ich das sehe setzt du den bool charakterTeleportieren bei ankunft des Spielers zum Teleportziel auf false. Da du dann allerdings den OnTriggerEnter wieder auslößt wirst du wieder weg geportet^^ also entweder das zurücksetzen nach einer bestimmten zeit auslösen oder beim Verlassen des Triggers der dich normalerweise wegportet.
  10. Stimmt der andere collider wird eh ein sphere Collider oder Box collider die kann ich dann ja auf Trigger stellen
  11. oh mann bin ich Blöd wird ja echt einfach nur überdeckt -.- will den Mechcollider eig auf trigger stellen nur funktioniert das nicht weißt du warum? geht nur im convex modus...
  12. das Problem ist wenn ich ihn nicht auf Convex stelle macht er gar kein Collider
  13. Moinsen, Ich erstelle mit per Script ein Mesh nur macht er den Collider sehr komisch woran liegt das? Der MeshCollider ist auf Convex gestellt.
  14. ja genau das will ich tuen nur dann ist das Mesh nicht mehr da... Es wird nicht gespeichert egal ob ich es per code mache oder manuell mit der Hand.
  15. Das habe ich zuerst ausprobiert allerdings ist dann das Mesh auch weg da es zur Laufzeit generiert wird
  16. Ich will ein GameObject als Prefab speichern, das Problem ist das Mesh was in diesem GameObject steckt, wurde vorher per Code generiert und. Ich habe folgenden Code bisher benutzt nur speichert er zwar das GameObject als Prefab nur das Mesh ist null. Wisst ihr da noch eine andere Möglichkeit? UnityEngine.Object prefab = EditorUtility.CreateEmptyPrefab("Assets/test.prefab"); EditorUtility.ReplacePrefab(mesh, prefab, ReplacePrefabOptions.ConnectToPrefab); Damit habe ich es versucht. Funktioniert halt nur nicht. Edit: Habe nun die aktuelle Funktion gefunden und zwar diese hier: public static GameObject CreatePrefab(string path, GameObject go, ReplacePrefabOptions options = ReplacePrefabOptions.Default); Problem bleibt aber bestehen das das Mesh nicht gespeichert wird.
  17. Okay hat sich schon erledigt da ich ja auch einfach die Transform.Position von dem Object ändern kann^^
  18. Ich erstelle mir im Code ein Gameobject mit GameObject mesh = new GameObject(); nur erstellt Unity das Object auch direkt in der Scene was ich aber nicht haben möchte. Gibt es da einen anderen weg? Ich Instanziere es erst Später Manuell.
  19. Moin ich habe ein Object wo ein ein SphereCollider angepappt ist, nun will ich alle Collider haben mit denen dieses Object Collidiert nur bekomme ich bei der Funktion private void OnCollisionStay(Collision collision) {] ja nur ein einziges Collision zurück und nicht mehrere... brauche aber alle Objekte und nicht nur das eine. Wisst ihr da was? Oder muss ich das mit Physics.OverlapSphere machen?
  20. also ein null reference exception kommt immer dann wenn du auf ein Objekt zugreift was allerdings noch nicht zugewiesen ist. Also ist entweder dein inventory object null oder dein inventoryItem object null. kannst ja mal an der Stelle einen Haltepunkt hinsetzen dann kannst alle werte auslesen und schnell herausfinden was den Wert Null hat. Vermute es ist dein inventoryItem
  21. Hey habe auf Youtube diese Videoreihe gefunden. Arbeite recht viel mit Datenbanken auf der Arbeit allerdings habe ich keine Ahnung wie das Unity handhabt, der Code des Youtubers sieht aber gut aus da ich mich so auch schonmal auf eine Datenbank geloggt habe. Kannste dir ja mal anschauen. Youtube Falls fragen über SQL kommen und wie die Abfragen schließlich funktionieren kann ich dir w3schools/sql empfehlen ist sehr gut und übersichtlich. Schönen Gruß Markus
  22. Ja hab ich schon, werde aber allerdings das ganze dennoch anders lösen da mir die Möglichkeiten zu gering sind. Das ganze funktioniert soweit echt super, lassen sich allerdings nur sehr "Gradlinige" Bewegungen gut auswerten. Ich stell hier mal die ganze Klasse rein kannst ja schauen was du davon benötigst, wenn du noch fragen hast kannst du die hier stellen oder per PM. Das hier ist der Aufruf den ich mache um die Bewegungen zu identifizieren. Die "List<Vektor>" "right" sind die Positions-Koordinaten die man überprüfen möchte. Zurück bekommen tut man dann einmal den Winkel zwischen 2 Richtungsvektoren und die Richtung als integer wobei die zahlen für 0:rechts;1:hinten;2:links;3:vorne;4:oben;5:unten; stehen. Attacke attackeneu = new Attacke(); Vector2 directionlook2 = new Vector2(directionlook.x, directionlook.z); List<Vector3> directionvectorsR = attackeneu.distancecheck(right); List<Vector3> vectorsattackdirectionsR = attackeneu.vectorstodirectionnormalized(directionvectorsR); List<int> richtungindex = new List<int>(); foreach (Vector3 vec in vectorsattackdirectionsR) { int direction = new int(); direction = attackeneu.returndirection(vec, directionlook2); richtungindex.Add(direction); } List<float> floatwinkelR = new List<float>(); if (vectorsattackdirectionsR.Count > 1) { for (int i = 0; i < vectorsattackdirectionsR.Count - 1; i++) { float winkel = Mathf.Acos(Vector3.Dot(vectorsattackdirectionsR[i], vectorsattackdirectionsR[i + 1]) / (vectorsattackdirectionsR[i].sqrMagnitude + vectorsattackdirectionsR[i + 1].sqrMagnitude)); floatwinkelR.Add(Mathf.Rad2Deg * winkel); } } attackeneu = attackeneu.getAttackefromData(floatwinkelR,richtungindex, element); if (attackeneu != null) { castattack(attackeneu,right[right.Count-1], vectorsattackdirectionsR[vectorsattackdirectionsR.Count - 1]); } public class Attacke { public Attacke getAttackfromserilizable(Attackenserialized attser) { Attacke att = new Attacke(); att.idattacke = attser.idattacke; att.idelement = attser.idelement; att.winkel = attser.winkel; return att; } public int idelement; public int idattacke; public Vector3 direction; public List<int> directions; public List<float> winkel; public Attacke getAttackefromData(List<float> winkel,List<int> directions, int element) { foreach (float fl in winkel) { Debug.Log(fl); } foreach (Attacke att in spieler.attacken) { if (att.idelement == element || element ==5) { if (att.winkel.Count == winkel.Count && att.directions.Count==directions.Count) { bool bwinkel = false; bool brichtung = true; for (int i = 0; i < att.winkel.Count; i++) { float min = att.winkel[i] - 10; float max = att.winkel[i] + 10; if (min < winkel[i] && winkel[i] < max) { bwinkel = true; } } for(int i = 0; i < att.directions.Count; i++) { if (brichtung) { if (att.directions[i] != directions[i]) { brichtung = false; } } } if (bwinkel && brichtung) { return att; } } } } return null; } public bool checkvectordirection(Vector3 vectortolist, Vector3 vektorcheck) { Vector3 vec = vectortolist.normalized - vektorcheck.normalized; bool checkx = false; bool checky = false; bool checkz = false; if (vec.x >= 0) { if (vec.x > 0.95F) { checkx = true; } } else { if (vec.x < -0.95F) { checkx = true; } } if (vec.y >= 0) { if (vec.y > 0.95F) { checky = true; } } else { if (vec.y < -0.95F) { checky = true; } } if (vec.z >= 0) { if (vec.z > 0.95F) { checkz = true; } } else { if (vec.z < -0.95F) { checkz = true; } } if (checkx || checky || checkz) { return false; } else { return true; } } public List<Vector3> vectorstodirectionnormalized(List<Vector3> directions) { Attacke att = new Attacke(); List<Vector3> lvectordirectionpoints = new List<Vector3>(); Vector3 vectortolist = new Vector3(); if (directions.Count > 0) { vectortolist = directions[0]; for (int i = 1; i < directions.Count; i++) { if (att.checkvectordirection(vectortolist, directions[i])) { vectortolist += directions[i]; } else { lvectordirectionpoints.Add(vectortolist); vectortolist = directions[i]; } } lvectordirectionpoints.Add(vectortolist); } return lvectordirectionpoints; } public int returndirection(Vector3 vec, Vector2 look) { Vector2 direc = new Vector2(vec.x, vec.z); int direction = -1; if (direction == -1) { float max = Mathf.Max(Mathf.Abs(vec.x), Mathf.Abs(vec.y), Mathf.Abs(vec.z)); if (max == Mathf.Abs(vec.y)) { if (vec.y > 0) { direction = 4; Debug.Log("oben"); } else { direction = 5; Debug.Log("unten"); } } } if (direction == -1) { float winkel = Mathf.Rad2Deg * Mathf.Acos(Vector2.Dot(direc.normalized, look.normalized)); float orient = direc.x * look.y - direc.y * look.x; if (!(orient > 0)) { winkel = winkel + 180; } if (winkel < 135 && winkel > 45) { direction = 0; Debug.Log("rechts"); } //else if (winkel < 225) { direction = 3; Debug.Log(winkel+"vorne"); } else if (winkel < 315 && winkel > 225) { direction = 2; Debug.Log("links"); } } if (direction == -1) { float winkel = Mathf.Rad2Deg * Mathf.Acos(Vector2.Dot(direc.normalized, look.normalized)); if (winkel < 45) { direction = 3; Debug.Log("vorne"); } if (winkel > 135 && winkel < 225) { direction = 1; Debug.Log("hinten"); } } // 0:rechts;1:hinten;2:links;3:vorne;4:oben;5:unten; return direction; } public List<Vector3> distancecheck(List<Vector3> pos) { List<Vector3> listvector = new List<Vector3>(); int counter = 1; for (int i = 0; i < pos.Count;) { if (counter < pos.Count) { if (directionvector3(pos[i], pos[counter]).sqrMagnitude < 0.001F) { counter++; } else { listvector.Add(directionvector3(pos[i], pos[counter])); i = counter; } } else { break; } } List<Vector3> listreturn = new List<Vector3>(); for (int i = 2; i < listvector.Count; i++) { listreturn.Add(listvector[i]); } return listvector; } Vector3 directionvector3(Vector3 from, Vector3 to) { return to - from; } public List<Vector3> pointstodirectionVectors(List<Vector3> vectors) { List<Vector3> vlist = new List<Vector3>(); for (int i = 0; i < vectors.Count - 1; i++) { vlist.Add(directionvector3(vectors[i], vectors[i + 1])); } return vlist; } } Dann habe ich mir noch eine static list gemacht worin alle Attacken drin vorhanden sind. Um nicht jedesmal neue attacken zu schreiben habe ich noch alle Attacken Serialisiert. List<Attackenserialized> getAttackenfromFile() { List<Attackenserialized> Lattsde = new List<Attackenserialized>(); BinaryFormatter bf = new BinaryFormatter(); FileStream fileread = File.Open(Application.persistentDataPath + "/attacks.dat", FileMode.Open); Lattsde = (List<Attackenserialized>)bf.Deserialize(fileread); fileread.Close(); return Lattsde; } void writeAtteckentoFile(List<Attackenserialized> Latts) { BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Create(Application.persistentDataPath + "/attacks.dat"); bf.Serialize(file, Latts); file.Close(); } Das sind die beiden Funktionen die ich benutzt habe das ganze zu speichern oder um es auszulesen. [System.Serializable] public class Attackenserialized { public int idelement; public int idattacke; public List<float> winkel; public List<int> directions; } public static List<Attacke> attacken; List<Attackenserialized> attackenser = getAttackenfromFile(); foreach(Attackenserialized att in attackenser) { Attacke attde = new Attacke(); attde.winkel = att.winkel; attde.idattacke = att.idattacke; attde.idelement = att.idelement; attde.directions = att.directions; attacken.Add(attde); } Einmal die Serialized klasse und da darunter ist einmal der Aufruf um die Datei zu lesen und die Attacken zu der static List attacken hinzu zu fügen um sie später abzufragen. Ich weiß ganz viel Code^^ gibt bestimmt auch noch eine einfachere Methode, bin ja auch gerade dabei es komplett anders zu lösen da dieses System zwar funktioniert allerdings halt am besten funktioniert wenn man sehr Gradlinige bewegungen macht. Also zum beispiel nach oben und dann nach vorne schlagen. Das ganze ist halt für meine Vive damit ich Zauber auswählen kann ohne Interface sondern mit Bewegung. Werde das ganze allerdings nun anders machen und zwar in dem ich mir eine 3D Röhre baue die so aussieht wie die bewegung die man mit den Controllern machen muss und diese werde ich dann einfach mit einem Collider ausstatten. Wenn dir das ganze in irgend einer weise nützt kannst du das gerne Benutzen. Falls noch fragen sind kannst du die gerne Stellen, da ich alles selbst geschrieben habe sollte ich ja wissen was der Code so macht^^ Die Attacken lade ich in einer Start() methode in die entsprechende Static liste. Beispiel Attacken kommen hier drunter und dann gebe ich dir noch das Auslesen welche Attacke letztendlich ausgeführt werden soll. void castattack(Attacke attacke,Vector3 pos, Vector3 dir) { if (attacke.idelement == 0) { if (attacke.idattacke == 1) { GameObject obj = Instantiate(Feuer[0], pos, Quaternion.identity); ConstantForce force = obj.GetComponent<ConstantForce>(); force.force = dir.normalized * 5; } } if (attacke.idelement == 1) { if (attacke.idattacke == 1) { GameObject obj = Instantiate(Wasser[0], pos, Quaternion.identity); ConstantForce force = obj.GetComponent<ConstantForce>(); force.force = dir.normalized * 5; } } if (attacke.idelement == 2) { if (attacke.idattacke == 1) { GameObject obj = Instantiate(Erde[0], pos, Quaternion.identity); ConstantForce force = obj.GetComponent<ConstantForce>(); force.force = dir.normalized * 5; } } if (attacke.idelement == 3) { if (attacke.idattacke == 1) { GameObject obj = Instantiate(Luft[0], pos, Quaternion.identity); ConstantForce force = obj.GetComponent<ConstantForce>(); force.force = dir.normalized * 5; } } } Und hier einmal die Beispiel Daten. void writedefaultattacken() {// 0:rechts;1:hinten;2:links;3:vorne;4:oben;5:unten; Attacke fire = new Attacke(); fire.idattacke = 1; fire.idelement = 0; fire.winkel = new List<float>(); fire.winkel.Add(120F); fire.directions = new List<int>(); fire.directions.Add(1); fire.directions.Add(3); attacken.Add(fire); Attacke earth = new Attacke(); earth.idattacke = 1; earth.idelement = 2; earth.winkel = new List<float>(); earth.winkel.Add(90); earth.directions = new List<int>(); earth.directions.Add(4); earth.directions.Add(3); attacken.Add(earth); Attacke water = new Attacke(); water.idelement = 1; water.idattacke = 1; water.directions = new List<int>(); water.directions.Add(5); water.directions.Add(3); water.directions.Add(5); //water.directions.Add(0); water.directions.Add(1); water.winkel = new List<float>(); //water.winkel.Add(120); water.winkel.Add(90); water.winkel.Add(90); attacken.Add(water); List<Attackenserialized> Latts = new List<Attackenserialized>(); foreach (Attacke att in attacken) { Attackenserialized satt = new Attackenserialized(); satt.idattacke = att.idattacke; satt.idelement = att.idelement; satt.winkel = att.winkel; satt.directions = att.directions; Latts.Add(satt); } writeAtteckentoFile(Latts); } So vielleicht hilft dir das wenn du fragen hast gerne stellen.
  23. ok hab es hinbekommen, den Code werde ich vllt mal später posten muss den jetzt erstmal noch aufräumen und in einer Klasse auslagern.
  24. Zum Punkt 1: Genau das soll erkennt werden. Also wenn die Winkel zwischen den Vektoren ca identisch ist soll er dieses erkennen, egal wo sie im Raum sind. Zu Punkt 2: Es sind immer eine untschiedliche Anzahl von Vektoren beteiligt. Ich drücke beim HTC Vive controller eine Taste bewege den Controller durch den Raum und beim Loslassen werden alle Positionen die der Controller in der Zeit durchlaufen hat abgespeichert. Wenn ich also ein "V" nachmache ist es egal wie rum es gedreht ist es soll immer erkannt werden.
×
×
  • Create New...