我目前正在开发一款游戏,您可以使用鼠标在3d对象上绘制,但是当我使用鼠标绘制时,它不会标记纹理。我正在使用Unity Personal Edition。我按照Raycast.TextureCoord文档进行了示例。我使用了以下C#代码,几乎与示例完全相同:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Paint : MonoBehaviour
{
public Camera cam;
void Start()
{
cam = GetComponent<Camera>();
}
void Update()
{
if (!Input.GetMouseButton(0))
return;
RaycastHit hit;
if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
return;
Renderer rend = hit.transform.GetComponent<Renderer>();
MeshCollider meshCollider = hit.collider as MeshCollider;
if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
return;
Texture2D tex = rend.material.mainTexture as Texture2D;
Vector2 pixelUV = hit.textureCoord;
pixelUV.x *= tex.width;
pixelUV.y *= tex.height;
tex.SetPixel((int)pixelUV.x, (int)pixelUV.y, Color.black);
tex.Apply();
}
}
我在一个名为paint的脚本中有这个代码。我创建了一个空项目,它具有一个纹理,读取和写入模式打开,凸起关闭。相机面向立方体和平面。没有任何移动功能。只有一个摄像头,附有连接主摄像头的油漆c#脚本。我按照说明操作,但是当我点击它时,它不会在立方体上绘画。为什么是这样?如何让它涂在立方体上。
道歉,如果这是显而易见的,因为我是团结的新手。
答案 0 :(得分:1)
Raycast.TextureCoord
适用于MeshCollider
而不是BoxCollider
。在Raycast.TextureCoord
上使用BoxCollider
时,对于Vector2,它将返回0,0。从多维数据集游戏对象中删除BoxCollider
,然后将MeshCollider
附加到它,它应该可以正常工作。
修改强>
为什么我不能在飞机上做呢? -
您可以在飞机上进行并且它可以在飞机上工作,但由于绘图太小,您无法看到它。从“场景”视图放大平面或使用“游戏”视图上的滑块放大对象,您将看到绘图。这是因为你绘制的区域太小了。你也在棕色纹理上画黑色,这样就更难看了。用红色来表示这个。
下面的示例添加了SIZE
变量以增加您要绘制的区域。 5的值应该很好,它使用红色而不是棕色来绘制它,以便您可以清楚地看到它。请注意,整个绘图应该使用着色器或OpenGL来完成,但为了解决您的问题,我将坚持使用Raycasts.TextureCoord
。
public Camera cam;
public int SIZE = 5;
void Start()
{
cam = GetComponent<Camera>();
}
void Update()
{
if (!Input.GetMouseButton(0))
return;
RaycastHit hit;
if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
return;
Renderer rend = hit.transform.GetComponent<Renderer>();
MeshCollider meshCollider = hit.collider as MeshCollider;
if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
return;
Texture2D tex = rend.material.mainTexture as Texture2D;
Vector2 pixelUV = hit.textureCoord;
pixelUV.x *= tex.width;
pixelUV.y *= tex.height;
//Expand where to draw on both direction
for (int i = 0; i < SIZE; i++)
{
int x = (int)pixelUV.x;
int y = (int)pixelUV.y;
//Increment the X and Y
x += i;
y += i;
//Apply
tex.SetPixel(x, y, Color.red);
//De-increment the X and Y
x = (int)pixelUV.x;
y = (int)pixelUV.y;
x -= i;
y -= i;
//Apply
tex.SetPixel(x, y, Color.red);
}
tex.Apply();
}