Unity游戏中碰撞器及其旋转的问题

时间:2018-11-28 20:08:13

标签: unity3d animation scripting

问题是我要如何创建可打开的门。当玩家进入与该门相连的Box Collider时,该门应打开。但是问题是当门开始打开并旋转时,对撞机也开始旋转,这给我带来了很多问题。我尝试使用其Collider创建EmptyObject,但无法将此Collider与脚本和OnTriggerEnter函数本身连接。也许我听不懂什么,谁知道,我只是个初学者。如何知道如何提供帮助,请写下答案。 我的代码(如果有人需要):

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

    public class openDoor : MonoBehaviour {

        public Vector3 Rotation_;
        private int i;
        public float speed;

        bool opentheDoor;
        bool closetheDoor;

        // Use this for initialization
        void Start () {
            opentheDoor = false;
            closetheDoor = false;

        }

        // Update is called once per frame
        void Update () {
            if (opentheDoor == true) {
                this.transform.Rotate (Rotation_ * Time.deltaTime * speed);
                i += 1;
                    if (i == 70) {
                        opentheDoor = false;
                        i = 0;
                    }
            }

            if (closetheDoor == true) {
                this.transform.Rotate (-Rotation_ * Time.deltaTime * speed);
                i += 1;
                if (i == 70) {
                    closetheDoor = false;
                    i = 0;
                }
            }

        }

        void OnTriggerEnter (Collider other) {  
            if (other.gameObject.tag == "Player") { {
               opentheDoor = true;
            }
            }
        }

        void OnTriggerExit (Collider other) {
            if (other.gameObject.tag == "Player") {
                closetheDoor = true;
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

在OnTriggerEnter中添加另一项检查,以检查门是否正在打开。

void OnTriggerEnter (Collider other) {  
    if (other.gameObject.tag == "Player" && !opentheDoor) {
           opentheDoor = true;
    }
}

答案 1 :(得分:1)

这就是我处理场景的方式

DoorHandler.cs

    public class DoorHandler : MonoBehaviour {

    public Door door;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            door.OpenDoor();
        }
    }
}

这应该附加到门的父级。

下次服用

Door.cs

public class Door : MonoBehaviour {

    public bool isOpened = false;

    public void OpenDoor()
    {
        if (!isOpened)
        {
            isOpened = true;
            Debug.Log("OPEN");
            //OPEN DOOR CODE!
        }
    }
}

将此附加到Door GameObject

注意

层次结构类似于 DoorHandler-> Door-> DoorModel (其中Door只是Door的空游戏对象枢轴)
enter image description here

DoorHandler的GameObject中,附加BoxCollider和选中标记IsTrigger

enter image description here

另外一个玩家应该有刚体(最好是Kinametic),显然是对撞机

因此,当Player进入DoorHandler的对撞机-> DoorHandler的OnTriggerEnter将被触发,并最终将Door调用到OpenDoor()

答案 2 :(得分:0)

将门固定到空的物体上。将触发器放在空对象上。然后使触发器入口旋转门,而不旋转受害物体,对撞机将保留在原处。

父母 -儿童(门) -child(对撞机)