有没有办法用刚体移动游戏对象

时间:2018-12-25 12:15:29

标签: c# unity3d

请参考图片,以便更轻松地了解案件。

board

我正在制作3D游戏,希望能够用一个手指向上移动该板并在Z轴上旋转它。如果手指向上滑动-面板将上升。如果手指向左或向右滑动,则面板将向左或向右倾斜。

关键是使棋盘使位于其顶部的球向上运动,并且当棋盘向一侧倾斜/旋转时,球开始滑动并向一侧掉落。

木板和球都附有刚体。

到目前为止,我已经尝试过:

  • 使用滑块,当值更改时,板将旋转 四元数。欧拉。
  • 使用IDragHandler接口并将板位置更改为 注册触摸时收到的EventData。
  • 尝试使用可通过以下方式垂直修改板位置的按钮 一定距离-瞬间发生,球掉进去 董事会。
  • 创建UI图像/游戏杆并使用触摸/事件数据(来自 IDragHandler),以便在每次按下UI操纵杆时移动板子变换 感动。

我已经尝试了更多的变体,但是不幸的是,我现在不记得它们了,而我已经尝试过的那些都没有用。

1 个答案:

答案 0 :(得分:0)

我知道了。我将图像(UI)游戏对象添加到一个空的游戏对象,以便它可以从X上的0和Y轴上的0移动。添加了3个变换-向左倾斜1个,向右倾斜1个和在屏幕顶部中间的1个,以在游戏中用作指导,然后禁用它们,以使它们不会出现在实际游戏中。将脚本附加到我的Image UI游戏对象上,并在检查器和瞧中分配了必要的转换,即可使用。

using UnityEngine;
using UnityEngine.EventSystems;

public class MoveStick : MonoBehaviour, IDragHandler, IEndDragHandler {

    public Transform leftTarget;
    public Transform rightTarget;
    public float rotateSpeed;

    [Space]

    Vector2 joyStartPosition;
    public Transform stick;
    public Transform topTarget;
    public float speed;

    bool goingUp;

    void Start()
    {
        joyStartPosition = transform.position;
        goingUp = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        transform.position = eventData.position;
        if (transform.localPosition.y > 80f || transform.localPosition.x > 50 || transform.localPosition.x < -50)
        {
            goingUp = true;

            var step = speed * Time.deltaTime;
            stick.position = Vector3.MoveTowards(stick.position, topTarget.position, step);

            Debug.Log("Going  up: " + goingUp);
        }
        else if (transform.localPosition.y < 80f)
        {
            goingUp = false;
            Debug.Log("Going  up: " + goingUp);
        }
        if (transform.localPosition.x > 80 && transform.localPosition.y > 80)
        {
            stick.rotation = Quaternion.RotateTowards(stick.rotation, rightTarget.rotation, rotateSpeed * Time.deltaTime);
        }
        else if (transform.localPosition.x < -80 && transform.localPosition.y > 80)
        {
            stick.rotation = Quaternion.RotateTowards(stick.rotation, leftTarget.rotation, rotateSpeed * Time.deltaTime);
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = joyStartPosition;
        eventData.position = joyStartPosition;
        Debug.Log("Joystick is not moving");
        goingUp = false;
    }

}

仍有许多需要改进和改进的地方,但是作为基本代码,它可以很好地工作。