Как повернуть GameObject?
Я смотрю учебники по единству, и в управляющем коде корабля я бы хотел, чтобы он вращался вокруг своей оси, то есть он мог непрерывно вращаться на 360 градусов, пока я нажимаю, например, правую клавишу.
PlayerController:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Boundary
{
public float xMin, xMax, zMin, zMax;
}
public class PlayerController : MonoBehaviour {
[Header("Movement")]
public float speed;
public float tilt;
public Boundary boundary;
private Rigidbody rig;
[Header("Shooting")]
public GameObject shot;
public Transform shotSpawn;
public float fireRate;
private float nextFire;
void Awake () {
rig = GetComponent<Rigidbody>();
}
void Update () {
if (Input.GetButton ("Fire1") && Time.time > nextFire) {
nextFire = Time.time + fireRate;
Instantiate (shot, shotSpawn.position, Quaternion.identity);
}
}
void FixedUpdate () {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0f, moveVertical);
rig.velocity = movement * speed;
rig.position = new Vector3 (Mathf.Clamp (rig.position.x, boundary.xMin, boundary.xMax), 0f, Mathf.Clamp (rig.position.z, boundary.zMin, boundary.zMax));
rig.rotation = Quaternion.Euler (0f, 0f, rig.velocity.x * -tilt);
}
}
Как я могу отредактировать это, чтобы сделать то, что я хочу?
пример:
2 ответа
Вы можете использовать Transform.Rotate()
Ваш код будет выглядеть следующим образом:
void FixedUpdate () {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0f, moveVertical);
rig.velocity = movement * speed;
rig.position = new Vector3 (Mathf.Clamp (rig.position.x, boundary.xMin, boundary.xMax), 0f, Mathf.Clamp (rig.position.z, boundary.zMin, boundary.zMax));
if(moveHorizontal > 0){ //if your "right key" is pressed
// Rotate the object around its local X axis at 1 degree per second
transform.Rotate(Vector3.right * Time.deltaTime);
}
}
Для более быстрого вращения вы можете просто умножить Vector3.right на некоторое значение.
Чтобы вращаться вокруг другой оси, используйте другие направления вектора, например Vector3.up. Например:
transform.Rotate(Vector3.Up * moveHorizontal * Time.deltaTime);
transform.Rotate(Vector3.Forward * moveHorizontal * Time.deltaTime);
Когда вы умножаете Vector3.Right на ваш moveHorizontal, он также должен работать, когда вы нажимаете "левую клавишу", и это должно приводить к вращению в другом направлении.
transform.Rotate(Vector3.right * moveHorizontal * Time.deltaTime);
Заметки:
Это работает, только если ваш PlayerController прикреплен к игровому объекту вашего корабля. Если он не прикреплен, вы, конечно, должны использовать трансформацию вашего корабля.
Мир Космос против Местного Пространства
Когда вы нажимаете на свой объект в виде сцены, вы должны увидеть трансформацию и 3 стрелки (красная, зеленая, синяя), указывающие в разных направлениях (3 оси). Когда вы используете метод с параметрами, указанными выше, вы используете эти стрелки в качестве оси вращения.
Вы также можете вращать вокруг оси WorldSpace.
transform.Rotate(Vector3.up, Time.deltaTime, Space.World);
Когда использовать transform.Rotate?
Когда вы изменяете положение или вращение преобразования, используя методы преобразования, оно будет применено в конце кадра. Эти изменения игнорируют физику.
-> Используйте методы преобразования, если вы не заботитесь о столкновениях
Когда использовать Hardbody.MoveRotation?
Когда вы меняете hardbody.position или hardbody.MoveRotation, используя методы Hardbody, оно будет применено в конце следующего шага по физике. Эти изменения заботятся о физике (столкновения и прочее)
-> Используйте методы твердого тела, если вы заботитесь о столкновениях
Спасибо Hellium за эту подсказку.
Третья возможность:
Вместо прямого вызова transform.Rotate или hardbody.MoveRotation, вы также можете вращать ваш объект, используя анимацию, которая изменяет вращение преобразования.
Пример Transform.Rotate()
Вы можете ясно видеть, что проверки столкновений игнорируются на этом объекте, когда он вращается через землю. (Я упаковал этот gif в спойлер, чтобы уменьшить шум. Вам нужно навести на него курсор, если вы хотите его увидеть)
Это будет скорость и ось вашего вращения.
public Vector3 eulerAngleVelocity = new Vector3(0f,0f,1000f);
Так как вы хотите вращать жесткое тело, используйте MoveRotation
Quaternion deltaRotation = Quaternion.Euler(-moveHorizontal * eulerAngleVelocity * Time.deltaTime);
rig.MoveRotation(rig.rotation * deltaRotation);
Конечный код будет выглядеть так
// NEW CODE BEGIN------
public Vector3 eulerAngleVelocity = new Vector3(0f,0f,1000f);
// NEW CODE END------
void FixedUpdate () {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
// NEW CODE BEGIN------
Vector3 movement = new Vector3(0f, 0f, moveVertical); // Notice I have removed moveHorizontal, this will make sure your gameobject doesnt go left and right. We will use move horizontal for rotating the gameobject.
// NEW CODE END------
rig.velocity = movement * speed;
rig.position = new Vector3 (Mathf.Clamp (rig.position.x, boundary.xMin, boundary.xMax), 0f, Mathf.Clamp (rig.position.z, boundary.zMin, boundary.zMax));
// NEW CODE BEGIN------
Quaternion deltaRotation = Quaternion.Euler(-moveHorizontal * eulerAngleVelocity * Time.deltaTime);
rig.MoveRotation(rig.rotation * deltaRotation);
// NEW CODE END------
}
Вы можете играть с eulerAngleVelocity, чтобы получить желаемую скорость. Надеюсь это поможет.;)