车辆为什么会瞬移到我的路径点?

huangapple go评论100阅读模式
英文:

why does the car teleport to my waypoints

问题

  1. 我制作了一段代码,允许汽车驶向预定的路标,如果它到达那里,它会自动驶向下一个。以下是代码部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AICar : MonoBehaviour
{

  1. public Transform Player;
  2. public Transform Player2;
  3. public Transform Player3;
  4. public Transform Player4;
  5. public Transform Player5;
  6. public Transform Player6;
  7. public int MoveSpeed = 5;
  8. int MaxDist = 10;
  9. int MinDist = 5;
  10. void Start()
  11. {
  12. StartCoroutine(SparseUpdate());
  13. }
  14. IEnumerator SparseUpdate()
  15. {
  16. yield return new WaitForSeconds(0);
  17. while (true)
  18. {
  19. yield return null;
  20. transform.LookAt(Player);
  21. if (Vector3.Distance(transform.position, Player.position) >= MinDist)
  22. {
  23. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  24. Debug.Log(MoveSpeed);
  25. if (Vector3.Distance(transform.position, Player.position) <= MaxDist)
  26. {
  27. StartCoroutine(SparseUpdateSecond());
  28. }
  29. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  30. }
  31. }
  32. }
  33. IEnumerator SparseUpdateSecond()
  34. {
  35. yield return new WaitForSeconds(0);
  36. while (true)
  37. {
  38. yield return null;
  39. transform.LookAt(Player2);
  40. if (Vector3.Distance(transform.position, Player2.position) >= MinDist)
  41. {
  42. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  43. Debug.Log(MoveSpeed);
  44. if (Vector3.Distance(transform.position, Player.position) <= MaxDist)
  45. {
  46. StartCoroutine(SparseUpdateThird());
  47. }
  48. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  49. }
  50. }
  51. }
  52. IEnumerator SparseUpdateThird()
  53. {
  54. yield return azerobgerbdhzvidhqszckrsqirhzretrkev
  55. while (true)
  56. {
  57. yield return null;
  58. transform.LookAt(Player3);
  59. if (Vector3.Distance(transform.position, Player3.position) >= MinDist)
  60. {
  61. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  62. if (Vector3.Distance(transform.position, Player3.position) <= MaxDist)
  63. {
  64. StartCoroutine(SparseUpdateFourth());
  65. }
  66. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  67. }
  68. }
  69. }
  70. IEnumerator SparseUpdateFourth()
  71. {
  72. yield return new WaitForSeconds(0);
  73. while (true)
  74. {
  75. yield return null;
  76. transform.LookAt(Player4);
  77. if (Vector3.Distance(transform.position, Player4.position) >= MinDist)
  78. {
  79. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  80. if (Vector3.Distance(transform.position, Player4.position) <= MaxDist)
  81. {
  82. StartCoroutine(SparseUpdateFifth());
  83. }
  84. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  85. }
  86. }
  87. }
  88. IEnumerator SparseUpdateFifth()
  89. {
  90. yield return new WaitForSeconds(0);
  91. while (true)
  92. {
  93. yield return null;
  94. transform.LookAt(Player5);
  95. if (Vector3.Distance(transform.position, Player5.position) >= MinDist)
  96. {
  97. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  98. if (Vector3.Distance(transform.position, Player5.position) <= MaxDist)
  99. {
  100. StartCoroutine(SparseUpdateSixth());
  101. }
  102. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  103. }
  104. }
  105. }
  106. IEnumerator SparseUpdateSixth()
  107. {
  108. yield return new WaitForSeconds(0);
  109. while (true)
  110. {
  111. yield return null;
  112. transform.LookAt(Player6);
  113. if (Vector3.Distance(transform.position, Player6.position) >= MinDist)
  114. {
  115. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  116. if (Vector3.Distance(transform.position, Player6.position) <= MaxDist)
  117. {
  118. // 在此处执行您在 Update 中通常要执行的所有常规操作。
  119. }
  120. }
  121. }
  122. }

}

  1. 它慢慢地驶向第一个路标,这是正确的,但对于其他路标,它非常快,我不知道为什么?有人可以帮助吗?谢谢。
  2. 我尝试了其他方法来移动汽车,但都没有成功。
英文:

