最终效果
文章目录
前言
本文使用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、运行效果
专栏推荐
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!