C# 为什么';函数不会被第二次调用吗?

C# 为什么';函数不会被第二次调用吗?,c#,function,unity3d,C#,Function,Unity3d,我试图根据当前玩家的位置在游戏中生成一些游戏对象,本质上是试图生成一个无限的跑步者类型的游戏…我制作了一个函数,这样我就可以用它生成挂架,但由于某些原因,该函数每帧只被调用一次,它不会用不同的参数被第二次调用 为什么函数的第二次调用不起作用 这是我的代码: public class CameraScript : MonoBehaviour { public float cameraSpeed = 1; public float horizontalSpeed; priva

我试图根据当前玩家的位置在游戏中生成一些游戏对象,本质上是试图生成一个无限的跑步者类型的游戏…我制作了一个函数,这样我就可以用它生成挂架,但由于某些原因,该函数每帧只被调用一次,它不会用不同的参数被第二次调用

为什么函数的第二次调用不起作用

这是我的代码:

public class CameraScript : MonoBehaviour {
    public float cameraSpeed = 1;
    public float horizontalSpeed;
    private int spawnIndex;
    public float spawnNormPylonDis;
    public float spawnCoinPylonDis;
    private int currPosition ;
    public GameObject[] pilons;
    public GameObject spawnMainPoint;
    public Transform[] spawnPoints;
    public Transform[] coinsSpawnPoint;
    public float enamySpeed;
    private int currentPoint;
    public Transform[] pointPosition;

    // Use this for initialization
    void Start () {
        //This spawns the Pilons.
        spawnMainPoint.transform.position = pointPosition [0].position;
        currPosition = (int) transform.position.z;
    }

    // Update is called once per frame
    void FixedUpdate () {

    spawnMainPoint.transform.position = Vector3.MoveTowards (spawnMainPoint.transform.position, pointPosition[currentPoint].position, Time.deltaTime * horizontalSpeed);

    SpawnPylon (pilons[1],spawnPoints,spawnNormPylonDis,"Check function");
    SpawnPylon (pilons [0], spawnPoints, spawnCoinPylonDis,"Check the second function");

    GetComponent<Rigidbody> ().velocity = transform.forward * cameraSpeed;

    //the next if statements make the Pilons spawn randomly and corectly.
    if (spawnMainPoint.transform.position == pointPosition [currentPoint].position) {
        currentPoint++;
    }
    if (currentPoint == pointPosition.Length) {
        currentPoint = 0;
    }

}
/*This function spanws the a GameObject randomly at a GameObject's position and it takes 2 arguments :
Argument 1: type GameObject 
         2: type Transform[]*/
void SpawnPylon (GameObject whatSpawn,Transform[] whereSpawn,float spawnDistance,string plm)
{       
    bool hasSpawnedPylon = false;

    if (currPosition != (int)transform.position.z)
    {
        if ((int)transform.position.z % spawnDistance == 0) 
        {
            Debug.Log (plm);
            if (!hasSpawnedPylon) 
            {
                //this makes the GameObject spawn randomly
                spawnIndex = Random.Range (0, spawnPoints.Length);
                //This is instantiationg the GameObject
                Instantiate (whatSpawn, whereSpawn [spawnIndex].position, whereSpawn [spawnIndex].rotation);
                //this makes shore that the GameObject is not spawned multiple times at aproximetley the same position.
                currPosition = (int)transform.position.z;
            }
        }
    }
    else
    {
        hasSpawnedPylon = false;
    }           
}
}
公共类CameraScript:MonoBehavior{
公共浮动摄像机速度=1;
公共浮动水平速度;
私有索引;
公共漂浮产卵器;
公共浮式产卵器;
私人职位;
公共游戏对象[]飞行员;
公共游戏对象;
公共转换点;
公共转换[]coinsSpawnPoint;
公共浮动速度;
私用点;
公共立场;
//用于初始化
无效开始(){
//这就产生了皮隆人。
spawnMainPoint.transform.position=点位置[0]。位置;
currPosition=(int)transform.position.z;
}
//每帧调用一次更新
无效固定更新(){
spawnMainPoint.transform.position=Vector3.MoveToward(spawnMainPoint.transform.position,pointPosition[currentPoint]。position,Time.deltaTime*horizontalSpeed);
SpawnPylon(pilons[1],spawnPoints,SpawnNormalpylondis,“检查功能”);
SpawnPylon(pilons[0],spawnPoints,spawnCoinPylonDis,“检查第二个函数”);
GetComponent().velocity=transform.forward*cameraSpeed;
//下一个if语句使pilon随机正确地繁殖。
if(spawnMainPoint.transform.position==pointPosition[currentPoint].position){
currentPoint++;
}
if(currentPoint==pointPosition.Length){
电流点=0;
}
}
/*此函数用于在游戏对象的位置随机跨越游戏对象,并使用2个参数:
参数1:游戏对象类型
2:类型转换[]*/
空产卵塔(游戏对象whatSpawn,变换[]何处产卵,浮动产卵距离,字符串plm)
{       
bool hasSpawnedPylon=false;
if(currPosition!=(int)transform.position.z)
{
如果((int)transform.position.z%spawndestance==0)
{
调试日志(plm);
如果(!hasSpawnedPylon)
{
//这使得游戏对象随机产生
spawnIndex=Random.Range(0,spawnindpoints.Length);
//这是游戏对象的实例化
实例化(whatSpawn,whereSpawn[spawnIndex]。位置,whereSpawn[spawnIndex]。旋转);
//这使得游戏对象不会在同一位置多次繁殖。
currPosition=(int)transform.position.z;
}
}
}
其他的
{
hasSpawnedPylon=假;
}           
}
}
在这里,我有一张带有inspector中脚本的图片:

