Infernotakes Ответов: 2

Ошибка C#: имя 'col' не существует в текущем контексте


Итак, я хотел сделать задержку респауна для своего персонажа, когда он умирает, и я сделал сценарий, используя учебники youtube, и добавил его в свой "Спайк" или объект, который убивает вас.
Вот вам сценарий:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KillObject : MonoBehaviour {
    [SerializeField] Transform spawnPoint;
    public float respawnDelay;


    void OnCollisionEnter2D(Collision2D col)
    {
        StartCoroutine("RespawnCoroutine");
    }
    public IEnumerator RespawnCoroutine()
    {
        if (col.transform.CompareTag("Player"))
            yield return new WaitForSeconds(respawnDelay);
            col.transform.position = spawnPoint.position;
    }
}


Я новичок в unity и действительно мало что знаю об этом, Пожалуйста, помогите!!!

Что я уже пробовал:

Я ничего не пробовал, потому что не знаю как!

2 Ответов

Рейтинг:
2

Richard Deeming

Глядя на документация[^], у вас есть два варианта передачи значения в вашу сопрограмму:

void OnCollisionEnter2D(Collision2D col)
{
    StartCoroutine("RespawnCoroutine", col);
}

public IEnumerator RespawnCoroutine(Collision2D col)
{
    if (col.transform.CompareTag("Player")) 
    {
        yield return new WaitForSeconds(respawnDelay);
    }
    
    col.transform.position = spawnPoint.position;
}
Или:
void OnCollisionEnter2D(Collision2D col)
{
    StartCoroutine(RespawnCoroutine(col));
}

public IEnumerator RespawnCoroutine(Collision2D col)
{
    if (col.transform.CompareTag("Player")) 
    {
        yield return new WaitForSeconds(respawnDelay);
    }
    
    col.transform.position = spawnPoint.position;
}


Рейтинг:
1

OriginalGriff

col является параметром для вашего OnCollisionEnter2D метод:

void OnCollisionEnter2D(Collision2D col)
{
StartCoroutine("RespawnCoroutine");
}
таким образом, его область применения ограничена только этим методом. Вы не можете получить доступ к нему вне метода, для которого он является параметром, поскольку он перестает существовать (и это стековая память, переработанная) при выходе метода.

Вы можете создать переменную уровня класса, чтобы справиться с ней, но ... Я ничего не знаю о вашем приложении, поэтому не могу рекомендовать это - вероятно, лучше сесть и переосмыслить то, что вы пытаетесь сделать, или то, что вы ожидаете, когда вместо того, чтобы спешить "исправить это", как я подозреваю, вам нужно узнать немного больше о том, как работает система, которую вы знаете на данный момент (или вы получите некоторые действительно неприятные ошибки, возникающие в ближайшем будущем, будет очень трудно идентифицировать и исправить).