我已将相机更改为透视图以使其具有“3D”外观,但这样做时,我的鼠标点击就会到处都是。
有人可以帮忙吗?
if (Input.GetMouseButtonDown(0)) {
Vector2 point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;
hit = Physics2D.Raycast(point, Vector2.zero);
if (!hit.transform) return;
pressedChip = hit.transform.GetComponent<Chip>();
pressPoint = Input.mousePosition;
}
if (Input.GetMouseButton(0) && pressedChip != null) {
Vector2 move = Input.mousePosition;
move -= pressPoint;
if (move.magnitude > Screen.height * 0.05f) {
foreach (Side side in Utils.straightSides)
if (Vector2.Angle(move, Utils.SideOffsetX(side) * Vector2.right + Utils.SideOffsetY(side) * Vector2.up) <= 45)
pressedChip.Swap(side);
pressedChip = null;
}
}
public Chip GetChipFromTouch() {
Vector2 point;
if (isMobilePlatform) {
if (Input.touchCount == 0) return null;
point = controlCamera.ScreenPointToRay(Input.GetTouch(0).position).origin;
} else
point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;
hit = Physics2D.Raycast(point, Vector2.zero);
if (!hit.transform) return null;
return hit.transform.GetComponent<Chip>();
}
编辑: 我已经更新了脚本以添加Vector3引用。另外,我现在已经添加了一个盒式对撞机来代替2D对撞机。
if (Input.GetMouseButtonDown(0)) {
Vector3 position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float range = 0f;
RaycastHit hit;
Ray ray = controlCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction)){
Debug.Log ("New Script");
if(Physics.Raycast(ray, out hit, range))
{
pressedChip = hit.transform.GetComponent<Chip>();
Debug.Log (pressedChip);
}
Debug.Log (pressedChip);
// hit.transform.GetComponent<Chip>();
pressPoint = Input.mousePosition;
}
// Vector2 point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;
// hit = Physics2D.Raycast(point, Vector2.zero);
// if (!hit.transform) return;
// pressedChip = hit.transform.GetComponent<Chip>();
// pressPoint = Input.mousePosition;
}
if (Input.GetMouseButton(0) && pressedChip != null) {
Vector3 move = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Vector2 move = Input.mousePosition;
// move -= pressPoint;
if (move.magnitude > Screen.height * 0.05f) {
foreach (Side side in Utils.straightSides)
if (Vector2.Angle(move, Utils.SideOffsetX(side) * Vector2.right + Utils.SideOffsetY(side) * Vector2.up) <= 45)
pressedChip.Swap(side);
pressedChip = null;
}
}
答案 0 :(得分:0)
您似乎误解了raycast,raycast2D和鼠标输入的概念。
您的鼠标输入被视为屏幕位置,即2D,其值仅限于屏幕(或窗口)的分辨率。例如,如果您的屏幕是600x480,则x的位置将介于0和599之间,y的位置介于0和479之间。
如果要在场景中使用鼠标输入,则需要将其转换为场景中的3D位置。您可以使用:
Vector3 position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
这将给出几乎相机位置的值。在您的情况下,您希望使用一条光线,该光线是鼠标位置及其转换为世界位置的结果:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
此时,您会在相机旋转方向上从相机位置开始射线。那是因为你有一个正交相机(使用透视,光线会认为FOV朝着正确的方向前进)。
您的误解是您使用
Physics2D.Raycast();
这是为了执行2D光线投射。你的光线是3D的,所以不会这样做。
if (Input.GetMouseButtonDown(0)) {
Ray ray = controlCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction)){
}
}
现在的问题是2D和3D引擎在Unity中完全分开。而根本没有沟通。因此,对于你的光线投射来点什么,它必须是3D对撞机。例如,如果你使用精灵,你不能指望BoxCollider2D在光线投射上返回命中。
解决方案是将一个空的游戏对象作为一个孩子附加并附加一个BoxCollider并给它适当的大小。