триггерная зона читает один и тот же объект каждый кадр - PullRequest
0 голосов
/ 22 марта 2019

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

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 && players[turn].transform.position.x >= targets[turntarget[turn]].transform.position.x - .003 && players[turn].transform.position.z <= targets[turntarget[turn]].transform.position.z + .03 && 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 && sharedscript.total != 0 && sharedscript.nummoved != 0 && !sharedscript.doubles && switchit)
        {
            if (turn < 3)
                turn++;
            else
                turn = 0;
            sharedscript.reset = true;
            switchit = false;
            Debug.Log("playedturn");
            sharedscript.canroll = true;
        }

    }

}

1 Ответ

0 голосов
/ 22 марта 2019

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

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 && other.CompareTag("Player"))
    {
        coroutine = StartCoroutine(YourCoroutine());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...