【问题标题】:Rotate 3D Object with finger touch Unity 3D用手指触摸旋转 3D 对象 Unity 3D
【发布时间】:2018-12-22 11:49:15
【问题描述】:

我想在屏幕上左右滑动时旋转一个球,所以我做了下面的脚本,但是只有当我直接在球上滑动而不是屏幕上的任何位置时,球才会旋转,你知道吗?

球脚本:

 private float baseAngle = 0.0f;
public Camera cam;

void OnMouseDown()
{
    Vector3 pos = cam.WorldToScreenPoint(transform.position);
    pos = Input.mousePosition - pos;
    baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
    baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
}

void OnMouseDrag()
{
    Vector3 pos = cam.WorldToScreenPoint(transform.position);
    pos = Input.mousePosition - pos;
    float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
    transform.rotation = Quaternion.AngleAxis(-ang, Vector3.up);
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您的问题是您提供的脚本附加到球本身,因此触摸(点击)仅由球处理。换句话说,方法OnMouseDownOnMouseDrag 仅在触摸(点击)击中球时被调用。请参阅Documentation。它说:

    当用户在 GUIElement 或 Collider 上按下鼠标按钮时调用 OnMouseDown。

    至少有一些方法可以得到你想要的:

    • 如果您想触摸屏幕上的任何位置,请创建一个单独的游戏对象(空且仅包含对撞机和您的脚本)并使其对撞机边界适合屏幕。然后将公共变换字段添加到您的脚本并分配球的变换,以便可以从其他脚本旋转球
    • 使用来自Input 类的方法,而不是OnMouseDownOnMouseDrag。例如Input.GetMouseButton - 每次用户点击鼠标按钮(或触摸)时都会调用它,无论点击什么。

    【讨论】:

    • 如果您有自定义相机脚本,当然可以,为什么不呢。如果您在谈论第一种方式,则对游戏对象的唯一要求是有一个碰撞器,适合所有屏幕
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多