一、画笔
画笔实现的功能就是从笔尖发射射线,碰到带有标签的画布之后,调用画布开始画画。

using UnityEngine;
public class HuaBi : MonoBehaviour
{
public Transform launchPoint; // 发射点
public float maxDistance = 10f;
private RaycastHit hit;
public LineRenderer line;// 可视化 line 测试用
public HuaBu huaBu;
void Start()
{line.useWorldSpace = true; //line 改成世界坐标}
// Update is called once per frame
void Update()
{bool res = Physics.Raycast(launchPoint.position, launchPoint.forward, out hit, maxDistance);// 发射射线
line.SetPosition(0, launchPoint.position);//line 起始位置(0)line.SetPosition(1, launchPoint.forward * 50);//line 终止位置(1)if (res)
{if (hit.collider.tag == "HuaBu")
{huaBu.SetPixel(hit.point, Color.blue);
}
}
}
}
需要一个发射点(launchPoint),以及射线发射的距离(maxDistance),LineRenderer 作为测试用,可以忽略。
切换颜色的效果可以在开头定义颜色,替换第二个参数 huaBu.SetPixel(hit.point, Color.blue);
二、画布
画布实现的是将画笔碰到画布的射线的世界坐标转为自身局部坐标,这样就可以得到一个点,在通过对这个点进行放大,就可以实现画画

需要注意的是,画布的 RawImage 的类型需要为 ARGB32。这里用代码实例化一个 Texture2D,并且将他的类型改成了 ARGB32。然后再替换 RawImage 自身的 texture。这样在运行结束的时候,画不会被保存。
RawImage 本身需要有碰撞体,否则射线检测不到,碰撞体大小和画布一样大。
清除画布的实现就是遍历画布的长宽,将每个像素点都变成原始颜色。
public class HuaBu : MonoBehaviour
{
public RawImage huaBu; // 用原始图像
public int brush_Size = 15; // 笔刷大小
private int width, height; // 画布的长宽
private Texture2D huaBu_texture; // 新建 Texture2D
void Start()
{Texture2D tex = (Texture2D)huaBu.mainTexture;
huaBu_texture = new Texture2D(tex.width,tex.height,TextureFormat.ARGB32,false);
width = huaBu_texture.width;
height = huaBu_texture.height;
huaBu_texture.Apply(); // 更新应用
huaBu.texture = huaBu_texture;
}
public void SetPixel(Vector3 hitPosition, Color color) // 画笔触碰时调用
{Vector3 InversePoint = huaBu.transform.InverseTransformPoint(hitPosition);
for (int i = (int)InversePoint.x - brush_Size; i < InversePoint.x + brush_Size; i++)
{for (int j = (int)InversePoint.y - brush_Size; j < InversePoint.y + brush_Size; j++)// 两次 for 进行笔刷放大
{huaBu_texture.SetPixel(i + huaBu_texture.width / 2, j + huaBu_texture.height / 2, color);
}
}
huaBu_texture.Apply();}
public void ClearImagePixel()// 清除画布
{for(int i=0;i< width;i++)
{for(int j=0;j<height;j++)
{huaBu_texture.SetPixel(i, j, Color.white);
}
}
huaBu_texture.Apply();}
}
最后需要注意的是,画布的长宽根据白色图片分辨率而定,不能图方便设置成 1,1,。否则就是一个像素,要用缩放设置成合适大小。

RawImage 作为子物体,填满画布就行。


正文完
发表至: 技术类
2024-11-14
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。