Jump to content
Unity Insider Forum

Kojote

Members
  • Content count

    1,030
  • Joined

  • Last visited

  • Days Won

    5

Kojote last won the day on June 29

Kojote had the most liked content!

Community Reputation

34 Excellent

About Kojote

  • Rank
    Advanced Member

Recent Profile Visitors

1,209 profile views
  1. Kojote

    Animation Run Walk wechseln

    Und wie mache ich diese Abhängigkeit?
  2. 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?
  3. Kojote

    Static und Nicht Static

    Interessanter Ansatz, teste ich mal aus, danke! 😀
  4. 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.
  5. 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
  6. 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.
  7. 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.
  8. 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
  9. Grüße! Ich bastel gerade an einem Spiel bei dem ich im Hauptmenü in einem Fenster neueste Informationen zum Spiel einblenden möchte. Diese Daten soll sich das Spiel möglichst selbst von mir holen, sprich extern. Frage ist, wie stelle ich es am besten an? Ich dachte schon darab, dass ich auf einem Server eine XML-Datei hinterlege, die sich das Spiel selbst holen kann. So könnte ich auch Information für Information einzeln auslesen. Frage wäre, könnte man das noch anders oder besser anstellen, eventuell mit einem CMS oder Datenbank? Letzteres wäre auch nicht schlecht, frage wäre wie ich hier die Benutzeroberfläche gestalte. Grüße von Kojote
  10. Kojote

    LOD

    Hallo! Ich baue mir gerade ein paar Steine und wollte LOD nutzen. Dazu mal zwei Fragen. 1. Ich habe nun einen Stein mit drei verschiedenen Detailgraden und exportiere ihn im gesamten in eine FBX-Datei. Importiert wird das Modell von Unity in die Hierarchy gleich mit der Komponente LOD-Group. Frage wäre hier, ist nun nur ein Modell aktiv oder muss ich die anderen GameObjekts deaktivieren? 2. Ich bekomme eine Meldung: "Active bias is 0.7. Distances are adjusted accordingly." Ich hab nun schon Google befragt aber so richig versteh ich nicht, was er da meldet. Kann mir das wer mal erklären? Vielen Dank schon mal und Grüße von Kojote
  11. Kojote

    Shader suche

    Grüße! Ich suche einen Overlay Shader. Overlay in der Hinsicht, dass ich mehrer Texturebene übereinander legen möchte. Also eine MainTex habe und dann weitere Muster aufgelegt werden können. Einen Overlay-Shader mit drei Ebenen hatte mir ZeroCool mal geschrieben, würde aber gern noch ein bis zwei Ebenen mehr haben um flexibler zu sein. Kennt da jemand so einen Shader? Grüße von Kojote EDIT: Problem hat sich geklärt, funktioniert so wie gedacht nicht.
  12. Kojote

    Scroll Rect Mask

    Das blöde ist, das Dropdown Feld bzw. dessen Inhalt wird durch ein Asset zur Laufzeit erzeugt. Ich kanns auch nicht nachkorrigieren, da ich nichts eintragen darf.
  13. Kojote

    Scroll Rect Mask

    Grüße! Ich habe ein paar Probleme mit dem Scroll Rect. Dieses besitzt eine Mask, um den Überstand der Items auszuschneiden. Nun, wie auf dem Bild szu sehen ist, ist die Mask zu groß, lässt sich auch nicht korrigieren. Das Problem tritt erst auf, wenn Items eine gewisse Textgröße überschreiten. Habt ihr eine Idee für mich? Hier mal der Fehler: https://www.imagebanana.com/s/1226/WAWymqG4.html Grüße von Kojote
  14. Keine Ahnung ob du mit Animationen oder der gleichen arbeiten willst. Wenn wir einen Jenga Turm nehmen, mal als Beispiel, kann man auch nicht einfach einen Stein heraus nehmen oder reißen. Er würde andere Steine ja mit beeinflussen. Das muss bedacht werden. Darum mal folgende Idee. Wenn es nun rein darum geht kleine Steine zu entfernen, würde ich mit Collision arbeiten. Den Steinen den Tag "Stein" geben und den Hinternissen den Tag "Hinderniss". Wenn es nun zu einer Collision kommt muss abgefragt werden, ob mit einem Hinderniss kollidiert wurde, wenn ja, Objekt zerstört sich selbst. So würde Teil für Teil aus deinem großen Würfel verschwinden.
  15. Kojote

    Rect steuern

    Ist nur hier im Forum so.
×