#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. рад, что смог помочь!