- Home /
Adding decals to a object
how do i add decals to a object? say i want to render bullet marks on a cube or wall.
is it possible to instentiate a projector on the position you hit an object and just project a texture of a bullet impact? I don't know anything about projectors but thought it is maybe possible?
Why do i get this error when it collids?:
NullReferenceException: Object reference not set to an instance of an object
bullitHole.OnTriggerEnter (UnityEngine.Collider hit) (at Assets/bullitHole.js:3)
I used this code:
var bulletHole:GameObject;
function OnTriggerEnter( hit : Collider){
var hitRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Instantiate(bulletHole, hit.point, hitRotation);
}
Why do i get this error when it collids?:
NullReferenceException: Object reference not set to an instance of an object
bullitHole.OnTriggerEnter (UnityEngine.Collider hit) (at Assets/bullitHole.js:3)
I used this code:
var bulletHole:GameObject;
function OnTriggerEnter( hit : Collider){
var hitRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Instantiate(bulletHole, hit.point, hitRotation);
}
Answer by duck · Dec 01, 2009 at 02:27 PM
The simplest way to achieve this would be to Instantiate a bullet-hole object at the point at which your bullet raycast hits the wall, and use the wall's normal for the object's rotation.
Something like this:
var hitRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Instantiate(bulletHole, hit.point, hitRotation);
However if you allow the creation of an unlimited number of bullet holes, this method might quickly start affecting performance. There are a number of ways of creating a more optimised 'decal' system, such as re-using a pool of decal objects.
Hello Duck, thanks you for the solution. This works great for flat surfaces but what if the surface is spherical and the decal is not a small bullet hole but say an big dark patch
In that case, you'll need something much more complex. There's an article on the "wolfire" blog about projecting decals on to aribtrary geometry, which basically works by duplicating and cutting out the triangles from the mesh onto which the decal falls. You'd then want to render this cut-out piece of mesh using a decal shader which draws at a higher level in the draw queue, so there's no z-fighting with the underlying mesh. http://blog.wolfire.com/2009/06/how-to-project-decals/
Duck I tried your code but it makes all the bullet hole objects 90 degrees the wrong direction.
Answer by Ashkan_gc · Dec 01, 2009 at 02:29 PM
currently decal rendering is not supported in unity. vote for this in feedback http://feedback.unity3d.com/pages/15792-unity however you can easily draw a texute on another with getpixels and setpixels functions of Texture2D class. you can draw bullet texture easily on the wall. you should not use the sharedmaterial and should use the material property to get textures. if you use sharedmaterial the real asset file and all other gameobjects using the texture/material will change. you should get the UV cords of a raycast from Raycasthit object in raycasts. in collisions and functions like OnTriggerEnter or ... you can cast a ray from the bullet's position and in it's movement direction and see where it will collide to the other collider. you should disable the raycast for the bullet itself
this link no longer exists.. Was it axed or did it make it's way into 4.0 and I haven't done due diligence in finding it? I'd rather not do middleware system stuff if it's going in later, this seems like it's one that should eventually make it, just too many people would use it.
It is just a broken link which brought you to this page: http://feedback.unity3d.com/suggestions/graphics-decal-system?page=1
You may think about using that one: https://www.assetstore.unity3d.com/#/content/3779
Answer by SneezingCatP · Apr 01, 2012 at 02:21 AM
I wrote my decal script into the FPS tutorial mating gun script here it is
add this to the variables
var BulletTexture : GameObject;
add this to the hit particles section
clone = Instantiate(BulletTexture, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); Destroy(clone.gameObject, 5); clone.transform.parent = hit.transform;
it will parent the decal object with whatever it hits then deletes it after 5 seconds
Dj
Answer by Khyrid_old · Nov 21, 2010 at 01:09 PM
I've tried a lot to get this to work but I can't figure it out. Where do I put the code? In the gun or the bullet object? I tried with putting it in the bullet and what I got was a string of bullethole objects on the ground between me and the direction I was shooting. I have no idea what I'm doing.
Your answer
Follow this Question
Related Questions
Delete a Decal Projector at Runtime 0 Answers
HDRP Decal Projector doesn't show in game view 0 Answers
LWRP - Placing markers on terrain and gameobject dynamically 0 Answers
Eliminate start up dialog? 1 Answer
Alt+Tab issue in fullscreen? 1 Answer