Unity Paint In 3D 入门
插件版本4.1.8
快速开始
这是一个强大的,可自由涂鸦的Unity插件.
步骤1
任何带有 MeshFilter + MeshRenderer 或 SkinnedMeshRenderer 的 GameObject 均可被喷涂。
方法1
为 GameObject 添加 CwPaintableMesh
组件。
方法2
点击 MeshRenderer 或 SkinnedMeshRenderer 组件的上下文菜单(右上角 ⋮ 图标),选择 "Make Paintable (Paint in 3D)" 选项。
两个方法任选一个
添加 CwPaintableMesh
组件后,可选择点击 "Analyze Mesh" 按钮检测网格是否适合喷涂。
Unity自带的Cube是不合适的.在你使用分析器后,展示大面积的红色代表不适合被涂鸦.
而几乎没有红色则代表合适.
步骤2
你需要选择使用什么纹理喷涂.
物体的 MeshRenderer
或 SkinnedMeshRenderer
组件包含一个 Materials数组(通常只有一个材质)。每个材质依赖着色器(Shader)渲染,而着色器会使用多个纹理。
多数着色器都包含Albedo/Color纹理,还有一些更高级的可能还包含 法线贴图(_BumpMap)、自发光贴图(_EmissionMap) 等
配置方法
方法1
在 CwPaintableMesh
组件Inspector中点击 "Add Paintable Texture" 按钮。
方法2
手动添加 CwPaintableMeshTexture
组件到GameObject(需与 CwPaintableMesh
组件共存)。
添加成功后,您将看到新增的 CwPaintableMeshTexture
组件。
关键参数设置
-
Slot 下拉菜单
- 点击下拉箭头,选择当前渲染器使用的纹理
- 常规物体使用默认值:0, _MainTex(对应主贴图)
- 特殊需求示例:
- 喷涂法线贴图 → 选择 0, _BumpMap
- 喷涂金属度 → 选择 0, _MetallicGlossMap
-
URP/HDRP 注意事项
- URP Lit着色器 使用 0, _BaseMap 作为Albedo纹理
_MainTex
是兼容旧版的伪插槽,实际无效
步骤3
有多种方式喷涂物体.
一个简单的方法是创建一个新的GameObject,并添加CwHitScreen和CwPaintSphere 组件(这里的官网原文写的是CwPaintDecal组件,但是经过我的测试无法正常工作)。
这些组件将自动协同工作,允许您使用鼠标(或者如果在移动设备上运行手指)进行绘制。
注意:CwHitScreen组件使用射线检测,所以你的网格必须有碰撞器,以便它知道在哪里绘制。
你可以根据自己的喜好调整CwPaintSphere 组件的设置.
最好改变一下颜色,因为默认的颜色是白色,可能会让你误以为什么也没发生.
现在运行看下效果!
更高级的用法请查看示例PaintIn3D/Examples
简单总结
首先你的物体想要能被绘制要加上
然后还要还需要一个物体包含下面的这些组件,这个物体是通过事件驱动的方式涂鸦可被涂鸦的物体.
如何使用自己的射线检测
但是我阅读该插件的源代码,发现本质是利用从摄像机发射一个射向鼠标的射线.
我有一个需求就是自己射线检测得到的RaycastHit结果替换掉插件默认的射线检测结果(插件默认使用主相机发射射线)
在这里
我尝试重写该方法,可以正常工作,
var hit = transform.parent.GetComponent<Device_HVLP>().Hit;
这句是我缓存的RaycastHit结果,你替换成你的RaycastHit传给
hit3D = new CwHit(hit);
public class MyCwHitScreen : CwHitScreen
{protected override void DoQuery(Vector2 screenPosition, ref Camera camera, ref Ray ray, ref CwHit hit3D,ref RaycastHit2D hit2D){hit2D = default(RaycastHit2D);camera = CwHelper.GetCamera(Camera);var hit = transform.parent.GetComponent<Device_HVLP>().Hit;hit3D = new CwHit(hit);}
}