我自己编写了用于飞禽游戏的脚本(学习统一脚本的最佳方法)。 为了优化性能,我想一次只生成5个Obstacle gameObjects(ObjectsOnScreen)。所以我编写了一个代码来在离玩家16个单位的情况下销毁gameObject,并且编写了一个少于5个ObjectsOnScreen的新障碍物。 。 但是我的代码破坏了一个障碍物,同时生成了两个对象(而不是一个),因此最终对象将随着时间的推移而增加,并保持不变。 请告诉我我的代码中的错误。谢谢。
//GameManager script::
public class GameManager : MonoBehaviour
{
static public int ObjectsOnScreen = 0;
public float poleDistance;
public int gapWidth;
static public bool reset=false;
float x = 8;
int gap;
public GameObject obstacle;
void FixedUpdate()
{
if(reset)
{
UnityEngine.SceneManagement.SceneManager.LoadScene(0);
}
if(ObjectsOnScreen<5)
{
gap = Random.Range(-6, 6);
GenerateObstacle(x, gap);
x += poleDistance;
Debug.Log("gap = " + gap);
ObjectsOnScreen++;
}
}
void GenerateObstacle(float x , float gap)
{
GameObject Top = Instantiate(obstacle, new Vector3(x, 8, 0) , Quaternion.identity);
GameObject Bottom = Instantiate(obstacle, new Vector3(x, -8, 0), Quaternion.identity);
Top.transform.localScale = new Vector3(1, (8 - gap)-gapWidth, 1);
Bottom.transform.localScale = new Vector3(1, -(8 + gap)+gapWidth, 1);
}
}
//Obstacle Script::
public class ObstacleScript : MonoBehaviour
{
GameObject player;
void Awake()
{
player = GameObject.Find("Player");
}
void FixedUpdate()
{
if ((transform.position.x - player.transform.position.x) <= -16)
{
GameManager.ObjectsOnScreen--;
Destroy(gameObject);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
PlayerScript player = collision.gameObject.GetComponent<PlayerScript>();
if(player!=null)
{
GameManager.reset = true;
}
}
}
答案 0 :(得分:3)
您正在GenerateObstacle
函数中调用两次实例化,该函数当然将实例化两个对象(而不是一个对象)...
GameObject Top = Instantiate(obstacle, new Vector3(x, 8, 0) , Quaternion.identity);
GameObject Bottom = Instantiate(obstacle, new Vector3(x, -8, 0), Quaternion.identity);
但是您正在做ObjectsOnScreen++
,它只会递增1。然后,两个障碍物将自己删除,从而有效地减少了两次。
您可能应该增加两个ObjectsOnScreen += 2
才能获得准确的计数。