代码之家  ›  专栏  ›  技术社区  ›  Lee Jaedong

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

  •  0
  • Lee Jaedong  · 技术社区  · 6 年前

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

    board .

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

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

    到目前为止,我所尝试的:

    • 使用一个滑块,当值改变时,电路板会随着旋转
    • 使用IDragHandler接口并将电路板位置更改为 记录触摸时接收的事件数据。
    • 尝试使用按钮来垂直修改电路板位置 一段距离——它瞬间发生,球掉了过去 董事会。
    • 创建UI图像/操纵杆并使用触摸/事件数据(来自 IDragHandler)在用户界面操纵杆打开时移动电路板变换

    我尝试了更多的变体,不幸的是,我现在无法回忆起它们,而且我已经尝试过的都不起作用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lee Jaedong    6 年前

    我想出来了。我将一个图像(UI)游戏对象添加到一个空的游戏对象中,这样它可以从X轴上的0和Y轴上的0移动。添加了3个变换- 1向左倾斜,1倾斜到右边,1在屏幕顶部中间,作为游戏中的向导,然后禁用它们,这样它们就不会出现在实际游戏中。将一个脚本附加到我的图像UI游戏对象,并在inspector中指定了必要的转换,瞧,它起作用了。

    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;
        }
    
    }
    

    仍然有很多需要平滑和改进的地方,但是作为基础代码,它工作得很好。