繁体   English   中英

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

[英]Is there a way to move a gameobject with a rigidbody

请参考图片以更轻松地了解案例。

板

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

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

板和球均附有刚性体。

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

  • 使用滑块,当更改值时,面板将随着Quaternion.Euler旋转。
  • 使用IDragHandler界面并将板位置更改为注册触摸时收到的EventData。
  • 尝试使用可在垂直方向改变板位置一定距离的按钮进行尝试-它会立即发生,并且球会从板上掉落。
  • 创建UI图像/游戏杆,并使用触摸/事件数据(来自IDragHandler)从UI游戏杆移动时移动板变换。

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

我想到了。 我将图像(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;
    }

}

还有许多事情需要改进和完善,但是作为基本代码,它可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM