首先感谢您的宝贵时间。我在这方面很新,所以有点挣扎。我正在尝试制作一个拖拉式射击游戏,它实际上并不依赖于对撞机或光线投射,而仅取决于鼠标增量和相机位置。我试图做到的方式是将鼠标位置(x,y)映射到速度方向,例如新的Vector3(mouseX,0f,mouseY),然后围绕Y轴旋转以匹配屏幕上的视觉拖动
void OnMouseUp()
{
releasePos = Input.mousePosition;
Vector2 m_direction = releasePos - initialPos;
Vector3 direction = new Vector3(m_direction.x, 0, m_direction.y);
float userDrag = Mathf.Clamp(direction.magnitude, 0f, maxVelocity);
direction = Translation(direction);
direction = Vector3.Normalize(direction);
rigidbody.velocity = (direction * userDrag) * force;
}
private Vector3 Translation(Vector3 direction)
{
Vector3 camPos = Camera.main.transform.position;
camPos.y = 0;
float angle = Vector3.Angle(new Vector3(0f, 0f, 1f), camPos);
Quaternion translatedAngle = Quaternion.AngleAxis(angle, Vector3.up);
direction = translatedAngle * direction;
但是随着角度的变化,它有点不能满足我的要求。有什么方法可以避免一堆if,else角度值的声明,或更简单的方法呢?
答案 0 :(得分:2)
OnMouseUp
基本上是对撞机方法。意思是,鼠标必须位于该代码所附加的GameObject的GameObject碰撞器上。如果您想远离使用碰撞器,那么就需要远离这种方法。
通用的随处可见的说法是“鼠标按钮是向上还是向下”?是Input
类中可用的静态方法:
Input.GetMouseButtonDown()
在按下鼠标按钮后在单帧上为真Input.GetMouseButtonUp()
在释放鼠标按钮后的单帧上为真Input.GetMouseButton()
在按下鼠标按钮的任何一帧为真(否则为false)答案 1 :(得分:0)
所以我想我终于有了解决方案,我想与可能有兴趣的人分享。
面临的挑战是根据摄像机位置旋转鼠标三角洲的方向,以便在拖动和释放用于放置的球时为玩家提供自然的振动。我进行了一些测试,以查看我的代码在正确旋转delta方向时遇到了问题(因此它与屏幕匹配),并意识到当我从相机的x位置为正值“从”(0,0,1)“看”进行比较时,精细。但是当x为负数时,它不是因为 Vector3.Angle
不会返回负值就我而言,所以我只是将结果与减去。似乎可以工作。
这是最终代码:
private void Start()
{
rigidbody = GetComponent<Rigidbody>();
}
void OnMouseDown()
{
ballPos = Input.mousePosition;
}
void OnMouseUp()
{
Vector2 m_direction = Input.mousePosition - ballPos;
Vector3 direction = new Vector3(m_direction.x, 0, m_direction.y);
float userDrag = Mathf.Clamp(direction.magnitude, 0f, maxVelocity);
direction = Translation(direction);
direction = Vector3.Normalize(direction);
rigidbody.velocity = (direction * userDrag) * force;
}
private Vector3 Translation(Vector3 direction)
{
float angle = GetAngle();
Quaternion translatedAngle = Quaternion.AngleAxis(angle, Vector3.up);
direction = translatedAngle * direction;
return direction;
}
private float GetAngle()
{
Vector3 camPos = Camera.main.transform.position;
camPos.y = 0;
if (camPos.x > 0)
{
angle = Vector3.Angle(Vector3.forward, camPos);
}
else if (camPos.x <0)
{ angle = -Vector3.Angle(Vector3.forward, camPos); }
return angle;
}
如果您对代码有任何建议,请分享。