Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
Unity es la mejor manera de encontrar la distancia entre los NPC y el jugador

Escribí un código para encontrar la distancia entre el jugador y algunos NPC y si alguno de ellos tiene < minDistanceToTalk, activo un texto que dice "Presione E para hablar con el personaje". Estoy ejecutando esto en cada método de actualización y el código verifica la distancia. a todos los NPC. ¿Es esto malo para el rendimiento?

Nota: Tendré 3 NPC como máximo, así que creo que está bien hacer este cálculo, pero ¿y si tuviera 1000 NPC?

 void Update() { for (int i = 0; i < characters.Length; i++) { distances[i] = Vector3.Distance(player.transform.position, characters[i].transform.position); if (distances[i] < minDistanceToTalk) { playerCloseCharacter = true; currentCharacter = characters[i]; talkWithCharacterText.gameObject.SetActive(true); } } if (!playerCloseCharacter) { talkWithCharacterText.gameObject.SetActive(false); } playerCloseCharacter = false; }
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

SÍ, ESO ES MUY MALO PARA EL RENDIMIENTO LOL, esta actualización ejecuta más de 60 fotogramas por segundo, imagina cada segundo 60 * 3 = 120 operaciones. Y para 1000 NPC, eso es 1000 * 60 = 60000 operaciones por segundo, esto se acumulará y ralentizará el rendimiento. Haga todo lo posible para no poner bucles for en la actualización, la actualización en sí misma es como un bucle for en el sentido de que es una ejecución continua.

Hay dos maneras de hacer esto:

[MANERA FÁCIL] Puede crear un colisionador de esferas que cubra una cierta distancia en la que desea que el jugador esté dentro para interactuar con el NPC, ese colisionador estará en el NPC y establecerá isTrigger en verdadero en el colisionador. Y luego cree un script en eso que verifique si el jugador está cerca. Por ejemplo:

 private void OnTriggerEnter(Collider other) { Player player = other.GetComponent<Player>(); if(player != null) { // Do stuff if the player is within the collider } }

O puede colocar este código en el reproductor o dentro del script "Player.cs" que pueda tener. Haría exactamente lo mismo, pero en lugar de Player player = other.GetComponent<Player>(); harías NPC npc = other.GetComponent<NPC>(); y luego en la declaración if sería if(npc != null) haz lo que quieras dentro. Esa es la manera fácil, tendrás muchos colisionadores, pero eso es MUCHO mejor que pasar por todos los NPC. https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html

[MÁS RENDIMIENTO] No tengo el código para esto, pero aquí está la documentación al respecto: https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

Básicamente, lo que haría es lanzar un rayo a su alrededor en un círculo hasta una cierta distancia, y ese rayo devolvería cualquier cosa con la que colisione (tenga en cuenta que los objetos deben tener algún tipo de colisionadores para ser detectados). Y para que pueda verificar si la cosa con la que chocó es un NPC o no, y si lo es, puede hacer lo que quiera o llamar a funciones en el propio NPC. Esto es eficaz porque no necesitaría crear múltiples colisionadores como la primera implementación, sino que emite un rayo invisible que no tiene que renderizarse y, por lo tanto, ahorra rendimiento. También puede simplemente proyectar un rayo en una determinada máscara de capa e ignorar todas las demás máscaras, por lo que es aún mejor para el rendimiento porque ahorra en operaciones que no usaría.

De hecho, encontré un buen video de YouTube al respecto: https://www.youtube.com/watch?v=XYIyRKI3HW0

¡buena suerte!

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!