本文介绍了基于鼠标的瞄准 Unity3d的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作炮弹射击游戏.这是我计算瞄准方向的简短代码.

I am making cannonball shooter game. here's a short code where I am calculating the aiming direction.

            Vector3 mousePos = Input.mousePosition;
            mousePos.z = thisTransform.position.z - camTransform.position.z;
            mousePos = mainCamera.ScreenToWorldPoint (mousePos);

            Vector3 force = mousePos - thisTransform.position;
            force.z = force.magnitude;

这适用于球和角度 (0,0,0).但是当角度改变时,我无法正确拍摄.

This works when both ball and at angle (0,0,0). But when the angle changes, I am not able to shoot at right direction.

假设球和相机都在右侧看 45 度角,相同的代码不起作用.

Suppose both ball and camera are looking at 45 degrees on right side, the same code doesn't work.

当前代码假定两者都处于角度 (0,0,0).所以在上面提到的情况下,投掷方向总是错误的.

The current code assumes both are at angle (0,0,0). So in the above mentioned case, the throwing direction is always wrong.

我想把球扔向任何方向.但是假设它为0角度并相应地抛出.

I want to throw the ball in whatever direction it is. But assume it as 0 angle and throw accordingly.

推荐答案

在这种情况下使用 Camera.ScreenToWorldPoint 是错误的.

Using Camera.ScreenToWorldPoint is wrong in this situation.

您应该对飞机使用光线投射.这是一个没有不必要数学的演示:

You should be using raycasting against a plane. Here's a demonstration without unnecesary math:

Raycasting 为您提供了优势,您无需猜测用户点击的深度"(z 坐标).

Raycasting gives you the advantage, that you don't have to guess how "deep" did the user click (the z coordinate).

这是上面的一个简单实现:

Here's a simple implementation of the above:

/// <summary>
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is
/// on the axis of front/back and up/down of this transform.
/// Throws an UnityException when the mouse is not pointing towards the plane.
/// </summary>
/// <returns>The 3d mouse position</returns>
Vector3 GetMousePositionInPlaneOfLauncher () {
    Plane p = new Plane(transform.right, transform.position);
    Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
    float d;
    if(p.Raycast(r, out d)) {
        Vector3 v = r.GetPoint(d);
        return v;
    }

    throw new UnityException("Mouse position ray not intersecting launcher plane");
}

Demonstation:https://github.com/chanibal/Very-Generic-Missle-命令

这篇关于基于鼠标的瞄准 Unity3d的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-24 06:47