没有光线/光线投射和碰撞器的Unity鼠标输入

时间:2018-10-28 15:48:25

标签: unity3d input controls mouse

首先感谢您的宝贵时间。我在这方面很新,所以有点挣扎。我正在尝试制作一个拖拉式射击游戏,它实际上并不依赖于对撞机或光线投射,而仅取决于鼠标增量和相机位置。我试图做到的方式是将鼠标位置(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角度值的声明,或更简单的方法呢?

Example

2 个答案:

答案 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;
}

如果您对代码有任何建议,请分享。