如何通过统一触发器启动脚本

时间:2016-09-11 06:02:50

标签: c# unity3d

我正在尝试通过触发器激活脚本。我有一个脚本,使对象浮动和旋转,但我想让该脚本在玩家接近对象时启动。此时对象在游戏开始时浮动,而不是在玩家激活触发器时浮动。

这是浮动脚本:

public class AutoMoveAndRotate : MonoBehaviour
{
    public Vector3andSpace moveUnitsPerSecond;
    public Vector3andSpace rotateDegreesPerSecond;
    public bool ignoreTimescale;
    private float m_LastRealTime;


    private void Start()
    {
        m_LastRealTime = Time.realtimeSinceStartup;
    }


    // Update is called once per frame
    private void Update()
    {
        float deltaTime = Time.deltaTime;
        if (ignoreTimescale)
        {
            deltaTime = (Time.realtimeSinceStartup - m_LastRealTime);
            m_LastRealTime = Time.realtimeSinceStartup;
        }
        transform.Translate(moveUnitsPerSecond.value*deltaTime, moveUnitsPerSecond.space);
        transform.Rotate(rotateDegreesPerSecond.value*deltaTime, moveUnitsPerSecond.space);
    }


    [Serializable]
    public class Vector3andSpace
    {
        public Vector3 value;
        public Space space = Space.Self;
    }
}
}

这是触发器脚本(附加到放置在浮动对象之前的对象):

public class ActivateTrigger : MonoBehaviour
{
    // A multi-purpose script which causes an action to occur when
    // a trigger collider is entered.
    public enum Mode
    {
        Trigger = 0,    // Just broadcast the action on to the target
        Replace = 1,    // replace target with source
        Activate = 2,   // Activate the target GameObject
        Enable = 3,     // Enable a component
        Animate = 4,    // Start animation on target
        Deactivate = 5  // Decativate target GameObject
    }

    public Mode action = Mode.Activate;         // The action to accomplish
    public Object target;                       // The game object to affect. If none, the trigger work on this game object
    public GameObject source;
    public int triggerCount = 1;
    public bool repeatTrigger = false;


    private void DoActivateTrigger()
    {
        triggerCount--;

        if (triggerCount == 0 || repeatTrigger)
        {
            Object currentTarget = target ?? gameObject;
            Behaviour targetBehaviour = currentTarget as Behaviour;
            GameObject targetGameObject = currentTarget as GameObject;
            if (targetBehaviour != null)
            {
                targetGameObject = targetBehaviour.gameObject;
            }

            switch (action)
            {
                case Mode.Trigger:
                    if (targetGameObject != null)
                    {
                        targetGameObject.BroadcastMessage("DoActivateTrigger");
                    }
                    break;
                case Mode.Replace:
                    if (source != null)
                    {
                        if (targetGameObject != null)
                        {
                            Instantiate(source, targetGameObject.transform.position,
                                        targetGameObject.transform.rotation);
                            DestroyObject(targetGameObject);
                        }
                    }
                    break;
                case Mode.Activate:
                    if (targetGameObject != null)
                    {
                        targetGameObject.SetActive(true);
                    }
                    break;
                case Mode.Enable:
                    if (targetBehaviour != null)
                    {
                        targetBehaviour.enabled = true;
                    }
                    break;
                case Mode.Animate:
                    if (targetGameObject != null)
                    {
                        targetGameObject.GetComponent<Animation>().Play();
                    }
                    break;
                case Mode.Deactivate:
                    if (targetGameObject != null)
                    {
                        targetGameObject.SetActive(false);
                    }
                    break;
            }
        }
    }


    private void OnTriggerEnter(Collider other)
    {
        DoActivateTrigger();
    }
}
}

如果我将浮动脚本添加到对象,它将开始浮动,无论玩家是否通过触发器。所以不确定如何使这项工作?

请帮帮忙?

非常感谢

1 个答案:

答案 0 :(得分:0)

在开始游戏之前,应该停用浮动对象上的AutoMoveAndRotate组件。否则它将在游戏开始后执行。