Noa3 Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Hi, ich würde gerne fragen ob jemand eine lösung weiss eine art unsichtbare wand zu erstellen und wenn ein objekt sich nähert dann eine art textur(nicht die ganze wand sondern eher ein teil davon wo das objekt am nächsten ist) auf dieser wand erscheinen zu lassen. Vielen dank für die hilfe, Noa3 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Unsichtbare Wand? Ein GameObject ohne Mesh mit einem BoxCollider. Dann der Wand ein Skript "WallPart" oder so geben und in der Methode deine Plane mit Textur zeichnen oder so in der Art. void OnCollisionStay(collider other) { //was auch immer zeichnen } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noa3 Geschrieben 28. Mai 2014 Autor Melden Share Geschrieben 28. Mai 2014 Hm hatte überlegt zuerst ein box zu erstellen, dem eine textur zu geben und dann über den alphakanal zu steuern. aber dies würde die gesammte box betreffen, das will ich nicht. möchte sozusagen nur einen kleinen teil an der wand mit der textur zeigen. Beispiel: Box liegt 100 einheiten weg von der wand und diese ist nicht sichtbar, sie liegt 20 einheitennur noch drann und es wird ein kleiner punkt auf der wand angezeigt>>> nach dem motto da ist was im weg, 10 einheiten und der punkt ist etwas grösser als die box, bei 0 units kommt der aufprall und geht nicht weiter. Hoffe konnte es etwas besser erklären :/ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Harlyk Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Ich spiele gerade mit einen ähnlichen Gedanken, ich habe da eine Umsetzungsidee also reine Theorie habe es noch nicht getestet. Du könntest die Entfernung des Spielers zur Wand abfragen, durch einen Trigger oder nen Raycast. Die Entfernung verwendest du dann prozentualen Wert. Den prozentualen Wert würde ich dann dem Alphawert der Textur deiner Wand zuweisen. Also um so näher du an der Wand bist desto höher ist der Alphawert deiner Textur also desto mehr siehst du von der Wand. Wenn du nun die Wände aus mehreren kleinen Teilen erstellst wird jedes Stück der Wand unterschiedlich stark zu sehen sein da jedes Stück unterschiedlich weit weg vom Spieler ist. Tada der Effekt den du haben willst Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noa3 Geschrieben 28. Mai 2014 Autor Melden Share Geschrieben 28. Mai 2014 hm, danke das war ne gute idee, es sollte klappen, wenn ich mir ne plane mit ner textur erstelle und dann diese immer zum nächstgelegenden wand raufzeigen lasse. um so näher der spieler um so höher der alpha wert und grösser die plane. danke für den denk anstoß. damit kann ich auch ein paar schicke shader benutzen vieleicht^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Du kannst auch direkt im Shader die Distanz zur Kamera verwenden um damit je nach Entfernung die Transparenz direkt im Shader zu setzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noa3 Geschrieben 28. Mai 2014 Autor Melden Share Geschrieben 28. Mai 2014 Soooo, nen bissel rumprobiert und leider ist das ergebniss ganz anders als ich wollte >.< der setzt die plane auf das objekt das mit den raycast collidiert und leider nicht auf die position wo es collidiert ist. der auszug aus dem code den ich habe: public GameObject Hover; public float ShowBlockingTexturDistanceStart = 250.0f; public MeshRenderer MR; // Use this for initialization void Start () { MR = GetComponent<MeshRenderer>(); } void FixedUpdate () { Vector3 fwd = transform.TransformDirection(Vector3.forward); Vector3 Bleft = transform.TransformDirection(Vector3.left); //vector für links Vector3 Bright = transform.TransformDirection(Vector3.right);//vector für rechts RaycastHit hit; if (Physics.Raycast(transform.position, Bleft, out hit, ShowBlockingTexturDistanceStart)) //wenn links der raycast hit in reichweite von 10 auf layer 6(blocklayer) stößt { print(""); MR.enabled = true; gameObject.transform.position = hit.transform.position; gameObject.transform.rotation = Quaternion.Euler(gameObject.transform.rotation.x, 90.0f, gameObject.transform.rotation.z); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Siebenkeim Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Also ich würde dir Marrrks Idee empfehlen. Du könntest dann sogar die Textur ein bisschen manipulieren und so sogar einen besseren Effekt erzielen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noa3 Geschrieben 28. Mai 2014 Autor Melden Share Geschrieben 28. Mai 2014 Siebenkeim, kenn mich leider in der Shaderprogramierung nicht aus und habe versucht es erstmal anders zu schaffen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Harlyk Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Also ka was du da machst Noa aber es hat mal so 0 mit dem zu tun was besprochen wurde. Es geht doch um die Sichtbarkeit die durch den Alphawert geregelt wird. Der Alphawert soll dann doch durch die Entfernung geregelt werden. Wozu setzt du dann Positionen ?? Ka in wie fern dir dieses Skript bei der Sache helfen soll. Oder sehe ich es nicht ? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Ich glaube ich weiß was er will. Die Wand ist unsichtbar zeigt aber einen Punkt, der größer wird, wenn man drauf zu geht. Nicht nur größer weil man näher kommt sondern selbst gesteuert. Das könnte man mit einem Transparent/Cutout Shader machen. Dafür braucht man eine Punkttextur, die von innen nach außen immer transparenter wird. Ja und dann kann man über die Entfernung den Alpha Cutoff steuern, was den Punkt in der Größe verändern würde. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Harlyk Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 aha dachte die Wand soll immer sichtbarer werden. Bei nem Punkt kann man das genau so machen wie du beschrieben hast malzbie, denke ich. Ich verstehe nur nicht wozu die Position und Rotation zugewiesen wird ?? Also in seinem Codebeispiel Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noa3 Geschrieben 28. Mai 2014 Autor Melden Share Geschrieben 28. Mai 2014 sooo, habe das für mich jetze funktionierend gemacht. Habe nen railracing game und links und rechts jewals nen BlockingVolume mit einen eignen layer. habe auf mein vehicle ne plane erstellt und diesen die textur gegeben die dann sozusagen an der wand erscheinen soll. dadurch das die grösse geändert wird wenn man näher ran geht an die blockingvolumes sieht man die plane eh nicht mehr und es muss nichts weiter ausgeblendet werden. was ich am anfang nicht bedacht hatte script ist ziemlich prototyp mässig aber wird später ausgearbeitet: public class PlayerBlockingPlaneEffekt : MonoBehaviour { public GameObject Hover; public float ShowBlockingTexturDistanceStart = 25.0f; public MeshRenderer MR; public Vector3 HitPoint; //zu schauen wo war der letzte treffer public int MaskLayer = 8; // erster privater layer? public int test; public string test2; public RaycastHit hit; public float Distancetohit; //die distance zwischen Collider und Hover ab ;20 ist wand bei 10x10 zusehen public float StarttoScaleDistance = 20f; public float MaxScale = 10; // Use this for initialization void Start () { MR = GetComponent<MeshRenderer>(); test = LayerMask.NameToLayer("BlockLayer"); test2 = LayerMask.LayerToName(8); } // Update is called once per frame void FixedUpdate () { if (Physics.Raycast(Hover.transform.position, Vector3.left, out hit, ShowBlockingTexturDistanceStart)) //wenn links der raycast hit in reichweite von 10 auf layer 6(blocklayer) stößt { if (hit.transform.gameObject.layer == MaskLayer) { //print(); MR.enabled = true; gameObject.transform.position = hit.point; HitPoint = hit.point; gameObject.transform.rotation = Quaternion.Euler(90, 90, gameObject.transform.rotation.z); Distancetohit = Vector3.Distance(hit.point, Hover.transform.position); gameObject.transform.localScale = new Vector3(MaxScale / Distancetohit * StarttoScaleDistance, 1, MaxScale / Distancetohit * StarttoScaleDistance); } } else if (Physics.Raycast(Hover.transform.position, Vector3.right, out hit, ShowBlockingTexturDistanceStart)) //wenn rechts der raycast hit in reichweite von 10 auf layer 6(blocklayer) stößt { if (hit.transform.gameObject.layer == MaskLayer) { //print(""); MR.enabled = true; HitPoint = hit.point; gameObject.transform.position = hit.point; gameObject.transform.rotation = Quaternion.Euler(90, -90, gameObject.transform.rotation.z); Distancetohit = Vector3.Distance(hit.point, Hover.transform.position); gameObject.transform.localScale = new Vector3(MaxScale / Distancetohit * StarttoScaleDistance, 1, MaxScale / Distancetohit * StarttoScaleDistance); } } else { MR.enabled = false; } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 28. Mai 2014 Melden Share Geschrieben 28. Mai 2014 Ne, ich lag wohl falsch. Denn jetzt versteh ich's nicht mehr. (Liegt auch son bischen am Satzbau und dem Wörtern die da genutzt werden) Nix für ungut. Du hast ja dein Ziel erreicht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.