The uv texture coordinate at the collision location.
A ray is fired into the scene. The textureCoord
is the location where the ray
has hit a collider. RaycastHit._textureCoord
is a texture coordinate when
a hit occurs. A Vector2 zero is returned if no mesh collider is present in
the GameObject
.
Note: A textureCoord requires the collider to be a MeshCollider.
// Attach this script to a camera and it will paint black pixels in 3D // on whatever the user clicks. Make sure the mesh you want to paint // on has a mesh collider attached.
var cam: Camera;
function Start() { cam = GetComponent.<Camera>(); }
function Update () { // Only when we press the mouse if (!Input.GetMouseButton(0)) return;
// Only if we hit something, do we continue var hit : RaycastHit; if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), hit)) return;
// Just in case, also make sure the collider also has a renderer // material and texture. Also we should ignore primitive colliders. var rend : Renderer = hit.transform.GetComponent.<Renderer>(); var meshCollider = hit.collider as MeshCollider;
if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null) return;
// Now draw a pixel where we hit the object var tex : Texture2D = rend.material.mainTexture as Texture2D; var pixelUV : Vector2 = hit.textureCoord; pixelUV.x *= tex.width; pixelUV.y *= tex.height;
tex.SetPixel(pixelUV.x, pixelUV.y, Color.black);
tex.Apply(); }
// Write black pixels onto the GameObject that is located // by the script. The script is attached to the camera. // Determine where the collider hits and modify the texture at that point. // // Note that the MeshCollider on the GameObject must have Convex turned off. This allows // concave GameObjects to be included in collision in this example. // // Also to allow the texture to be updated by mouse button clicks it must have the Read/Write // Enabled option set to true in its Advanced import settings.
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { public Camera cam;
void Start() { cam = GetComponent<Camera>(); }
void Update() { if (!Input.GetMouseButton(0)) return;
RaycastHit hit; if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit)) return;
Renderer rend = hit.transform.GetComponent<Renderer>(); MeshCollider meshCollider = hit.collider as MeshCollider;
if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null) return;
Texture2D tex = rend.material.mainTexture as Texture2D; Vector2 pixelUV = hit.textureCoord; pixelUV.x *= tex.width; pixelUV.y *= tex.height;
tex.SetPixel((int)pixelUV.x, (int)pixelUV.y, Color.black); tex.Apply(); } }
See Also: Physics.Raycast, Physics.Linecast, Physics.RaycastAll.