Unity 2D, как создавать платформы и веревки вместе?C#

Место общения программистов C#
Ответить
Anonymous
 Unity 2D, как создавать платформы и веревки вместе?

Сообщение Anonymous »

Я создаю бесконечный 2D-раннер, вдохновленный игрой Dino Google Game.
Я разместил PlatformSpawner снаружи, справа от камеры. Затем я поместил в него PlatformSpawner.cs. Я сделал несколько префабов под названием «Платформа 02.01.03» и т. д., которые включают в себя (пустой родительский, дочерний спрайт). В любом случае, есть также префабы Rope, которые соединяют префабы платформы.
PlatformSpawner порождает их, а Platform Parent (пустой в сцене) сохраняет их.
Вот схема, которую я хотел.
Изображение

Префабы платформы;

Родительский элемент: Empty(Platform.cs, Box Cold 2D)

Дочерний элемент: aa (Sprite Renderer)
Префабы Rope:

Родительский элемент: Empty(Rope.cs)

Дочерний элемент: cc(Sprite) Renderer)
Я перепробовал все, но так и не приблизился к хорошему результату. Есть ли кто-нибудь, кто может помочь?

Код: Выделить всё

using UnityEngine;

public class PlatformSpawner : MonoBehaviour
{
[SerializeField] private GameObject[] platformPrefabs;
[SerializeField] private Transform platformParent;

public float platformSpawnTime = 2f;
[Range(0, 1)] public float platformSpawnTimeFactor = 0.1f;
public float platformSpeed = 1f;
[Range(0, 1)] public float platformSpeedFactor = 0.2f;

private float _platformSpawnTime;
private float _platformSpeed;

private float timeAlive;
private float timeUntilPlatformSpawn;

private void Start()
{
GameManager.Instance.onGameOVer.AddListener(ClearPlatforms);
GameManager.Instance.onPlay.AddListener(ResetFactors);
}

private void Update()
{
if (!GameManager.Instance.isPlaying) return;

timeAlive += Time.deltaTime;
CalculateFactors();
SpawnLoop();
}

private void SpawnLoop()
{
timeUntilPlatformSpawn += Time.deltaTime;

if (timeUntilPlatformSpawn >= _platformSpawnTime)
{
Spawn();
timeUntilPlatformSpawn = 0f;
}
}

private void ClearPlatforms()
{
foreach (Transform child in platformParent)
Destroy(child.gameObject);
}

private void CalculateFactors()
{
_platformSpawnTime = platformSpawnTime / Mathf.Pow(timeAlive, platformSpawnTimeFactor);
_platformSpeed = platformSpeed * Mathf.Pow(timeAlive, platformSpeedFactor);
}

private void ResetFactors()
{
timeAlive = 1f;
_platformSpawnTime = platformSpawnTime;
_platformSpeed = platformSpeed;
timeUntilPlatformSpawn = 0;
}

private void Spawn()
{
GameObject prefab = platformPrefabs[Random.Range(0, platformPrefabs.Length)];
GameObject spawned = Instantiate(prefab, transform.position, Quaternion.identity);

spawned.transform.SetParent(platformParent, true);

Platform mover = spawned.GetComponent
();
mover.Init(_platformSpeed);
}
}

Код: Выделить всё

using UnityEngine;

public class Platform : MonoBehaviour
{
private float speed;
private float destroyXPosition = -20f;

public void Init(float moveSpeed)
{
speed = moveSpeed;
}

private void Update()
{
transform.position += Vector3.left * speed * Time.deltaTime;

if (transform.position.x < destroyXPosition)
Destroy(gameObject);
}
}

Код: Выделить всё

using UnityEngine;

public class Rope : MonoBehaviour
{
//nothing
}
Я также добавил GroundStart (черный), он остается там, чтобы игрок не упал в начале. Он перемещается влево с помощью простого кода. Красная точка — это PlatformSpawner.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... s-together
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»