#c# #android #unity3d #object #rotation
#c# #Android #unity3d #объект #поворот
Вопрос:
Я знаю, что на этот вопрос отвечали примерно 1000 раз, но я просто не знаю, как именно я должен кодировать. Все, что я хочу, это когда платформа меняет свое положение на оси x или z, затем повернуть всю платформу на 90 градусов. Я попробовал это с помощью platform.transform.Rotate(0, 90, 0), поэтому я думаю, что есть еще что сделать. Сам код:
public GameObject platform;
public Transform lastPlatform;
Vector3 lastPosition;
Vector3 newPos;
bool stop;
private Quaternion rotationQuaternion;
void Start()
{
lastPosition = lastPlatform.position;
StartCoroutine(SpawnPlatforms());
rotationQuaternion = transform.rotation;
}
void Update()
{
}
IEnumerator SpawnPlatforms()
{
while (!stop)
{
GeneratePosition();
Instantiate(platform, newPos, rotationQuaternion * Quaternion.identity);
lastPosition = newPos;
yield return new WaitForSeconds(0.1f);
}
}
void GeneratePosition()
{
newPos = lastPosition;
int rand = Random.Range(0, 2);
if (rand > 0)
{
newPos.x = 1.5f;
transform.rotation = rotationQuaternion * Quaternion.Euler(0, 90, 0); //one way i tried
}
else
{
newPos.z = 1.5f;
platform.transform.Rotate(0, 90, 0) //another way I tried
}
}
Я ценю всю помощь!
Комментарии:
1. Я не вижу, где вы что-то вращаете…
2. Потому что я удалил из него. Я попытался повернуть оператор random if, поэтому при изменении положения платформ он также будет вращаться. Но это не так.
3. Пожалуйста, покажите, что вы пробовали 😉
4. Я отредактировал сообщение, пожалуйста, взгляните. Может быть ужасно.
Ответ №1:
Итак, как я вижу, в настоящее время существует несколько проблем / неясных вещей
- вы вращаетесь примерно
90°
каждую0.1
секунду, поэтому в течение 1 секунды вы вращаетесь900°
. Мне кажется, что это просто способ ускорить. - Вы также вращаете
transform
, а не платформу platform
кажется, это сборный объект в активах, поэтому нет смысла его поворачивать
Вы, вероятно, хотите сделать
void GeneratePosition()
{
newPos = lastPosition;
int rand = Random.Range(0, 2);
if (rand > 0)
{
newPos.x = 1.5f;
}
else
{
newPos.z = 1.5f;
}
// rather directly rotate the quaternion parameter
// if you are going to do the same thing in both cases anyway I would rather extract it right away
rotationQuaternion *= Quaternion.Euler(0, 90, 0);
}
а затем также
// Rotating by "Quaternion.idendity" has no effect
Instantiate(platform, newPos, rotationQuaternion);
Тем не менее, для меня это звучит как много нереста, может быть, вы захотите изучить объединение объектов
Комментарии:
1. Спасибо за ваш ответ! Это все равно как-то не работает, платформы не вращаются. Да, появляется много платформ. Я готов решить эту проблему, поэтому для каждого ввода генерируется одна платформа.
Ответ №2:
Мне удалось найти решение проблемы. Может быть, это может быть кому-то полезно, так что поехали:
public struct SpawnPoint
{
public Vector3 position;
public Quaternion orientation;
public void Step(float distance)
{
if (Random.value < 0.5)
{
position.x = distance;
orientation = Quaternion.Euler(0, 90, 0);
}
else
{
position.z = distance;
orientation = Quaternion.Euler(0, 0, 0);
}
//orientation = Quaternion.Euler(0, 90, 0) * orientation;
}
}
void Start()
{
_spawn.position = lastPlatform.position;
_spawn.orientation = transform.rotation;
}
С этого момента все, что осталось сделать, это создать экземпляр:
var newPlatform = Instantiate(platform, _spawn.position, _spawn.orientation);
Огромное спасибо derHugo за то, что дал мне представление о том, как это сделать!
Комментарии:
1. Когда
Step
вызывается get? Неясно, как это связано с кодом в вопросе