C# Unity3d-玩家静止时炮塔停止射击

C# Unity3d-玩家静止时炮塔停止射击,c#,unity3d,C#,Unity3d,我目前正在开发一个2D自上而下的游戏,我的炮塔AI有问题。除玩家静止不动时,炮塔停止射击外,其他一切都能正常工作。当玩家停止时,bulletTimer停止增加,而不是随时间增加。我猜这与时间有关。deltaTime和frame刷新,但找不到解决方法。我是否需要使用IEnumerator和waitforseconds编写攻击函数?这感觉像是一个简单的问题,但我无法解决它。谢谢你的帮助。这是我的密码: 人工智能代码 using UnityEngine; using System.Collection

我目前正在开发一个2D自上而下的游戏,我的炮塔AI有问题。除玩家静止不动时,炮塔停止射击外,其他一切都能正常工作。当玩家停止时,bulletTimer停止增加,而不是随时间增加。我猜这与时间有关。deltaTime和frame刷新,但找不到解决方法。我是否需要使用IEnumerator和waitforseconds编写攻击函数?这感觉像是一个简单的问题,但我无法解决它。谢谢你的帮助。这是我的密码:

人工智能代码

using UnityEngine;
using System.Collections;

public class TurretAI : MonoBehaviour 
{ 
     public float FireRate;
     public float bulletSpeed;
     public float bulletTimer;

     public GameObject Gun;
     public GameObject bullet;
     public Transform target;


     public void Attack()
     {    
         bulletTimer += Time.deltaTime;

         if (bulletTimer >= FireRate) 
         {
             Vector2 direction = target.transform.position - transform.position;
             direction.Normalize ();

             GameObject bulletClone;
             bulletClone = Instantiate (bullet, Gun.transform.position, Gun.transform.rotation) as GameObject;
             bulletClone.GetComponent<Rigidbody2D> ().velocity = direction * bulletSpeed;

             bulletTimer = 0;
         }
     }
 }
使用UnityEngine;
使用系统集合;
公共类:单一行为
{ 
公共浮式灭火器;
公共交通速度;
公众浮标计时器;
公共游戏机枪;
公共游戏对象子弹;
公共转型目标;
公开无效攻击()
{    
bulletTimer+=Time.deltaTime;
如果(bulletTimer>=燃速)
{
矢量2方向=target.transform.position-transform.position;
Normalize();
游戏对象克隆;
bulletClone=实例化(bullet,Gun.transform.position,Gun.transform.rotation)作为游戏对象;
bulletClone.GetComponent().velocity=方向*bulletSpeed;
bulletTimer=0;
}
}
}
这是炮塔的触发码

using UnityEngine;
using System.Collections;

public class TurretTrigger : MonoBehaviour 
{ 
    public TurretAI turretAI;

    void Awake()
    { 
        turretAI = gameObject.GetComponentInParent<TurretAI> (); 
    }

     void OnTriggerStay2D(Collider2D Trigger)
     {
         if (Trigger.CompareTag ("Player")) 
         {
             turretAI.Attack ();
         }
     }
}
使用UnityEngine;
使用系统集合;
公共类:单一行为
{ 
公共塔台塔台;
无效唤醒()
{ 
tartai=gameObject.getComponentParent();
}
无效OnTriggerStay2D(碰撞R2D触发器)
{
if(Trigger.CompareTag(“播放器”))
{
tai.Attack();
}
}
}

我认为您的播放器的
rigidBody2D
在不移动时睡着了(这是引擎优化性能,您没有做任何事情)。当
刚体
s睡眠时,
OnTriggerStay2D
将停止检测它们。在玩家的
rigidBody2D
上调用
rigidBody2D.WakeUp()
将强制
rigidBody2D
唤醒,并被触发框检测到

我找不到更有效的方法来确保
刚体现在保持清醒。试着这样做,看看这是否是导致您出现问题的原因,然后,如果是,试着找到一种更有效的方法来俯身睡觉


编辑:Gunnar B指出,这可以在inspector中设置。转到播放器的刚体组件,将“睡眠模式”设置为“从不睡眠”。

您是否在任何时候更改
Time.timeScale
?如果您这样做,那么将
时间.deltaTime
更改为
时间.unscaledDeltaTime
可能会有所帮助。我根本没有更改时间刻度。如果可能的话,我可以录制一段视频来记录正在发生的事情。OnTiggerStay2D是否在每一帧上调用?在那里放一个Debug.Log并检查它是否冲突。下面的代码似乎还可以。我们即将编写相同的代码。我想,你可以在刚体组件中设置睡眠模式。(不睡觉应该是一个选择。)我确信这就是这么简单的事情。非常感谢你。问题已解决=)