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# 导致无限循环的事件_C#_Unity3d - Fatal编程技术网

C# 导致无限循环的事件

C# 导致无限循环的事件,c#,unity3d,C#,Unity3d,我有一个静态事件,每当玩家点击左键时就会触发 我有一个正在侦听此事件的游戏对象列表,但是,仅当abletoshot为true时才应执行的函数 即使它是假的,似乎也会执行。我有一个函数,它调用一个函数,该函数从列表中生成下一个对象, 然而,这似乎将它置于一个无限循环中 这是LeftClickEvent脚本 public class InputManager : MonoBehaviour { public delegate void ShootProjectile(); publi

我有一个静态事件,每当玩家点击左键时就会触发

我有一个正在侦听此事件的游戏对象列表,但是,仅当
abletoshot
true
时才应执行的函数

即使它是假的,似乎也会执行。我有一个函数,它调用一个函数,该函数从列表中生成下一个对象, 然而,这似乎将它置于一个无限循环中

这是LeftClickEvent脚本

public class InputManager : MonoBehaviour
{
    public delegate void ShootProjectile();
    public static event ShootProjectile Shoot;

    private void Update()
    {
        if (Input.touchCount > 0)
        {
            if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                if (Shoot != null)
                {
                    Shoot();
                }
            }
        }
        else if (Input.GetMouseButtonDown(0))
        {
            if (Shoot != null)
            {
                Shoot();
            }
        }
    }
}
这是正在侦听LeftClickEvent的脚本:

public class ProjectileMovement : MonoBehaviour
{

    public float speed = 3;
    private bool ableToShoot;
    public int itemInList = 0;
    public StartLevelMechanics mechanics;
    HitParticles particles;

    public bool AbleToShoot
    {
        get
        {
            return ableToShoot;
        }

        set
        {
            ableToShoot = value;
        }
    }

    private void Awake()
    {
        InputManager.Shoot += ShootProjectile;
        particles = GameObject.Find("HitParticles").GetComponent<HitParticles>();
        AbleToShoot = false;
    }

    public void ShootProjectile()
    {
        if (AbleToShoot)
        {
            GetComponentInChildren<Animator>().SetTrigger("Shoot");
            iTween.MoveTo(this.gameObject, iTween.Hash("position", new Vector3(transform.position.x, 10, transform.position.z),
                          "easetype", iTween.EaseType.spring, "time", 1f, "oncomplete", "DestroyProjectile",  "oncompletetarget", 
                          this.gameObject));
            mechanics.NewBall();
            return;
        }
    }
}
公共类项目移动:单行为
{
公共浮动速度=3;
私人厕所;
public int itemInList=0;
公共力学;
希特勒粒子;
公共图书馆
{
得到
{
返回ablethoot;
}
设置
{
AbletHost=值;
}
}
私人空间
{
InputManager.Shoot+=射弹;
粒子=游戏对象。查找(“HitParticles”).GetComponent();
Ablethoot=false;
}
公共场所
{
如果(ABLETOSHOT)
{
getComponentChildren().SetTrigger(“shot”);
iTween.MoveTo(this.gameObject,iTween.Hash(“位置”),新向量3(transform.position.x,10,transform.position.z),
“easetype”,iTween.easetype.spring,“time”,1f,“未完成”,“销毁射弹”,“未完成目标”,
这个游戏对象);
力学;
返回;
}
}
}
这是一个力学脚本,它将下一个游戏对象AbletHost变为真

public void NewBall()
{
    if (projectiles.Count == 1)
    {
        projectiles.Clear();
    }
    else
    {
        projectiles.Remove(projectiles[0]);
    }

    if (projectiles.Count == 0)
    {
        levelOver();
        return;
    }

    lastBall = projectiles[0];
    ProjectileMovement movement = lastBall.GetComponent<ProjectileMovement>();

    iTween.MoveTo(lastBall, iTween.Hash("position", ShootStartPosition,
                  "time", 0.3f, "easetype", iTween.EaseType.easeOutQuad));
    RotateBalls();
    AbleToShoot();
    return;
}
public void NewBall()
{
if(projectles.Count==1)
{
射弹。清除();
}
其他的
{
射弹。移除(射弹[0]);
}
if(projectles.Count==0)
{
levelOver();
返回;
}
lastBall=射弹[0];
ProjectleMovement movement=lastBall.GetComponent();
iTween.MoveTo(lastBall,iTween.Hash(“位置”),ShootStartPosition,
“时间”,0.3f,“easetype”,iTween.easetype.easeOutQuad);
旋转球();
Ablethoot();
返回;
}

因此,我感觉事件不知何故被放入了一个队列中,每当
abletoshot==true
时就会执行,但是我在文档中找不到任何内容。

我认为这是因为它创建了类的多个副本。在不知道它在哪里被使用的情况下,这只是一个猜测。尝试更改它,使变量ABLETOSHOT只有一个副本:

private static bool ableToShoot;

它在哪里将其设置为
true
?我看到你有
abletoshot()
试图调用类似于方法的属性(您应该会得到一个错误)。我看不到你说的任何地方
abletoshot=true
…或再次将其设置为
false
。当你说无限循环时,你是说你的unity编辑器冻结了吗?就是这样,它没有冻结。当列表为空时,它停止。AbletHost只是将lastBall.AbletHost设置为true,仅此而已。没有循环,因此它不会被卡住(我也建议更新您的标题)。您是否打算在一次
shot
调用中发射所有射弹?
因此我感觉事件不知何故被放入了一个队列中,每当ABLETOSHOT==true时就会执行,但是我在文档中找不到任何内容。。哪个文档?我需要每个对象都有这个属性,所以它不是一个选项。