Jump to content
Unity Insider Forum

Leaderboard


Popular Content

Showing content with the highest reputation since 05/25/2018 in all areas

  1. 3 points
    Das ist normal, man kann den Ordner ohne Probleme löschen, jedoch müssen die Shader dann neu kompiliert werden (-> ggf. längere Ladezeiten im Editor). In der Dokumentation von Unity findet man viele Antworten: https://docs.unity3d.com/Manual/class-Shader.html Strg + F drucken und "Cache" eingeben, und schon findet man die Erklärung
  2. 3 points
    Es gibt Neuigkeiten! Wir sind nicht auf der faulen Haut gelegen und haben allerhand Grafiken und Funktionen implementiert. 90% der Sprites sind allerdings Neuauflagen und ich will euch nicht damit zuspammen.🤓 Schaut euch einfach den unterschied zwischen den Kanonen an. Wir haben allerdings einen Neuzugang in Form eines Mörsers (dem dicken kleinen Bruder der Kanone). Im Gegensatz zur Kanone ist er ein NPC und soll später im Editor vielseitig modifizierbar sein. Munition mit verschiedenen Eigenschaften: Und ein paar dazugehörige Spezialeffekte: Währenddessen arbeitet unsere IT Abteilung (Antragon) unermüdlich daran, Editor und Gameplay zu verbinden. Ich hoffe, dass wir bald mehr davon herzeigen können. Das ganze nochmal ausführlich: https://wordpress.com/view/polywonk.wordpress.com
  3. 2 points
    Wenn es an der Terrain-Auflösung liegt meine ich mal gelesen zu haben, dass es eine Funktion gibt die genau das für angrenzende Terrains angleicht. https://docs.unity3d.com/ScriptReference/Terrain.SetNeighbors.html
  4. 2 points
    Hi Peter, wie gesagt, mir liegt und lag es fern irgend jemanden zu denunzieren. Ich bin eher beeindruckt davon wie ihr euch durch alle Bereiche durchbeißt und euer Content stetig steigt. Klar muss es kein AAA Titel sein und ein gutes Indie Spiel von Hobbyisten das Spaß macht ist mehr wert als jede Grafik. Das ihr ein jährliches Budget von ganzen 15k habt finde ich bemerkenswert, sowas hat auch nicht jeder Hobbyist. Dennoch wäre es denke ich eine Bereicherung jemanden dabei zu haben der ein wenig mehr Erfahrung im Bereich 3D hat. Nicht nur wegen der Optik oder dem Kommerz, sondern auch weil es euer Spiel mehr Performance geben würde und den Mitgliedern eures Teams lerntechnisch sicherlich auch zu gute kommen würde. Ich habe euer Spiel einmal ausprobiert und durch die fehlenden Lightbakes und den wohl zu hohen Polywerte und anderen Kleinigkeiten ruckelt das Spiel doch schon ziemlich auf einen doch recht guten PC. Ich weiß das sowas fast nicht umzusetzen ist was ich hier vorschlage. Erst einmal müsste man jemanden finden der 3D technisch gutes Wissen besitzt und diese Person müsste dann zusammen mit den anderen 3Dlern fast jedes Model nachträglich optimieren, bei der Masse die ihr habt wäre das ein heftiger Zeitaufwand. Andererseits ist es besser so früh wie möglich solch einen Weg einzuschlagen oder wenigstens diesen in betracht zu ziehen denn wenn euer Spiel mal rund werden soll, dann wird aus meiner Sicht daran kein Weg vorbei gehen. Außerdem könnt ihr nur gewinnen. Man lernt etwas, es sieht hübscher aus, es bringt ein besseres Spielgefühl, es motiviert und die Chancen auf kommerziellen Erfolg steigen ebenfalls. Achja , bin schon länger in diesem Forum und verfolge euren Werdegang schon seit einiger Zeit. Hätte zu Beginn nie gedacht das ihr so weit kommt.
  5. 1 point
    Also wenn du physikalische Befehle nutzen willst, dann mache es immer in der FixedUpdate. Nie in der Update! Setze also eine Variable in der Update auf true und in der FixedUpdate fragst du die ab und machst dann da deinen Boost. Reibungen, Drag-Werte und Schwerkraft werden immer nur in der Fixed berücksichtigt und berechnet. Somit kann es durchaus sein, dass der Boost in der Update auf deinem Rechner (60fps) und auf nem Handy (30fps) wegen der deltaTime unterschiedlich viel Power bekommt, die aber erst eine gewisse Zeit später berücksichtigt werden. Kann ja auch sein, dass dein Fixed Timestep für ein Handy zu gering ist und gar nicht eingehalten werden kann.
  6. 1 point
    Man ruft Methoden oft (und auch in diesem Fall) auf, indem man den Methodennamen hinter einen Punkt schreibt und vor den Punkt... noch etwas. Im Falle einer nicht-statischen Methode kommt vor den Punkt der Name einer Variable, die ein Objekt referenziert, das vom Typ der Klasse ist, die die Methode definiert. Ist etwas schwierig ausgedrückt, daher nochmal als Kette anhand deines Beispiels: Du hast eine Klasse "Karte". "Karte" definiert eine nicht-statische Methode "shuffle". Du brauchst daher ein Objekt vom Typ "Karte", an dem du die Methode aufrufen kannst. Um mit einem Objekt arbeiten zu können, brauchst du eine Variable, die das Objekt referenziert. Der Methodenaufruf erfolgt durch variablenname.Methodenname( ... ). Das hier würde also funktionieren: var karte = new Karte(); karte.shuffle(karten); Allerdings ergibt diese Lösung keinen Sinn, auch wenn das Ergebnis erst einmal stimmen würde. Daher die Frage: Warum ist die Misch-Methode Teil der Klasse "Karte"? Klassen gibt es ja nicht zum Spaß. Sie sind dafür da, dass man Aufgaben des Programms in logische Einheiten unterteilen kann, die, falls möglich, der echten Welt entsprechen. Ein Auto fährt. Eine Person sitzt im Auto. Eine Person kann mit einem Schraubendreher das Auto reparieren. Was aber nicht viel Sinn ergibt ist, dass eine Karte einen Kartenstapel mischt, aber genau das definierst du hier. Bewege also einfach die shuffle-Methode aus der Kartenklasse in die Klasse "Spielverwaltung", und schon ergibt das alles mehr Sinn. class Spielverwaltung : MonoBehaviour { class Karte { ... } private void shuffle(Karte[] karten) { ... } } Und das beste: Dann kannst du auch deine Aufrufzeile so lassen, wie sie jetzt ist: shuffle(karten); Ich würde dann auch noch einmal überdenken, warum die Kartenklasse in die Spielverwaltung eingenistet sein soll. Bringt hier nicht wirklich Vorteile.
  7. 1 point
    Worin unterscheiden sich denn deine 80 Prefabs? Ich nehme an, dass sie alle dieselben Komponenten haben und sich nur durch die Werte der Komponenten unterscheiden. Auftritt: ScriptableObjects! ScriptableObjects sind Objekte, die nicht wie MonoBehaviours als Komponenten auf GameObjects gelegt, sondern (unter anderem) als Assets in deinen Assets-Ordner gespeichert werden können. Als Grundlage baust du das hier: using UnityEngine; [CreateAssetMenu] public class CardData : ScriptableObject { // Inhalte hier } Wenn das getan ist, kannst du fortan in deiner Project View Rechtsklicken, dann Create, und statt z.B. "C# Script" "CardData" auswählen. Jetzt hast du ein neues CardData-Objekt, das exakt keine Werte oder sonst irgendetwas beinhaltet. Im Vergleich zu einem Prefab fehlen auch die Transform-Komponente und vergleichbares. Ein ScriptableObject enthält nur genau die Daten, die du ihm vorgibst. Das machst du, indem du Felder in die ScriptableObject-Klasse hinzufügst. Statt "Inhalte hier" schreibst du also z.B.: public string title; [Multiline] public string description; public Sprite image; public Color backgroundColor; und kannst dann auf deinem erstellten ScriptableObject diese Werte wie gewohnt einstellen. Als nächstes sind ScriptableObjects allesamt UnityEngine.Objects. Das bedeutet, dass du sie per Drag and Drop zuweisen kannst, so wie du auch z.B. ein Sprite in einen SpriteRenderer ziehen kannst. Dafür erstellst du einfach ein öffentliches Feld in einer normalen MonoBehaviour-Klasse: // Nur zum Testen public class CardTest : MonoBehaviour { public CardData card; private void Start() { Debug.Log("Titel der Karte: " + card.title); Debug.Log("Beschreibung der Karte: " + card.description); } } Diese Klasse ist nicht besonders sinnvoll, aber veranschaulicht dass du, sobald du eine Referenz auf ein CardData-Objekt hast, die Felder davon ansprechen und auslesen kannst. Denke daran, das CardData-Objekt aus deinen Assets auf diese Komponente zu ziehen, nachdem du sie auf ein GameObjekt gezogen hast. Wenn du jetzt einen SpriteRenderer auf deinem Test-GameObject hast, kannst du auch so etwas machen: var spriteRenderer = GetComponent<SpriteRenderer>(); spriteRenderer.sprite = card.image; Und dann wird das Sprite, dass du dem CardData-Objekt in deinen Assets zugewiesen hast, vom SpriteRenderer angezeigt. Jetzt kannst du dir ein Kartendeck zusammenstellen, indem du eine Liste oder ein Array von CardData-Objekten anlegst: public CardData[] cards; Dort kannst du jetzt deine 80 Karten reinziehen, nachdem du sie in einem Ordner in den Assets angelegt hast. Und dann kannst du mit allen Karten arbeiten. Wenn du jetzt noch ein Karten-Prefab anlegst, dem du ein CardData-Objekt in die Hand drückst und es zeigt dieses dann an, dann hast du den größten Teil für ein System, das Karten anzeigt. Mit nur einem Prefab. Falls du dich jetzt fragst: "Was soll denn das, dann hab ich doch immer noch 80 einzelne Objekte?" Ja, die hast du. Aber... Du hast aber nur noch ein Prefab. Wenn du also z.B. das Hintergrundbild aller Karten ändern willst, musst du das eine Prefab abändern, und nicht alle 80. CardData-Objekte sind wesentlich kleiner als Prefabs, weil sie nur die Daten beinhalten, die du ihnen gibst, und kein Ballast wie die Transform-Komponente. Als alternative Möglichkeit hast du prinzipiell immer nur eine lange Liste. Sei es eine Textdatei, in die du alle Karten untereinander schreibst, oder eine Liste irgendwie in Unity. Diese Liste bedeutet ungefähr gleich viel Arbeit, erlaubt dir aber nie so schön, die CardData-Objekte so hin und her zu schieben, wie du es gerade haben willst. Ich jedenfalls habe auch u.a. ein Kartenspiel in der Mache, und da mache ich das genau so
  8. 1 point
    Wenn deine Variable public ist, dann bedeutet das in C#, dass andere Klassen den Wert auslesen und ändern können. In Unity heißt das zusätzlich, dass der Wert im Editor editiert werden kann und dass der eingestellte Wert als Teil deiner Szene gespeichert (serialisiert) wird. Wenn du jetzt nicht willst, dass andere Klassen den Wert der Variable auslesen und ändern können, dann machst du die Variable z.B. private. Dadurch geht aber auch der Unity-Effekt (zu sehen im Inspektor, serialisiert) flöten. Mit [SerializeField] schaltest du Serialisierung wieder ein, ohne deine Variable öffentlich zu machen. Da gehe ich stark von aus.
  9. 1 point
    Hi, wenn du willst, dass 'instScaleMax' gleich 'instScaleMinS1 + 1' ist, dann würde ich das auch einfach so hinschreiben ^^ Wenn du willst, dass der Wert von 'instScaleMinS1' um eins erhöht wird und danach zugewiesen wird, musst du das '++' als Präfix schreiben. ( https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/increment-operator ) So wie du es momentan hast, mit '++' als Postfix, wird der Wert zugewiesen, und danach um 1 erhöht.
  10. 1 point
    Ich glaube nicht, dass das Gefundene ausreicht. Irgendwie muss ja dein Wesen aus dem Sarg raus kommen. Das wirst du alleine mit ner tollen Kamerafahrt nicht hin bekommen. Du kannst dir ja mal die Ressourcendaten von Adam, dem Unity Kruzfilm, anschauen. Dort wird natürlich die Kamera bewegt und zwischen den Perspektiven hin und her geschaltet. Aber trotzdem muss sich ja der Rest auch bewegen. Soll das alles "ingame" gemacht werden, musst du Animationen für deinen Charakter erzeugen und auch für alle anderen Objekte, mit denen dein Char interagiert. Diese nutzt du dann in Unity. (Klar, man kann auch direkt in Unity animieren, aber da eine anständige Charakteranimation hin zu kriegen ist irre schwierig) Kamrafahrt, Ausleuchtung und Sound werden dann direkt in Unity zur Echtzeit gerendert. Jetzt kannst du Cinemachine nutzen, um nicht alles scripten zu müssen. Du kannst aber auch alles in einem 3D Programm erzeugen und rendern und dann in Unity einfach als Film ablaufen lassen. Je nachdem, was man selbst und das 3D Programm alles kann, kommen da viel hochwertigere Filme bei raus, als wenn man das direkt in Unity macht. Dafür kostet das natürlich Datenplatz für den Film. Alles in Unity zu machen, macht das Spiel viel schlanker. Wähle also dein Tor!
  11. 1 point
    Ja wirst ohne Animation nicht weiter kommen. Brauchst 3D Grafiksuite Programm dafür. Dort machst du Animationen und exportierst dann nach Unity.
  12. 1 point
    Ne, du machst nichts falsch. Aber du hast da einen Denkfehler. Ein Prefab ist einfach eine Blaupause. Du stellst also einige Objekte, Komponenten und Werte zusammen, und erzeugst daraus eine Blaupause für Clone deines eben erstellten Dingens. Wenn du jetzt so ein Prefab in die Szene legst, dann weiß Unity welche echten Objekte, Komponenten und Werte jetzt genauso zusammengefügt werden sollen und setzt das dann in die Szene. Dein neues Prefab aus unterschiedlichen anderen Prefabs plus dem Überobjekt, ist jetzt wieder nur eine Blaupause. Aber nicht von den Prefabs zuvor, sondern von den echten Objekten, Komponenten und Werten, die vom ursprünglichen Prefab in die Szene gebracht wurden. Diese Sachen wurden jetzt zu dem neuen Prefab mit all den EIgenschaften die sie gerade jetzt haben. Wenn du jetzt dieses neue große Prefab in eine Szene setzt, dann gibt es keine Verbindung zu den anderen Prefabs mehr, aus denen du das Ganze zusammengebaut hast. Denn das Ganze Objekt ist jetzt ein eigenständiges Prefab.
  13. 1 point
    Die Scene View-Kamera hat einen unsichtbaren Fokuspunkt, den man durch das Rumfliegen und Zoomen verschiebt. Bei dir ist er offenbar hinter der 2D-Ebene gelandet, sodass du beim Ranzoomen hindurch gehst, oder zumindest zu nah dran, sodass Dinge darauf nicht mehr gerendert werden. Lösung: Den Fokuspunkt auf einen deiner SpriteRenderer setzen. Das machst du, indem du auf das GameObject in der Hierarchie doppelklickst. Alternativ kannst du es markieren und F drücken.
  14. 1 point
    Hi, wenn du die Koordinaten der Zelle vom letzten und diesem Frame hast, kannst du dir eine Gerade durch diese zwei Punkte denken. Dann kannst du von jeder Zelle den Abstand zu dieser Geraden berechnen, und wenn der z.B. kleiner 1 ist, färbst du die Zelle. Im Grunde ist das das gleiche, wie wenn du versuchst eine Linie auf ein 100x100 Pixel Bild zu zeichnen. Bei Google findet man dazu mehrere Wege. Das was ich oben beschrieben habe würde etwa so aussehen: private bool[,] Cells = new bool[100, 100]; private void Line(int x1, int y1, int x2, int y2){ Vector2 start = new Vector2(x1, y1); Vector2 dir = new Vector2(x2-x1, y2-y1); float sqrLengthInv = 1f / Vector2.Dot(dir, dir); for(int y=0;y<100;y++){ for(int x=0;x<100;x++){ float k = Vector2.Dot(new Vector2(x-x1, y-y1), dir) * sqrLengthInv; //projektion auf die Gerade Vector2 closestOnLine = start + dir * k; bool onLine = k>=0 && k<=1 && (closestOnLine-start).magnitude < 1; Cells[x][y] = onLine; } } } (nicht getestet)
  15. 1 point
    Ich drücke euch auf jeden Fall die Daumen
  16. 1 point
    Ob du Translate benutzt, oder wie ich die Position direkt setzt, macht keinen Unterschied. Bei beiden wird das Objekt einfach an die neue Position 'teleportiert'. Wenn du einen Rigidbody verwendest, solltest du zum einen die Bewegung in FixedUpdate ausführen, und mit der 'velocity' / ApplyForce() vom Rigidbody arbeiten. Stimmt, aber ich wüsste nicht, was das für einen Unterschied machen soll? Ist der Input negativ, ist die Bewegung negativ und umgekehrt. Hast du mein 'edit' gesehen? Mit 'transform.TransformDirection()' kannst du den Bewegungsvektor entsprechend der Ausrichtung deines Objekts drehen. https://docs.unity3d.com/ScriptReference/Transform.TransformDirection.html
  17. 1 point
    Ich glaube du machst dir das komplizierter als es eigentlich ist. public Vector2 MinMaxX; public Vector2 MinMaxY; public float sensitivity; private void Update(){ Vector3 kameraPosition = kameraTransform.position; Vector2 movement = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * sensitivity * Time.deltaTime; kameraPosition.x = Mathf.Clamp(kameraPosition.x + movement.x, MinMaxX.x, MinMaxX.y); kameraPosition.z = Mathf.Clamp(kameraPosition.z + movement.y, MinMaxY.x, MinMaxY.y); kameraTransform.position = kameraPosition; } "fällt das Objekt um mitsamt Kamera einfach um" Hat dein Objet einene Rigidbody Componente? Wenn ja, solltest du nicht mit Translate() arbeiten. Außerdem holst du dir immer wieder die mausInputX, mausInputY und Position der Kamera. Das kannst du alles einfach einmal am Anfang machen. Das ist performanter und kürzer.. edit: Wenn du noch willst, dass die Bewegung abhängig von der Rotation ist, kannst du das so machen: Vector3 movement = kameraTransform.TransformDirection(new Vector3(Input.GetAxis("Mouse X"), 0, Input.GetAxis("Mouse Y")) * sensitivity * Time.deltaTime); Und dann natürlich noch "kameraPosition.z + movement.y" zu "kameraPosition.z + movement.z" ändern..
  18. 1 point
    Bitte nicht GetComponent in einem Kontext verwenden, wo es immer wieder aufgerufen wird.
  19. 1 point
    Finde euer Projekt echt klasse. Euer Durchhaltevermögen und euer Fortschritt ist bemerkenswert. Hätte nie gedacht das ihr dieses Projekt so weit bringt. Was ich relativ schade finde, ohne jetzt jemanden hier herabwürdigen zu wollen, ist das eure 3D Modelle und Animationen nicht ganz so herausragend sind. Ich denke da habt ihr noch Luft nach oben und wenn das Spiel optisch etwas ansprechender wäre, würde es denke ich mal auch mehr Aufmerksamkeit erregen als es das jetzt schon macht. Wie gesagt will niemanden hier schlecht machen aber es fällt halt auf, ich hoffe ihr nehmt mir diese Kritik nicht übel. Wie gesagt, ich bin sehr beeindruckt von dem was ihr bisher alle geleistet habt.
  20. 1 point
    Ja. Aber erstmal musst du aber dein Charakter Objekt, oder Script an dein Kugel Script einbinden. Als Erstes erstellst du public Variable z.b als GameObject: public GameObject spieler; Dann erscheint auf dem Script eine neue Variable Spieler, da kannst du dein Spieler Objekt einbinden. Jetzt kannst du im Script auf deine Spieler Variablen wie Geschwindigkeit zugreifen: public GameObject spieler; void Start() { spieler.GetComponent<Scriptname>().speed = neuerWert; } Warum du die Fehlermeldung bekommst, hat schon Sascha erklärt. Allerdings wenn du das gefixt hast, wirst du noch eine Fehlermeldung bekommen und zwar wegen Lerp. Dieser erwartet neben zwei Vector3, noch einen dritten float Parameter. hier kannst du genauer über die Funktion nachlesen : https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html Und noch eine Kleinigkeit nebenbei, statt: if (distance <5 || distance > 5) {} kann man auch: if (distance != 5) {} schreiben
  21. 1 point
    Ich schreib mal alles, was mir so einfällt und hoffe, damit das richtige abzudecken Fangen wir mal hierbei an. Du weist ja einen neuen Vektor zu, und zwar dieser Eigenschaft: followobject.transform.position = ... Hierbei kannst du das "transform" weglassen, denn "followobject" referenziert bereits die Transform-Komponente. Nun ist es aber so, dass alle Komponenten alle Komponenten auf ihrem GameObject kennen - und damit meine ich nicht "alle anderen"! Du kannst z.B. die Licht-Komponente nach der Transform-Komponente fragen oder umgekehrt. Du kannst aber auch die Transform-Komponente nach der Transform-Komponente fragen, und genau das tust du hier. Man kann also auch schreiben: followobject.transform.transform.transform.position = ... ist aber nicht sinnvoll Weiter rechts jedenfalls machst du das auch und schreibst direkt "followobject.postition". Weiter zur Exception. Noch weiter rechts schreibst du targetobject.position und das geht nicht. Der Grund: Während deine Variable "followobject" eine Transform-Komponente referenziert, ist "targetobject" vom Typ GameObject. Hier musst du also schreiben targetobject.transform.position oder, was ich eher empfehlen würde, du änderst die Definition von "targetobject" und schreibst auch private var targetobject : Transform; und entsprechend in Awake targetobject = GameObject.Find("RollerBall").transform; Du verlagerst also einfach das ".transform" von Update nach Awake. Das ist gut, weil es dann nur einmal aufgerufen werden muss. Als nächstes: Jau: Debug.Log(Vector3.Distance(targetobject.transform.position, followobject.transform.position)); // Distanz ausgeben Debug.Log(followobject.position); // Position ausgeben Beachte die Punkte, die ich aus der ersten Zeile entfernt habe.
  22. 1 point
    ich habs jetzt doch noch hinbekommen. Im Grunde war es schon der richtige Ansatz. public float Aim(Vector3 target) { this.targetVector = target - v_Achse.transform.position; Quaternion targetRotation = Quaternion.LookRotation(targetVector, baseRotation * Vector3.up); // Für die Animation: Quaternion aniRotation = transform.worldToLocalMatrix.rotation * Quaternion.RotateTowards(vRotation, targetRotation, rotationSpeed * Time.deltaTime * 60f); // Erforderlich, da Quaternion.RotateTowards kein UP-Vector hat, so wie Quaternion.LookRotation. Vector3 euler = aniRotation.eulerAngles; euler.z = 0; this.vRotation = transform.localToWorldMatrix.rotation * Quaternion.Euler(euler); // Soll sich um die lokale XY-Achse drehen. euler.x = 0; this.hRotation = transform.localToWorldMatrix.rotation * Quaternion.Euler(euler); // Soll sich nur um die lokale Y-Achse drehen. }
  23. 1 point
    So, nun hab ich aber was gut Hier der Shader (ich habe noch ein paar Zeilen aus dem Original Sprite Shader eingefügt für's PixelSnap und Flipping): Shader "Sprites/Beat/Diffuse-Shadow" { Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1) [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1) _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5 } SubShader { Tags { "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" } LOD 200 Cull Off Lighting On ZWrite Off CGPROGRAM #pragma surface surf Lambert vertex:vert addshadow alphatest:_Cutoff #pragma multi_compile _ PIXELSNAP_ON #include "UnitySprites.cginc" struct Input { float2 uv_MainTex; fixed4 color; }; void vert(inout appdata_full v, out Input o) { v.vertex.xy *= _Flip.xy; #if defined(PIXELSNAP_ON) v.vertex = UnityPixelSnap(v.vertex); #endif UNITY_INITIALIZE_OUTPUT(Input, o); o.color = v.color * _Color * _RendererColor; } void surf(Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } Fallback "Legacy Shaders/Transparent/Cutout/VertexLit" } Dieses Skript ist auch noch notwendig, damit der Sprite Renderer auch Schatten weiterleitet: using UnityEngine; using UnityEngine.Rendering; public class ControlSpriteRenderer : MonoBehaviour { private Renderer render; // Use this for initialization void Start () { render = GetComponent<Renderer>(); render.receiveShadows = true; render.shadowCastingMode = ShadowCastingMode.On; } } Der Schattenwurf scheint aber nur für's Directional-Light zu funktionieren. Bei einem Spot-Light scheinen keine Schatten zu entstehen ...
  24. 1 point
    Evtl. kommst du mit dem Pitchwert der Audiosource zum gewünschten Ergebnis: https://docs.unity3d.com/ScriptReference/AudioSource-pitch.html Ansonsten kann man auch den Clip "vorspulen", damit spielt er dann nur einen Teil des Audios ab. Einfach auf time ein paar Sekunden draufaddieren (wenn der Sound mehrere Sekunden lang ist). Ggf. die Länge des Clips vorher auslesen, damit man die Restlänge berechnen kann: https://docs.unity3d.com/ScriptReference/AudioSource-time.html Beispiel: Cliplänge: 3 Sekunden (kann man aus dem Clip auslesen) Bogen-Distanz Maximal: 5 (musst du selbst festlegen - siehe Skript unten) using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { private AudioSource audioSource; private float clipLength; private float maxBowDist = 5.0f; private float addedTime; void Start() { audioSource = GetComponent<AudioSource>(); clipLength = audioSource.clip.length; } void Update() { if (Input.GetKeyDown(KeyCode.Return)) { float dist = (stringStartPoint.transform.position - grabpoint.transform.position).magnitude; addedTime = (clipLength/maxBowDist) * dist; audioSource.time = clipLength - addedTime; // Audioclip verkürzt abspielen je nach Bogenspannung audioSource.Play(); } } }
  25. 1 point
    Habe beides in euro angezeigt aber ich glaub jetzt weiß ich wo der zauber dahinter steckt. Im neuen store werden steuern nicht im preis angezeigt sondern erst beim bezahlen. Schade, und ich dachte man könnte wirklich geld sparen

Announcements

Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×