triggerzone считывает один и тот же объект в каждом кадре

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Triggerzone считывает один и тот же объект в каждом кадре, этого не предполагается, и это портит игру. Это происходит не все время, и я не знаю почему
Извините за беспорядочный код, я не слишком организован. Комментариев немного (если они есть) Я всегда забываю их вставить. Я просто печатаю сейчас, чтобы попытаться заставить его разрешить мне публиковать

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

public class spacereader : MonoBehaviour
{
    public int spacesmoved = 0, jiff;


    void Start()
    {

    }

    void Update()
    {
        sharedscript.nummoved = spacesmoved;
        if(sharedscript.reset)
        {
        spacesmoved = 0;
        jiff = 0;
        }
    }

private void OnTriggerEnter(Collider other)
{
    Debug.Log(other.tag);
    Debug.Log(other.name);
    StartCoroutine(spotchecker(other));
    if (jiff != 2)
        jiff  ;
    else if (sharedscript.ismoving)
    {
        spacesmoved  ;
    }

}

private IEnumerator spotchecker(Collider other)
{
    switch (other.tag)
    {
        case "GO":

            break;
        case "MEDAVE":

            break;
        case "CHEST":

            break;
        case "BALAVE":

            break;
        case "INCOME":

            break;
        case "READING":

            break;
        case "ORIENTAL AVE":

            break;
        case "CHANCE":

            break;
        case "VERMONT":

            break;
        case "CONNAVE":

            break;
        case "INJAIL":

            break;
        case "CHARPLACE":

            break;
        case "COMPANY":

            break;
        case "STATESAVE":

            break;
        case "VIRGAVE":

            break;
        case "PENNRAIL":

            break;
        case "JAMESPLACE":

            break;
        case "TENNAVE":

            break;
        case "NEWYORKAVE":

            break;
        case "FREEPARK":

            break;
        case "KENAVE":

            break;
        case "INDIAVE":

            break;
        case "ILLAVE":

            break;
        case "BORAIL":

            break;
        case "ATLAAVE":

            break;
        case "VENTAVE":

            break;
        case "WATERWORKS":

            break;
        case "MARVGARD":

            break;
        case "GOTOJAIL":

            break;
        case "PACAVE":

            break;
        case "NORTHAVE":

            break;
        case "PENNAVE":

            break;
        case "SHORTLINE":

            break;
        case "PARKPLACE":

            break;
        case "BOARDWALK":

            break;
        case "LUXTAX":

            break;
        }
        yield return other;
    }
}
  
 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playercontroller : MonoBehaviour
{
    public List<GameObject> targets;
    public float speed, step;
    bool canmove = false;
    public List<Camera> cameras;
    public Camera diecam;
    public List<GameObject> players;
    public List<GameObject> playerreaders;
    public int[] turntarget = new int[] { 0, 0, 0, 0 };
    public int turn = 1;
    int lastturn = 0;
    bool switchit = true;
    Coroutine inin;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if(canmove)
        {
            if(!switchit || sharedscript.doubles)
            {
                foreach(GameObject s in playerreaders)
                {
                    s.SetActive(false);
                }
                foreach (Camera s in cameras)
                {
                    s.gameObject.SetActive(false);
                }
                foreach(GameObject s in players)
                {
                    Collider g = s.GetComponent<Collider>();
                    g.enabled = false;
                    Rigidbody w = s.GetComponent<Rigidbody>();
                    w.isKinematic = true;
                }
                lastturn = turn;
                switchit = true;
            }
            Collider d = players[turn].GetComponent<Collider>();
            d.enabled = true;
            Rigidbody f = players[turn].GetComponent<Rigidbody>();
            f.isKinematic = false;
            playerreaders[turn].SetActive(true);
            cameras[turn].gameObject.SetActive(true);
            diecam.gameObject.SetActive(false);
            step = speed * Time.deltaTime;
            if (players[turn].transform.position.x <= targets[turntarget[turn]].transform.position.x   .003 amp;amp; players[turn].transform.position.x >= targets[turntarget[turn]].transform.position.x - .003 amp;amp; players[turn].transform.position.z <= targets[turntarget[turn]].transform.position.z   .03 amp;amp; players[turn].transform.position.z >= targets[turntarget[turn]].transform.position.z - .03)
            {
                if (turntarget[turn] < 3)
                {
                    turntarget[turn]   ;
                    players[turn].transform.Rotate(0, 90, 0);
                }
                else
                {
                    turntarget[turn] = 0;
                }
            }

            players[turn].transform.position = Vector3.MoveTowards(players[turn].transform.position, targets[turntarget[turn]].transform.position, speed);
        }
        if(sharedscript.nummoved >= sharedscript.total)
        {
            canmove = false;
            sharedscript.ismoving = false;
        }
        else
        {
            canmove = true;
            sharedscript.ismoving = true;
        }
        if(sharedscript.nummoved >= sharedscript.total amp;amp; sharedscript.total != 0 amp;amp; sharedscript.nummoved != 0 amp;amp; !sharedscript.doubles amp;amp; switchit)
        {
            if (turn < 3)
                turn  ;
            else
                turn = 0;
            sharedscript.reset = true;
            switchit = false;
            Debug.Log("playedturn");
            sharedscript.canroll = true;
        }

    }

}
  

Ответ №1:

Вы запускаете свою сопрограмму всякий раз, когда что-то попадает в триггерный коллайдер. Попробуйте проверить, является ли введенный объект тем объектом, который вы ищете. Если это ваш проигрыватель и объект помечен как «Player», вы могли бы проверить это:

 private void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player"))
    {
        StartCoroutine(YourCoroutine());
    }
} 
  

Другой причиной может быть обнаружение столкновения Unity. Временами это может быть непросто, поэтому большую часть времени вам лучше проверять, столкнулись ли объекты уже.

Одним из способов решения этой проблемы, в частности, с использованием сопрограмм, было бы сохранить сопрограмму в переменной вашего скрипта и проверить, выполнялась ли она уже. Что-то вроде этого:

 private Coroutine coroutine;
private void OnTriggerEnter(Collider other)
{
    if(coroutine == null)
    {
        coroutine = StartCoroutine(YourCoroutine());
    }
}
  

Затем установите значение null в OnTriggerExit или что-то в этом роде:

 private void OnTriggerExit(Collider other)
{
    coroutine = null;
}
  

Я бы рекомендовал также проверить наличие тега в этой реализации:

 private Coroutine coroutine;
private void OnTriggerEnter(Collider other)
{
    if(coroutine == null amp;amp; other.CompareTag("Player"))
    {
        coroutine = StartCoroutine(YourCoroutine());
    }
}
  

Комментарии:

1. рад, что смог помочь!