首页 > 解决方案 > 有没有办法用刚体移动游戏对象

问题描述

参考图片更容易理解案例。

木板.

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

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

板和球附有刚体。

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

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

标签: c#unity3d

解决方案


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

}

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


推荐阅读