Не работает функция OnTriggerEnter2D и задержка в Unity2d
Всем привет. Я тут решил сделать 2d игру в Unity, но у меня проблема. Суть игры заключается в том, что нужно управлять персонажем и собирать монеты, которые должны появлятся в рандомных местах каждые две секунды, и должны пропадать когда персонаж прикоснулся к ним. Но проблема в том, что при прикосновении персонажа к монете событие OnTriggerEnter2D не срабатывает, а также не работает функция задержки "Thread.Sleep();". Когда я добавляю её в код и запускаю игру, Unity зависает, и не откликается никакие нажатия. Как устранить эти две проблемы с OnTriggerEnter2D и Thread.Sleep();
Код этого всего находится ниже:
GameController.cs(в котором находится код спавна монет каждые две секунды):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System.Threading.Tasks;
public class GameController : MonoBehaviour
{
public GameObject coin;
public static GameObject inst_obj;
private void SpawnCoin()
{
int randY = Random.Range(5, -6);
int randX = Random.Range(-3, 3);
Vector3 spawnPosition = new Vector3(randX, randY);
Quaternion spawnRotation = Quaternion.identity;
inst_obj = Instantiate(coin, spawnPosition, spawnRotation) as GameObject;
}
private void FixedUpdate()
{
Thread.Sleep(2000);
SpawnCoin();
}
}
А вот скрипт Player.cs (в котором находится тот самый OnTriggerEnter2D):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Threading;
using System;
using System.Threading.Tasks;
public class Player : MonoBehaviour
{
public FixedJoystick joystick;
public float velocity = 1.0f;
public float velocityRightLeft = 1.0f;
private int coins1 = 0;
//GameController gameController = new GameController();
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void FixedUpdate()
{
gameObject.GetComponent<Rigidbody2D>().transform.position += new Vector3(joystick.Direction.x * velocityRightLeft * Time.fixedDeltaTime, joystick.Direction.y * velocity * Time.fixedDeltaTime, 0);
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag.Equals("Coin"))
{
Destroy(GameController.inst_obj);
}
}
}
Ответы (1 шт):
Как минимум - во-первых, вы используете Thread.Sleep в Update... Он каждый кадр будет морозить приложение на 2 секунды. Во-вторых, Thread.Sleep вообще в Unity использовать не надо. Прочитайте про корутины.
https://docs.unity3d.com/Manual/Coroutines.html
Или, если нужно совсем просто, пример из ссылки выше...
float timer = 0f;
void FixedUpdate () {
timer += Time.deltaTime;
if( timer > someAmount ) {
// do something
}
}