脚本检查器

这里是控制台,试图通过使用Debug.Log()调用函数来解决这个问题


使用Debug.Log进行调用。

我对它进行了测试,在某些条件下它可以正常工作。问题很可能是,您的SpawnNormalPylondis和spawnCoinPylonDis是公共变量,在检查器中是相同的,或者SpawnNormalPylondis是spawnCoinPylonDis的倍数,在代码中,您不能让SpawnNormalPylondis为1。如果它们在spawnpillon函数中,因为它已经生成了一个。你自己评论道

//this makes shore that the GameObject is not spawned multiple times at aproximetley the same position.
currPosition = (int)transform.position.z;
我用2和3的值测试了这个函数,两个函数都被调用了,但是,如果第二个函数都是可整除的(6),它将跳过第二个函数

因此,您在这行代码中遇到了瓶颈,因为您在第一次函数调用之后设置了currPosition

if (currPosition != (int)transform.position.z)
通过制作一个基本的包装器函数,一切都很好!所以我们在检查了两个产卵调用之后设置了currPosition,瞧,问题解决了

void SpawnPylon(int index, Transform[] spawnPoint, float dist, string debug)
{
    if ((int)transform.position.z % dist == 0)
    {
        //Debug.Log(debug);
        //this makes the GameObject spawn randomly
        spawnIndex = Random.Range(0, spawnPoints.Length);
        //This is instantiationg the GameObject
        GameObject go = Instantiate(pilons[index], spawnPoint[spawnIndex].position, spawnPoint[spawnIndex].rotation) as GameObject;
        go.name = string.Format("ID: {0}", index);
    }
}

private void SpawnMultiplePylons()
{
    if (currPosition != (int)transform.position.z)
    {
        SpawnPylon(1, spawnPoints, spawnNormPylonDis, "Spawn1");
        SpawnPylon(0, spawnPoints, spawnCoinPylonDis, "Spawn2");
        currPosition = (int)transform.position.z;
    }
}

我测试了这个,它成功了。我希望它也适用于你

附加一个调试器并逐步执行,查看您的代码是否实际执行了所有函数,并且没有出错。如果不是太麻烦,请您将我的回答作为答案,并祝您在开发过程中一切顺利!很高兴,我不知道为什么我没有。祝你今天愉快:)