Jump to content
Unity Insider Forum

Kojote

Members
  • Content count

    1,046
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by Kojote

  1. Kojote

    Mesh VS Terrain

    Grüße! Da mein jetziges Projekt langsam zum Ende kommt, bin ich gerade dabei mir weitere Gedanken über mein neues Projekt zu machen. Es wird ein Multiplayer-3D Spiel in einer Waldlandschaft werden. Nun bin ich am Punkt, wie ich die Landschaft aufbauen werde. Zur Zeit nutze ich für die Landschaft "World Creator" und den Shader "CTS". Macht sich ganz gut, jedoch stößt man beim WC schnell an siene grenzen. Einzelne Steine zu setzen, Gelände nachmodellieren, kleine Wege und Hölen, die zum erkunden einladen sind leider nicht möglich. Durch Zufall bin ich nun auf Voxeland 5 gestoßen: https://assetstore.unity.com/packages/tools/terrain/voxeland-9180 Was das Tool kann, ist genau das was ich suche, freies Kneten der Landschaft, Hölen, ect. Problem ist leider, Voxeland ist weder kompatibel mit WC, noch mit CTS. Aus dem Grund müsste ich mir folgende Assets holen: Map Magic: https://assetstore.unity.com/packages/tools/terrain/mapmagic-world-generator-56762 MegaSplat: https://assetstore.unity.com/packages/tools/terrain/megasplat-76166 Ist ja nicht mal ein kleines Sümmchen, was dafür fällig wäre, drum grübel ich halt herum. Auf der einen Seite Map Magic, Voxeland und MegaSplat und kann mir meine Landschaft sehr einfach und schnell formen . Auf der anderen Seite WC und CTS, macht auch gute Ergebnisse, aber basiert auf Terrain, Hölen und Nieschen bzw. Steine aus dem Gelände malen wie bei Voxeland sind nicht möglich. Hab mich nun mal eingelesen, Mesh wie bei MapMagic gegen Terrain mit dem WC machen schon unterschiede. Hab jetzt gelesen, dass bei Mesh Terrains man Probleme mit den Billboards hat, auch Occulling würde hier nicht so funktionieren, wie beim Terrain. Hat da jemand Erfahrung mit Mesh-Terrains? Wie sieht das mit Bäumen und Gras aus bzw. mit der Performance? Schon mal Danke für die Hilfe! Grüße von Kojote
  2. Kojote

    OnValidate Problem

    Grüße! Ich möchte über die Methode "OnValidate" ein anderes GameObject finden. Dies funktioniert an sich sehr gut. Problem ist nur, wenn ich das GameObject in dem sich die OnValidate Methode befindet zu einem Prefab mache, versucht das Script im Prefab auch das GameObject zu finden, findet es jedoch nicht und verursacht eine rote Fehlermeldung. Kann man OnValidate an eine Bedingung knüpfen, dass es als Prefab nicht arbeitet? Grüße von Kojote
  3. Kojote

    OnValidate Problem

    Es würde darum gehen, dass ich ein Enum auswähle.
  4. Kojote

    OnValidate Problem

    Was wäre dann eine Möglichkeit um eine Änderung im Inspector zu verarbeiten?
  5. Kojote

    OnValidate Problem

    OK, habs mal entfernt und funktioniert so nun besser. Für was nutzt man dann OnValidate? Doch eigentlich um zu aktualisieren, ob im Inspector etwas geändert wurde, oder?
  6. Kojote

    Unity Crash

    Grüße! Ich habe ein recht eigenartiges Problem mit Unity. Sobald ich eine Scene das Licht rendere, egal ob Baked oder Real Time, schmiert mir Unity in 50% der Fälle ab, sobald er fertig ist. In den andern 50% der Fälle funktioniert UNity zwar noch, schließe ich es jedoch und starte neu, kommt ein Crash schon beim Starten des Projekts. Es ist einneues Projekt nur mit einer Hand voll Scripete von mir. Am Licht und Co habe ich nichts geändert. Hat einer ne Idee? Grüße von Kojote
  7. Kojote

    OnValidate Problem

    Ich kann dir gern ma nen Projekt rüber schieben. Im Grunde ist es ein Minimap-Asset. Ich füge ein Script einem Objekt hinzu und dieses soll beim Start sich Daten vom Hauptscript holen, in dem alle Infos zu den Sprites hinterlegt sind.. Das alles funktioniert über den Editor. Problem ist, Über OnValidate soll er sich diese Infos beziehen. Dies funktioniert aber nicht, wenn ich es als Prefab ablege.
  8. Kojote

    PC zusammen stellen

    Grüße! Ich bin gerade dabei mir meinen PC aufzurüsten, hauptsächlich zur Arbeit mit Unity und Photoshop, weniger AAA. Hab mir mal folgendes zusammen gestellt: AMD Version: AMD Ryzen 5 2600X, Prozessor | GIGABYTE X470 AORUS ULTRA GAMING | G.Skill DIMM 32 GB DDR4-2666 Kit INTEL Version: Intel® Core™ i5-8600K | GIGABYTE Z390 GAMING X | Corsair DIMM 32GB DDR4-2666 Kit Was haltet ihr davon. Gibt es irgendwo nach zu lesen was Unity bei der Erstellung von Spielen mehr braucht? Eher mehr RAM oder CPU oder Multi-Threading? Vielen Dank schon mal und Grüße von Kojote
  9. Kojote

    PC zusammen stellen

    Danke für die Antwort, also dann werd ich eher den AMD nehmen, von der Grafikkarte her ist jetzt noch eine NVidia GForce GTX 660 TI drin, muss erst mal reichen. Obwohl der Unterschied ist schon extrem: https://gpu.userbenchmark.com/Compare/Nvidia-GTX-660-Ti-vs-Nvidia-GTX-1060-6GB/2183vs3639
  10. Kojote

    Inconsistend line endings

    Grüße! Ich habe mir einen kleinen Editor-Zusatz geschrieben, der mir eine CS-Datei schreibt. Wenn ich dies nun mache, kommt er mir mit dieser gelben Fehlermeldung: There are inconsistent line endings in the 'Assets/EMM/Scripts/EMM_Enum_List.cs' script. Some are Mac OS X (UNIX) and some are Windows. This might lead to incorrect line numbers in stacktraces and compiler errors. Many text editors can fix this using Convert Line Endings menu commands. UnityEditor.AssetDatabase:ImportAsset(String) EMM.EMM_Editor_Methods:WriteStringToEnum(String, String, String, ICollection`1) (at Assets/Editor/EMM_Editor_Methods.cs:35) EMM.EMM_Enum_Writer:OnInspectorGUI() (at Assets/Editor/EMM_Enum_Writer.cs:23) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) Problem hierbei ist, dass die CS-Datei zwar richtig geschrieben und erstellt wird, jedoch aus irgend einem Grund der Writer noch eine Leere Zeile nach der letzten geschlossenen geschweiften Klammer anfügt. Das stört hier. Kann man dies irgendwie verhindern? Hier mal dir Writer-Datei: public static void WriteStringToEnum<T>(string path, string fileName, string enumName, ICollection<T> data) { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (StreamWriter file = File.CreateText(path + fileName + extension)) { file.WriteLine("using UnityEngine;\n"); file.WriteLine("namespace EMM {"); file.WriteLine("public class " + fileName + " : MonoBehaviour {"); file.WriteLine("public enum " + enumName + " {\n"); int i = 0; foreach (var line in data) { string lineRep = line.ToString().Replace(" ", string.Empty); if (!string.IsNullOrEmpty(lineRep)) { file.WriteLine(string.Format("\t{0} = {1},", lineRep, i)); i++; } } file.WriteLine("\n}\n}\n}"); file.Close(); } AssetDatabase.ImportAsset(path + fileName + extension); } Grüße von Kojote
  11. Kojote

    OnValidate Problem

    Problem doch nicht gelöst! OnEnable verursacht zwar keinen Bug, reagiert aber nicht an der Stelle wo ichs brauch.
  12. Kojote

    OnValidate Problem

    Problem gelöst, das suchen des Objektes habe ich nun in die Methode "OnEnable" ausgelagert, damit wäre der Fehler beseitigt.
  13. Kojote

    Kommunikation zwischen Scripts?

    Durch SerializeField wird das Feld nur für den Inspector sichtbar, um Änderungen vor zu nehmen. Ansonsten ist es für alle anderen Klassen bzw. Scripte private. Willst du also aus einem anderen Script auf dieses zugreifen muss es public sein.
  14. Grüße! Ich habe mir die letzten Tage eine Minimap Kamera zusammen gebaut, nun wollte ich gern noch ein Ping einfügen. Damit es für andere Spieler sichtbar ist, war meine Idee: Ping auf der Minimap, Berechnung der World Position aus der Minimap Position. Danach an der World Position Erzeugung des Ping Effekts. So, Problem ist nun, wie berechne ich aus der Minimap Position den World Space. Meine Gedanken waren bisher, ich habe ein Rect, dazu eine Orth. Kamera aus der ich die Größe auslesen kann. Eigentlich müsste man doch über die Render Textur und die Minimap Kamera den World Space berechnen können. Nur eine Idee, wie ich dies berechne bekomme ich nicht. Habt ihr vielleicht einen Denkanstoß? Schon einmal Danke und Grüße von Kojote
  15. Kojote

    Editor

    Hallo! Ich habe ein kleines Problem mit einem selbst geschriebenen Editor. Mein derzeitiger Stand: Ich habe ein Script, in dem ich eine String Liste erzeuge, diese String Liste möchte ich in ein Enum verwandeln. In mehreren Scripts soll dieses aktualisierte Enum funktionieren, es soll ein Auswahlfeld sein, welches man im Editor ändern kann. Da dies mit dem normalen Enum nicht geht, hab ich mir dieses Script zusammen gebastelt: using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace EMM { [CustomEditor(typeof(EMM_Minimap_Icon))] public class EMM_Enum_Generator_Editor : Editor { public string[] minimapTypeChoices = new[] { "NoTypeAvailable", "Test1", "Test2" }; int choiceIndex = 0; public override void OnInspectorGUI() { // Draw the default inspector DrawDefaultInspector(); choiceIndex = EditorGUILayout.Popup(choiceIndex, minimapTypeChoices); var minimapIcon = target as EMM_Minimap_Icon; // Update the selected choice in the underlying object minimapIcon.minimapTypeChoice = choiceIndex; // Save the changes back to the object EditorUtility.SetDirty(target); } } } Des weiteren dieses Script: namespace EMM { public class EMM_Minimap_Icon : MonoBehaviour { public int minimapTypeChoice; } } Problem ist nun folgendes. Das Script EMM_Minimap_Icon existiert mehrmals. Wenn ich nun mein eigenes Enum ändere wird dies zwar erkannt, wechsel ich aber auf ein anderes Game Objekt mit diesem Script und zurück hat er den Integer "minimapTypChoice" wieder vergessen. Habt ihre eine Idee was falsch läuft? Grüße von Kojote
  16. Kojote

    Editor

    Danke für die Antworten, Problem gelöst!
  17. Kojote

    Editor

    Keiner ne Idee?^^
  18. Hallo! Ich habe gerade eine Animator Datei: https://s2.imagebanana.com/file/181212/JcDJgCsB.jpg In dieser befindet sich "Run Blend Tree". https://s2.imagebanana.com/file/181212/LAIyPJVP.jpg Klicken wir darauf lande ich im Blend Tree. Ich wollte nun gern abhängig von der Variable "Speed" entweder die Animation Walk beim laufen nutzen oder die Animation Run. Kann man dies im Animator einstellen, dass zum Beispiel die Animation Run genutzt wird, sobald der Speed höher als 2 ist?
  19. Kojote

    Animation Run Walk wechseln

    Und wie mache ich diese Abhängigkeit?
  20. Kojote

    Static und Nicht Static

    Grüße! Ich hab ein kleines Scriptproblem. In einer Klasse habe ich eine statische Methode: public static Sprite MinimapSpriteIcon(int icon) { switch (icon) { case 0: sprite = iconSprites[0]; break; case 1: sprite = iconSprites[1]; break; case 2: sprite = iconSprites[2]; break; case 3: sprite = iconSprites[3]; break; } return sprite; } Diese rufe ich von vielen anderen Scripts aus auf, um zu erfahren, welches Icon genutzt werden soll. Problem ist, ich muss in dieser Klasse ja irgendwie die Sprites festlegen, was ich so mache: [Tooltip("Sprites für die Icons der Objekte.")] public Sprite[] iconSprites = new Sprite[0]; public Sprite sprite; Problem ist nun, "sprite" und "iconSprites" müssten auch Static sein, um sie in der Methode nutzen zu können. Mache ich dies jedoch, werden die Variablen nicht mehr im Inspector angezeigt. Gibt es da irgend eine Lösung um das Problem zu umgehen? Grüße von Kojote
  21. Kojote

    Static und Nicht Static

    Interessanter Ansatz, teste ich mal aus, danke! 😀
  22. Kojote

    Static und Nicht Static

    So richtig verstehe ich das nicht. Ich habe eine Methode in einer Klasse: public class LD_Menue_Minimap_Icon : MonoBehaviour { public enum ic : short { Spieler=0, Mitspieler=1, Beute=2, Portal=3, KeineAuswahl=4 }; public ic icon = ic.KeineAuswahl; private Sprite iconSprite; private void Start() { if (icon == ic.KeineAuswahl) { Debug.Log("FEHLER: Für Objekt " + this.gameObject.name + " wurde kein Icon ausgewählt."); return; } iconSprite = LD_Menue_Minimap.MinimapSpriteIcon((int)icon); SpriteRenderer renderer = this.gameObject.AddComponent<SpriteRenderer>(); renderer.sprite = iconSprite; this.gameObject.layer = LD_Menue_Minimap.MinimapLayer(); } } Hier hole ich mir das Icon. In der zweiten Klasse sind die Sprites hinterlegt: [Tooltip("Sprites für die Icons der Objekte.")] public Sprite[] iconSprites; public static Sprite MinimapSpriteIcon(int icon, Sprite[] iconSprites) { return (icon < iconSprites.Length) ? iconSprites[icon] : null; } Wie funktioniert dies? Die Klasse die die Static Methode aufruft, kennt doch das Array iconSprites gar nicht.
  23. Kojote

    Entfernung Y-Achse

    Grüße! Ich habe hier ein kleines Script, was den Chrakter auf dem Terrain besser plazieren soll. Hier mal der Links: https://assetstore.unity.com/packages/tools/animation/ground-fitter-121798 Problem ist, der ändert mir auch die Y-Achse. Diese wird jedoch schon von mir in einem Parentobjekt vorgegebene. Ich versuche nun schon den halben Tag Y auf 0 zu bringen, aber irgendwie berechnet er immer wieder was. Ich übersehe irgendwas, könnt ihr mal sehen was ich da übersehe: using FIMSpace.Basics; using System.Collections.Generic; using UnityEngine; namespace FIMSpace.GroundFitter { /// <summary> /// FM: Changing transform's orientation to fit to the ground, have controll over rotation in Y axis and possibility to move forward /// </summary> public class FGroundFitter : MonoBehaviour { [Tooltip("If you want this script only to change your object's rotation and do nothing with position, untoggle this")] public bool ChangePosition = true; [Tooltip("With this variable you define in which direction model should look - use it fro other scripts, check demo script for patrolling")] public float RotationYAxis = 0f; [Tooltip("How quick rotation should be corrected to target")] [Range(1f, 30f)] public float FittingSpeed = 6f; [Tooltip("Smoothing whole rotation motion")] [Range(0f, 1f)] public float TotalSmoother = 0f; /// <summary> If algorithm should be executed in LateUpdate queue </summary> public EFUpdateClock UpdateClock = EFUpdateClock.Update; [Header("> Tweaking Settings <")] // V1.1 [Range(0f, 1f)] [Tooltip("If forward rotation value should go in lighter value than real normal hit direction")] public float MildForwardValue = 0f; [Tooltip("Maximum rotation angle in rotation of x axis, so rotating forward - degrees value of maximum rotation")] [Range(0f, 90f)] public float MaxForwardRotation = 90f; [Range(0f, 1f)] [Tooltip("If side rotation value should go in lighter value than real normal hit direction")] public float MildHorizontalValue = 0f; [Tooltip("If rotation should work on also on x axis - good for spiders, can look wrong on quadropeds etc.")] [Range(0f, 90f)] public float MaxHorizontalRotation = 90f; [Header("> Advanced settings <")] [Tooltip("We should cast raycast from position little higher than foots of your game object")] public float RaycastHeightOffset = 0.5f; [Tooltip("How far ray should cast to check if ground is under feet")] public float RaycastCheckRange = 5f; [Tooltip("If value is not equal 0 there will be casted second ray in front or back of gameObject")] public float LookAheadRaycast = 0f; [Tooltip("Blending with predicted forward raycast rotation")] public float AheadBlend = 0.5f; [Tooltip("Offset over ground")] public float YOffset = 0f; [Space(8f)] //V1.0.1 [Tooltip("What collision layers should be included by algorithm")] public LayerMask GroundLayerMask = 1 << 0; [Tooltip("When casting down vector should adjust with transform's rotation")] public bool RelativeLookUp = true; [Range(0f, 1f)] public float RelativeLookUpBias = 0.25f; /// <summary> For other classes to have access </summary> public RaycastHit LastRaycast { get; protected set; } // V1.1.1 [Space(8f, order = 0)] [Header("Alternative approach", order = 1)] [Tooltip("Casting more raycsts under object to detect ground more precisely, then we use average from all casts to set new rotation")] public bool ZoneCast = false; public Vector2 ZoneCastDimensions = new Vector2(0.3f, 0.5f); public Vector3 ZoneCastOffset = Vector3.zero; [Range(0f, 10f)] public float ZoneCastBias = 0f; [Range(0f, 1f)] [Tooltip("More precision = more raycasts = lower performance")] public float ZoneCastPrecision = 0.25f; public Quaternion LastRotation { get; private set; } // V1.1 /// <summary> Quaternion to help controll over transform's rotation when object is placed and rotated to ground </summary> protected Quaternion helperRotation = Quaternion.identity; protected float delta; void Update() { if (UpdateClock != EFUpdateClock.Update) return; delta = Time.deltaTime; FitToGround(); } void FixedUpdate() { if (UpdateClock != EFUpdateClock.FixedUpdate) return; delta = Time.fixedDeltaTime; FitToGround(); } void LateUpdate() { if (UpdateClock != EFUpdateClock.LateUpdate) return; delta = Time.deltaTime; FitToGround(); } private Vector3 GetUpVector() { if (RelativeLookUp) { return Vector3.Lerp(transform.up, Vector3.up, RelativeLookUpBias); } else return Vector3.up; } protected virtual void FitToGround() { // If we want we casting second ray to prevent object from clipping at big slopes RaycastHit aheadHit = new RaycastHit(); if (LookAheadRaycast != 0f) { Physics.Raycast(transform.position + GetUpVector() * RaycastHeightOffset + transform.forward * LookAheadRaycast, -GetUpVector(), out aheadHit, RaycastCheckRange + YOffset, GroundLayerMask, QueryTriggerInteraction.Ignore); } RefreshLastRaycast(); // If cast catch ground if (LastRaycast.transform) { // We rotate helper transform to snap ground with smoothness Quaternion fromTo = Quaternion.FromToRotation(Vector3.up, LastRaycast.normal); // We mix both casts for average rotation if (aheadHit.transform) { Quaternion aheadFromTo = Quaternion.FromToRotation(Vector3.up, aheadHit.normal); fromTo = Quaternion.Lerp(fromTo, aheadFromTo, AheadBlend); } helperRotation = Quaternion.Slerp(helperRotation, fromTo, delta * FittingSpeed); } else // If nothing is under our legs we rotate object smoothly to zero rotations { helperRotation = Quaternion.Slerp(helperRotation, Quaternion.identity, delta * FittingSpeed); } RotationCalculations(); if (ChangePosition) if (LastRaycast.transform) transform.position = LastRaycast.point + Vector3.up * YOffset; } internal void RotationCalculations() { // Then we can rotate object to target look in y axis Quaternion targetRotation = helperRotation * Quaternion.AngleAxis(RotationYAxis, Vector3.up); targetRotation = Quaternion.Euler(Mathf.Clamp(FLogicMethods.WrapAngle(targetRotation.eulerAngles.x), -MaxForwardRotation, MaxForwardRotation) * (1 - MildForwardValue), targetRotation.eulerAngles.y, Mathf.Clamp(FLogicMethods.WrapAngle(targetRotation.eulerAngles.z), -MaxHorizontalRotation, MaxHorizontalRotation) * (1 - MildHorizontalValue)); if (TotalSmoother == 0f) transform.rotation = targetRotation; else transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, delta * Mathf.Lerp(50f, 1f, TotalSmoother)); LastRotation = transform.rotation; } internal RaycastHit CastRay() { // Cast ground to get data about surface hit RaycastHit outHit; Physics.Raycast(transform.position + GetUpVector() * RaycastHeightOffset, -GetUpVector(), out outHit, RaycastCheckRange + Mathf.Abs(YOffset), GroundLayerMask, QueryTriggerInteraction.Ignore); // Making zone cast calculations to create average ray hit if (ZoneCast) { Vector3 p = transform.position + transform.rotation * ZoneCastOffset + GetUpVector() * RaycastHeightOffset; Vector3 x = transform.right * ZoneCastDimensions.x; Vector3 z = transform.forward * ZoneCastDimensions.y; List<RaycastHit> hits = new List<RaycastHit>(); hits.Add(outHit); RaycastHit newHit; int c = 0; float part = 1f; for (int i = 0; i < Mathf.Lerp(4, 24, ZoneCastPrecision); i++) { Vector3 sum = Vector3.zero; if (c == 0) sum = x - z; else if (c == 1) sum = x + z; else if (c == 2) sum = -x + z; else if (c == 3) { sum = -x - z; part += 0.75f; c = -1; } Physics.Raycast(p + sum / part, -GetUpVector() + sum * ZoneCastBias, out newHit, RaycastCheckRange + Mathf.Abs(YOffset), GroundLayerMask, QueryTriggerInteraction.Ignore); if (newHit.transform) hits.Add(newHit); c++; } Vector3 avPos = Vector3.zero; Vector3 avNormal = Vector3.zero; for (int i = 0; i < hits.Count; i++) { avNormal += hits[i].normal; avPos += hits[i].point; } avPos /= hits.Count; avNormal /= hits.Count; outHit.normal = avNormal; if (!outHit.transform) { outHit.point = new Vector3(avPos.x, transform.position.y, avPos.z); } } return outHit; } internal void RefreshLastRaycast() { LastRaycast = CastRay(); } // V1.0.1 #if UNITY_EDITOR [Space(4f)] public bool drawDebug = true; // Set it to false if you don't want show clickable gizmo [Space(1f)] public bool drawGizmo = true; protected virtual void OnDrawGizmos() { if (drawDebug) { Gizmos.color = new Color(1f, 0.2f, 0.4f, 0.8f); Gizmos.DrawRay(transform.position + GetUpVector() * RaycastHeightOffset, GetUpVector() * -RaycastCheckRange); if (LookAheadRaycast != 0f) { Gizmos.color = new Color(0.2f, 0.4f, 1f, 0.8f); Gizmos.DrawRay(transform.position + GetUpVector() * RaycastHeightOffset + transform.forward * LookAheadRaycast, -GetUpVector() * (RaycastCheckRange /*+ YOffset*/)); } if (ZoneCast) { Vector3 p = transform.position + transform.rotation * ZoneCastOffset + GetUpVector() * RaycastHeightOffset; Vector3 x = transform.right * ZoneCastDimensions.x; Vector3 z = transform.forward * ZoneCastDimensions.y; Gizmos.color = new Color(0.2f, 1f, 0.4f, 0.8f); // Drawing rectangle for guide how zone rays will go Gizmos.DrawLine(p + x - z, p + x + z); Gizmos.DrawLine(p + x + z, p - x + z); Gizmos.DrawLine(p - x + z, p - x - z); Gizmos.DrawLine(p - x - z, p + x - z); Vector3 downDir = -GetUpVector() * RaycastCheckRange; int c = 0; float part = 1f; for (int i = 0; i < Mathf.Lerp(4, 24, ZoneCastPrecision); i++) { Vector3 sum = Vector3.zero; if (c == 0) sum = x - z; else if (c == 1) sum = x + z; else if (c == 2) sum = -x + z; else if (c == 3) { sum = -x - z; part += 0.75f; if (part > 2.5f) part += 1f; if (part > 5.5f) part += 3f; if (part > 10f) part += 7f; c = -1; } Gizmos.DrawRay(p + sum / part, downDir + sum * ZoneCastBias); c++; } } } if (!drawGizmo) return; Gizmos.DrawIcon(transform.position, "FIMSpace/GroundFitter/SPR_GroundFitter Gizmo.png", true); } #endif } } Knackpunkt sollte das hier sein: internal void RotationCalculations() { // Then we can rotate object to target look in y axis Quaternion targetRotation = helperRotation * Quaternion.AngleAxis(RotationYAxis, Vector3.up); targetRotation = Quaternion.Euler(Mathf.Clamp(FLogicMethods.WrapAngle(targetRotation.eulerAngles.x), -MaxForwardRotation, MaxForwardRotation) * (1 - MildForwardValue), targetRotation.eulerAngles.y, Mathf.Clamp(FLogicMethods.WrapAngle(targetRotation.eulerAngles.z), -MaxHorizontalRotation, MaxHorizontalRotation) * (1 - MildHorizontalValue)); if (TotalSmoother == 0f) transform.rotation = targetRotation; else transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, delta * Mathf.Lerp(50f, 1f, TotalSmoother)); LastRotation = transform.rotation; } Ich habe nun schon versucht hier die Y auf Standardmässig auf 0 zu setzen, jedoch funktioniert es einfach nicht. Hoffe ihr könnt mir hier weiter helfen! Danke schonmal und grüße von Kojote
  24. Kojote

    Entfernung Y-Achse

    Ich meine Rotation, genau. Wollte mit diesem Script nur X und Z Rotation korrigieren, jedoch nicht Y. Da das Script in einem Child liegt, muss Y immer 0 sein, da dass ELternobjekt ja Y schon vorgibt. Verstehe an dem Script jedoch nicht wo er Y berechnet, bzw. warum es sich nicht auf 0 setzen lässt.
  25. Kojote

    Entfernung Y-Achse

    Die Steuerung funktioniert über ein anderes Script, einen gekauften Charakter-Kontroller. Dieser schafft es aber nicht den Charakter auf dem Terrain ordentlich zu positionieren, aus diesem Grund das Zusatzscript. Dieses soll aber nicht die Y Achse ändern, sondern nur X und Z.
×