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