Jump to content
Unity Insider Forum

Invisibile(visible)wall erstellen


Noa3

Recommended Posts

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

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

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

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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...