【问题标题】:Is there a way to move a gameobject with a rigidbody有没有办法用刚体移动游戏对象
【发布时间】:2018-12-25 23:45:03
【问题描述】:

参考图片便于理解案例。

.

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

整个要点是,板子将位于其顶部的球向上移动,当板子向一侧倾斜/旋转时,球开始滑动并掉落到一侧。

板子和球附有刚体。

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

  • 使用滑块,当值改变时,板会随着旋转 四元数.欧拉。
  • 使用 IDragHandler 接口并将板位置更改为 注册触摸时收到的 EventData。
  • 尝试使用垂直修改板位置的按钮 一段距离 - 它瞬间发生并且球掉下来 董事会。
  • 创建了一个 UI 图像/操纵杆并使用了触摸/事件数据(来自 IDragHandler) 在 UI 操纵杆处于移动状态时移动棋盘变换 搬家了。

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

【问题讨论】:

  • 我的意思是,您可以在平台的中心添加一个铰链,然后使用旋转力使其围绕它旋转?除非我误解了这个问题
  • 想象一下将一根手指放在板子下。现在,如果您向上移动手指,板子会慢慢上升。如果您将手指向右滑动,板将从右侧开始向上,向左倾斜。同样适用于左侧。

标签: c# unity3d


【解决方案1】:

我想通了。我向一个空的游戏对象添加了一个图像(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;
    }

}

还有很多需要平滑和改进的地方,但是作为基本代码它可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多