Hello,
I’m new to Unity and C#, so I might be doing some things incorrectly.
Basically for my project I have to (1) make three rocks move at a random velocity and go at a random direction. (2) A rock gets destroyed after it leaves the scene (for me, it appears to be the camera). After a rock gets destroyed, (3) a new one spawns in the scene and repeats step (1) so that there are never less than three rocks at any time.
I am able to move the first three rocks but the new rocks that spawn do not move. Is there a way to fix this?
I have two C# scripts: “Rocks.cs” and “RockSpawner.cs”, and both are attached to the three prefab rocks/sprites.
Thanks in advance.
Rocks.cs code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.VFX;
public class Rocks : MonoBehaviour
{
// death support
//Timer deathTimer;
void Start()
{
/// <summary>
/// Use this for initialization
/// </summary>
// apply impulse force to get the object moving
const float MinImpulseForce = 2f;
const float MaxImpulseForce = 3f;
float angle = Random.Range(0, 2 * Mathf.PI);
Vector2 direction = new Vector2(
Mathf.Cos(angle), Mathf.Sin(angle));
float magnitude = Random.Range(MinImpulseForce, MaxImpulseForce);
GetComponent<Rigidbody2D>().AddForce(
direction * magnitude,
ForceMode2D.Impulse);
///<summary>
///Use this for initialization
///</summary>
// create and start timer
//deathTimer = deathTimer = gameObject.AddComponent<Timer>();
//deathTimer.Duration = greenrocklifeseconds;
//deathTimer.Duration = magentarocklifeseconds;
//deathTimer.Duration = whiterocklifeseconds;
//deathTimer.Run();
}
// Update is called once per frame
void Update()
{
//if (deathTimer != null && deathTimer.Finished)
//{
// Destroy(gameObject);
//}
}
///<summary>
///Self-destruct when sprites leave scene
///</summary>
void OnBecameInvisible()
{
Destroy(gameObject);
var newObject = Instantiate(gameObject, new Vector3(), new Quaternion());
newObject.SetActive(true);
}
public static void SpawnRock()
{
}
public static void newObject()
{
SpawnRock();
}
}
RockSpawner.cs code
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
/// <summary>
/// A rock spawner
/// </summary>
public class RockSpawner : MonoBehaviour
{
// needed for spawning
[SerializeField]
GameObject prefabRocks;
// saved for efficiency
[SerializeField]
Sprite greenrock;
[SerializeField]
Sprite magentarock;
[SerializeField]
Sprite whiterock;
// spawn control
const float MinSpawnDelay = 1;
const float MaxSpawnDelay = 2;
Timer spawnTimer;
// spawn location support
const int SpawnBorderSize = 100;
int minSpawnX;
int maxSpawnX;
int minSpawnY;
int maxSpawnY;
/// <summary>
/// Use this for initialization
/// </summary>
void start()
{
// save spawn boundaries for efficiency
minSpawnX = SpawnBorderSize;
maxSpawnX = Screen.width - SpawnBorderSize;
minSpawnY = SpawnBorderSize;
maxSpawnY = Screen.height - SpawnBorderSize;
// create and save timer
spawnTimer = gameObject.AddComponent<Timer>();
spawnTimer.Duration = Random.Range(MinSpawnDelay, MaxSpawnDelay);
spawnTimer.Run();
}
/// <summary>
/// Update is called once per frame
/// </summary>
void update()
{
// check for time to spawn a new random rock
if (spawnTimer.Finished)
{
SpawnRock();
}
// change spawn timer duration and restart
spawnTimer.Duration = Random.Range(MinSpawnDelay, MaxSpawnDelay);
spawnTimer.Run();
}
/// <summary>
/// spawns a new rock at a random location
/// </summary>
public void SpawnRock()
{
// generate random location and create a new rock
Vector3 location = new Vector3(Random.Range(minSpawnX, maxSpawnX),
Random.Range(minSpawnY, maxSpawnY),
-Camera.main.transform.position.z);
Vector3 worldLocation = Camera.main.ScreenToWorldPoint(location);
GameObject Rock = Instantiate(prefabRocks) as GameObject;
Rock.transform.position = worldLocation;
// set random sprite for new rock
SpriteRenderer spriteRenderer = prefabRocks.GetComponent<SpriteRenderer>();
int SpriteNumber = Random.Range(0, 3);
if (SpriteNumber == 0)
{
spriteRenderer.sprite = greenrock;
}
else if (SpriteNumber == 1)
spriteRenderer.sprite = magentarock;
else
{
spriteRenderer.sprite = whiterock;
}
}
}