如何旋转GameObject?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何旋转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);
}
}
如何编辑它来做我想要的?
例:
你可以使用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);
Notes:
这仅适用于您的PlayerController附加到您的船舶游戏对象。如果它没有附加,你当然必须使用你的船的变换。
世界空间与地方空间
在场景视图中单击对象时,应该看到变换和指向不同方向(3轴)的3个箭头(红色,绿色,蓝色)。当您使用上面提供的参数的方法时,您使用这些箭头作为旋转轴。
您还可以围绕WorldSpace轴旋转。
transform.Rotate(Vector3.up, Time.deltaTime, Space.World);
何时使用transform.Rotate?
当您使用变换方法更改变换的位置或旋转时,它将应用于帧的末尾。这些变化忽略了物理。
- >如果您不关心碰撞,请使用转换方法
何时使用rigidbody.MoveRotation?
当您使用刚体方法更改rigidbody.position或rigidbody.MoveRotation时,它将在下一个物理步骤结束时应用。这些变化关心物理(碰撞和东西)
- >如果您关心碰撞,请使用刚体方法
感谢Helium的提示。
第三种可能性:
您可以使用动画旋转对象,而不是直接调用transform.Rotate或rigidbody.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来获得所需的速度。希望这可以帮助。 ;)
以上是关于如何旋转GameObject?的主要内容,如果未能解决你的问题,请参考以下文章
Butterknife 片段旋转给出 NullPointer