【unity实战】使用URP Decal Projector贴花投影器实现高级的弹孔效果

发布于:2025-08-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

最终效果

在这里插入图片描述

前言

本文使用URPDecalProjector贴花投影器实现高级的弹孔效果,如果你还不了解什么是URPDecalProjector,可以参考:【unity组件介绍】URP Decal Projector贴花投影器,将特定材质(贴花)投影到场景中的其他对象上。

实现

1、弹孔素材

在这里插入图片描述

2、如果想生成法线贴图

地址:https://cpetry.github.io/NormalMap-Online/
这个网站可以在线生成法线贴图,中间那张偏蓝紫色的图片就是法线图了,右边是应用了这张法线贴图的平面,可以看到这个平面具有了凹凸的效果。
在这里插入图片描述

3、创建URP贴花投影器

在这里插入图片描述

4、向 URP 渲染器添加贴花渲染器功能

在这里插入图片描述

5、创建一个材质并将其分配给 Shader Graphs/Decal 着色器

在材质中,选择要投射图形的 Base Map 和 Normal Map。这里就选前面的弹孔贴图,也没有Normal Map
在这里插入图片描述

6、将材质绑定到URP Decal Projector上,并修改贴花参数,配置成预制体

在这里插入图片描述

7、代码实现在碰撞点生成子弹孔

using UnityEngine;

public class BulletHoleManager : MonoBehaviour
{
    [SerializeField] private GameObject bulletHolePrefab; // 子弹孔预制体
    [SerializeField] private float destroyDelay; // 子弹孔销毁延迟时间

    void Update()
    {
        // 当鼠标左键点击时
        if (Input.GetMouseButtonDown(0))
        {
            // 从摄像机发射一条射线到鼠标位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit hit;
            // 检测射线碰撞
            if (Physics.Raycast(ray, out hit))
            {
                // 在碰撞点生成子弹孔
                SpawnBulletHole(hit);
            }
        }
    }

    /// <summary>
    /// 在碰撞点生成子弹孔
    /// </summary>
    /// <param name="hit">射线碰撞信息</param>
    /// <param name="ray">射线</param>
    void SpawnBulletHole(RaycastHit hit)
    {
        // 实例化子弹孔预制体
        GameObject spawnedObject = Instantiate(bulletHolePrefab, hit.point, Quaternion.identity);

        // 设置子弹孔朝向(与碰撞平面的法线方向一致)
        Quaternion targetRotation = Quaternion.LookRotation(hit.normal);
        spawnedObject.transform.rotation = targetRotation;

        // 将子弹孔设置为击中为物体对象的子物体
        spawnedObject.transform.SetParent(hit.transform);

        // 随机旋转子弹孔(使其看起来更自然)
        spawnedObject.transform.Rotate(Vector3.forward, Random.Range(0f, 360f));
        
        // 设置子弹孔自动销毁
        Destroy(spawnedObject, destroyDelay);
    }
}

8、运行效果

在这里插入图片描述


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】
【unity游戏开发——编辑器扩展】
【unity游戏开发——热更新】
【unity游戏开发——网络】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到