在Unity中构建可旋转的升降机

时间:2017-09-02 06:42:07

标签: c# unity3d

我有一个"立方体"在Unity中。这个立方体有一个触发器,当它进入它时,物体被抓到空中。这是一个电梯,你可以看到我在这里的意思。这是一个从Spyro 2拍摄的小场景。

https://youtu.be/f8wWMa4N5mE?t=643

我现在使用的代码非常小

private float liftSpeed = 10; // the speed, the object is flying up

private void OnTriggerStay(Collider col)
{
    Rigidbody objectRigid = col.gameObject.GetComponent<Rigidbody>(); // get the rigidbody from the object in the trigger

    if (objectRigid != null) // does it have a rigidbody?
        objectRigid.velocity = new Vector3(objectRigid.velocity.x, liftSpeed, objectRigid.velocity.z); // make it fly in the air
}

所以我有一个电梯,完全正常。但是当我旋转电梯时,我希望它能够工作。

一些例子(我的gamne是3D)

lift rotated by 45 degrees

lift rotated by 90 degrees

那么我怎样才能让我的电梯适用于所有&#34;旋转&#34;?

4 个答案:

答案 0 :(得分:2)

您可以使用transform.up来获取升力的上升方向,然后乘以升力速度。

objectRigid.velocity = transform.up * liftSpeed;

transform.up会根据物体的旋转方式而变化,因此如果您的升力机向左旋转,则升降机会将物体移到左侧。

答案 1 :(得分:1)

您可以像在视频片段中一样使用变换RotateAround方法进行旋转。

Transform t = col.gameObject.GetComponent<Transform>();
transform.RotateAround(Vector3.zero, Vector3.up, 20 * Time.deltaTime);

给定的snipet让对象围绕它指向上方的轴旋转。

答案 2 :(得分:0)

  1. 让玩家成为电梯OnTriggerEnter的孩子。
  2. 按原样移动升降机
  3. 您可以使用RotateAround功能旋转升降机。玩家也应该随着电梯一起旋转,因为它现在是电梯的孩子。
  4. 当玩家的父级使用OnTriggerExit
  5. 超出提升触发器时,将其设为null

答案 3 :(得分:0)

这是我解决问题的方法。

电梯和EndPoint将为空游戏对象。如果您希望电梯有平台或底座,您可以添加一个GameObject作为升降机的孩子,并使用您喜欢的形状。

您需要将一个碰撞器连接到升降机并将其设置为触发器。

然后将以下脚本添加到lift Empty GameObject

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveLift : MonoBehaviour {

    public Transform end;

    float speed = 4f;

    bool liftActivated = false;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if(liftActivated)
         {
            float step = speed * Time.deltaTime;
            //To move up the lift
            transform.position = Vector3.MoveTowards(transform.position, end.position, step);
            //To spin the lift
            transform.RotateAround(Vector3.up, 2 * Time.deltaTime);

            //To stop spining the lift when it reaches the end of the path
            if(transform.position.Equals(end.position))
                liftActivated = false;
         }
    }

    void OnTriggerEnter(Collider other){
        liftActivated = true;
        other.gameObject.transform.parent = this.transform;
        other.gameObject.GetComponent<Rigidbody>().isKinematic=true;
    }
}

然后你应该决定一旦电梯到达目的地,是否必须离开平台的玩家,或者如果你不透明它并让它在行程结束时掉下来