Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在unity中通过触发器启动脚本_C#_Unity3d - Fatal编程技术网

C# 如何在unity中通过触发器启动脚本

C# 如何在unity中通过触发器启动脚本,c#,unity3d,C#,Unity3d,我正试图通过触发器激活脚本。我有一个脚本,可以使一个对象浮动和旋转,但我希望在玩家靠近对象时启动该脚本。当游戏开始时,而不是当玩家激活触发器时,物体会浮动 以下是浮动脚本: public class AutoMoveAndRotate : MonoBehaviour { public Vector3andSpace moveUnitsPerSecond; public Vector3andSpace rotateDegreesPerSecond; public bool

我正试图通过触发器激活脚本。我有一个脚本,可以使一个对象浮动和旋转,但我希望在玩家靠近对象时启动该脚本。当游戏开始时,而不是当玩家激活触发器时,物体会浮动

以下是浮动脚本:

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;
    }
}
}
下面是触发器脚本(附加到放置在浮动对象之前的对象):

公共类ActivateTrigger:monobhavior
{
//一种多用途脚本,可在以下情况下导致操作发生:
//一个触发碰撞器被输入。
公共枚举模式
{
Trigger=0,//只需将操作广播到目标
Replace=1,//将目标替换为源
Activate=2,//激活目标游戏对象
Enable=3,//启用组件
Animate=4,//在目标上启动动画
Deactivate=5//Deactivate目标游戏对象
}
public Mode action=Mode.Activate;//要完成的操作
public Object target;//要影响的游戏对象。如果没有,触发器将在此游戏对象上工作
公共游戏对象源;
公共整数触发器计数=1;
公共bool repeatTrigger=false;
私有void DoActivateTrigger()
{
触发计数--;
如果(triggerCount==0 | | repeatTrigger)
{
对象currentTarget=目标??游戏对象;
行为目标行为=当前目标行为;
GameObject targetGameObject=当前目标为GameObject;
if(targetBehavior!=null)
{
targetGameObject=targetBehavior.gameObject;
}
开关(动作)
{
案例模式。触发器:
if(targetGameObject!=null)
{
targetGameObject.BroadcastMessage(“DoActivateTrigger”);
}
打破
案例模式。替换:
如果(源!=null)
{
if(targetGameObject!=null)
{
实例化(源,targetGameObject.transform.position,
targetGameObject.transform.rotation);
销毁对象(targetGameObject);
}
}
打破
案例模式。激活:
if(targetGameObject!=null)
{
targetGameObject.SetActive(true);
}
打破
案例模式。启用:
if(targetBehavior!=null)
{
targetBehavior.enabled=true;
}
打破
案例模式。动画:
if(targetGameObject!=null)
{
targetGameObject.GetComponent().Play();
}
打破
案例模式。停用:
if(targetGameObject!=null)
{
targetGameObject.SetActive(false);
}
打破
}
}
}
专用空对撞机(对撞机其他)
{
DoActivateTrigger();
}
}
}
如果我将浮动脚本添加到对象中,它将开始浮动,无论玩家是否通过触发器。所以我不知道该怎么做

请帮忙


非常感谢

在开始游戏之前,应该关闭浮动对象上的
自动移动和状态
组件。否则它将在游戏开始后执行。

当然!为什么我没想到!!:-)谢谢这是一个常见的错误
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();
    }
}
}