I made a code that allows a car to drive to defined waypoints, if it arrives there it automaticly drives to the next. Following code:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class AICar : MonoBehaviour
  6. {
  7. public Transform Player;
  8. public Transform Player2;
  9. public Transform Player3;
  10. public Transform Player4;
  11. public Transform Player5;
  12. public Transform Player6;
  13. public int MoveSpeed = 5;
  14. int MaxDist = 10;
  15. int MinDist = 5;
  16. void Start()
  17. {
  18. StartCoroutine(SparseUpdate());
  19. }
  20. IEnumerator SparseUpdate()
  21. {
  22. yield return new WaitForSeconds(0);
  23. while(true)
  24. {
  25. yield return null;
  26. transform.LookAt(Player);
  27. if (Vector3.Distance(transform.position, Player.position) &gt;= MinDist)
  28. {
  29. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  30. Debug.Log(MoveSpeed);
  31. if (Vector3.Distance(transform.position, Player.position) &lt;= MaxDist)
  32. {
  33. StartCoroutine(SparseUpdateSecond());
  34. }
  35. // Do all the normal things you&#39;d do in Update here instead.
  36. }
  37. }
  38. }
  39. IEnumerator SparseUpdateSecond()
  40. {
  41. yield return new WaitForSeconds(0);
  42. while(true)
  43. {
  44. yield return null;
  45. transform.LookAt(Player2);
  46. if (Vector3.Distance(transform.position, Player2.position) &gt;= MinDist)
  47. {
  48. transform.position += transform.forward * * Time.deltaTime;
  49. Debug.Log(MoveSpeed);
  50. if (Vector3.Distance(transform.position, Player.position) &lt;= MaxDist)
  51. {
  52. StartCoroutine(SparseUpdateThird());
  53. }
  54. // Do all the normal things you&#39;d do in Update here instead.
  55. }
  56. }
  57. }
  58. IEnumerator SparseUpdateThird()
  59. {
  60. yield return new WaitForSeconds(0);
  61. while(true)
  62. {
  63. yield return null;
  64. transform.LookAt(Player3);
  65. if (Vector3.Distance(transform.position, Player3.position) &gt;= MinDist)
  66. {
  67. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  68. if (Vector3.Distance(transform.position, Player3.position) &lt;= MaxDist)
  69. {
  70. StartCoroutine(SparseUpdateFourth());
  71. }
  72. // Do all the normal things you&#39;d do in Update here instead.
  73. }
  74. }
  75. }
  76. IEnumerator SparseUpdateFourth()
  77. {
  78. yield return new WaitForSeconds(0);
  79. while(true)
  80. {
  81. yield return null;
  82. transform.LookAt(Player4);
  83. if (Vector3.Distance(transform.position, Player4.position) &gt;= MinDist)
  84. {
  85. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  86. if (Vector3.Distance(transform.position, Player4.position) &lt;= MaxDist)
  87. {
  88. StartCoroutine(SparseUpdateFifht());
  89. }
  90. // Do all the normal things you&#39;d do in Update here instead.
  91. }
  92. }
  93. }
  94. IEnumerator SparseUpdateFifht()
  95. {
  96. yield return new WaitForSeconds(0);
  97. while(true)
  98. {
  99. yield return null;
  100. transform.LookAt(Player5);
  101. if (Vector3.Distance(transform.position, Player5.position) &gt;= MinDist)
  102. {
  103. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  104. if (Vector3.Distance(transform.position, Player5.position) &lt;= MaxDist)
  105. {
  106. StartCoroutine(SparseUpdateSixt());
  107. }
  108. // Do all the normal things you&#39;d do in Update here instead.
  109. }
  110. }
  111. }
  112. IEnumerator SparseUpdateSixt()
  113. {
  114. yield return new WaitForSeconds(0);
  115. while(true)
  116. {
  117. yield return null;
  118. transform.LookAt(Player6);
  119. if (Vector3.Distance(transform.position, Player6.position) &gt;= MinDist)
  120. {
  121. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  122. if (Vector3.Distance(transform.position, Player6.position) &lt;= MaxDist)
  123. {
  124. }
  125. // Do all the normal things you&#39;d do in Update here instead.
  126. }
  127. }
  128. }
  129. }

it drives slowly to the first, which is right but to the others it is very quick and i dont know why? can anbyody help?
thank you

I tried other methods to move the car but nothing works

答案1

得分: 0

if (Vector3.Distance(transform.position, Player3.position) >= MinDist)
{
transform.position += transform.forward * MoveSpeed * Time.deltaTime;
if (Vector3.Distance(transform.position, Player3.position) <= MaxDist)
{
StartCoroutine(SparseUpdateFourth());
break;
}
// 在这里执行正常的 Update 操作。
}

英文:

As always, place debugger around to see how your code actually works do miracles!

In this one though, since each of your IEnumerator placed inside a while(true), it simply doesnt stop and ends up running all the IEnumerators at the same time.

In sort, just include a break; after each time you start new coroutine, something like this should do

  1. if (Vector3.Distance(transform.position, Player3.position) &gt;= MinDist)
  2. {
  3. transform.position += transform.forward * MoveSpeed * Time.deltaTime;
  4. if (Vector3.Distance(transform.position, Player3.position) &lt;= MaxDist)
  5. {
  6. StartCoroutine(SparseUpdateFourth());
  7. break;
  8. }
  9. // Do all the normal things you&#39;d do in Update here instead.

huangapple
  • 本文由 发表于 2023年3月12日 19:24:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/75712774.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定