c# - 缩放游戏颜色选择器
问题描述
嘿,
我正在开发一个 3D 房间编辑器,您可以在其中从菜单中抓取一个对象并将其放回房间。您还可以选择为这些对象赋予不同的颜色,这是由颜色选择器完成的。我现在有一个脚本,它只有在我放大颜色选择器时才能按我想要的方式工作,然后他不再拾取颜色并且不再移动选择器圆圈。
我该如何解决这个问题?
颜色选择器脚本:
Color[] Data;
SpriteRenderer SpriteRenderer;
GameObject ColorPicker;
GameObject Selector;
BoxCollider Collider;
public GameObject target;
Ray rayray;
private Plane MyPlane;
public int Width { get { return SpriteRenderer.sprite.texture.width; } }
public int Height { get { return SpriteRenderer.sprite.texture.height; } }
public Color Color;
void Awake()
{
ColorPicker = transform.Find("ColorPicker").gameObject;
SpriteRenderer = ColorPicker.GetComponent<SpriteRenderer>();
Selector = transform.Find("Selector").gameObject;
Collider = ColorPicker.GetComponent<BoxCollider>();
Data = SpriteRenderer.sprite.texture.GetPixels();
Color = Color.white;
Debug.Log(Collider);
MyPlane = new Plane(transform.TransformDirection(Vector3.forward), transform.position);
}
void Update()
{
if (Input.GetMouseButton(0))
{
rayray = Camera.main.ScreenPointToRay(Input.mousePosition);
MyPlane = new Plane(transform.TransformDirection(Vector3.forward), transform.position);
Vector3 screenPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
screenPos = new Vector3(screenPos.x, screenPos.y);
//check if we clicked this picker control
RaycastHit[] ray = Physics.RaycastAll(rayray.origin, rayray.direction);
foreach (RaycastHit h in ray)
{
Debug.Log(h.collider.name);
if (h.collider.name == "ColorPicker")
{
Selector.transform.position = screenPos;
//get color data
screenPos -= ColorPicker.transform.position;
int x = (int)(screenPos.x * Width);
int y = (int)(screenPos.y * Height) + Height;
if (x > 0 && x < Width && y > 0 && y < Height)
{
Color = Data[y * Width + x];
target.GetComponent<Renderer>().material.color = Color;
Debug.Log(Width);
Debug.Log(Height);
}
}
}
}
}
编辑:
动图
图片:
解决方案
如果没有在 Unity 编辑器中看到您的场景,很难确定,但我有几件事可以检查,可能会解决您的问题。
检查以确保在缩放 GameObject 时正确缩放 BoxCollider。缩放后选择游戏对象时,您应该能够看到 Gizmo。确保它在缩放之前/之后覆盖了 UI 的相同区域。BoxCollider 用于检测整个对象上的鼠标点击,除非光线击中该碰撞器,否则其他功能都不会起作用。
脚本似乎没有考虑颜色选择器的比例变化。看看你在哪里得到你的 X/Y 坐标来选择颜色(在 //get color data 注释下)。您会注意到它将屏幕位置乘以从纹理大小获取的高度和宽度。这将需要相应地缩放以对纹理的正确区域进行采样。
如果你仍然不能让它工作,我建议发布你的场景层次结构和相关游戏对象的屏幕截图,这样我们就可以看到它是如何设置的。
推荐阅读
- qt - MacOS 上的 QThread::msleep 睡眠错误时间
- python - 函数无法正确写入输出数据文件 - Python
- javascript - v-for 和 v-if 列出所有的数组 onclick,应该列出唯一点击的数组的信息
- reactjs - Dygraphs 2.x 图例位于图表右侧
- android - 无法使用 setImageUri 在 listView 上显示图像
- c++ - BGL 获取图表的权重图
- javascript - 跳到视频的最后一帧并暂停
- java - 多种组合的设计模式
- birt - 如何在 BIRT 中按宽度拉伸图表
- javascript - TypeError:无法将类作为函数调用(React/Redux)