unity BoxCollider2D旋转与GameObject旋转不一样
Unity BoxCollider2D rotation not the same as GameObject rotation
我的 GameObject 上的 BoxCollider2D 有点问题。当我旋转 GameObject 时,BoxCollider2D 会随之旋转,但速度没有那么快。有没有办法让 BoxCollider2D 以与游戏对象相同的速度移动?我觉得我错过了一些明显的东西。
Before Rotation
After Rotation
下面是我的播放器移动代码:
Animator anim;
Rigidbody2D rbody;
float speed = 0f;
public float moveSpeed = 0.6f;
public float acceleration = 0.2f;
public int turnSpeed = 20;
bool sails = false;
// Use this for initialization
void Start () {
anim = GetComponentInChildren<Animator> ();
rbody = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update () {
if (sails) {
rbody.transform.Translate (transform.right * (speed * Time.deltaTime));
speed += acceleration * Time.deltaTime;
if (speed > moveSpeed)
speed = moveSpeed;
if (Input.GetKey (KeyCode.LeftArrow)) {
rbody.transform.Rotate (0,0,turnSpeed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.RightArrow)) {
rbody.transform.Rotate (0,0,-turnSpeed * Time.deltaTime);
}
}
if (!sails) {
rbody.transform.Translate (transform.right * (speed * Time.deltaTime));
speed += -acceleration * Time.deltaTime;
if (speed < 0f)
speed = 0f;
}
if (Input.GetKeyDown (KeyCode.Space)) {
sails = !sails;
anim.SetBool ("sailsDown", sails);
}
}
问题不在于你的旋转,而在于你如何应用运动。
您正在使用 transform.right
,这是对象的本地权限。但是,当应用翻译时,您也将它应用于本地对象。
例如,如果您的船面朝下 (rotation.Z = -90),transform.right 值为 (0,-1,0),在世界坐标中这等于 "down".
但是随后您使用 rbody.transform.Translate(vector)
,它将使用本地坐标平移对象。这意味着如果您将 "down" 向量传递给它,它将局部向下移动,在 Z 轴旋转 -90 的情况下,意味着相对于世界移动 "left"。
您必须更改此行:
rbody.transform.Translate(transform.right * (speed * Time.deltaTime));
收件人:
rbody.transform.Translate(transform.right * (speed * Time.deltaTime),Space.World);
或:
rbody.transform.Translate(Vector2.right * (speed * Time.deltaTime));
我的 GameObject 上的 BoxCollider2D 有点问题。当我旋转 GameObject 时,BoxCollider2D 会随之旋转,但速度没有那么快。有没有办法让 BoxCollider2D 以与游戏对象相同的速度移动?我觉得我错过了一些明显的东西。
Before Rotation
After Rotation
下面是我的播放器移动代码:
Animator anim;
Rigidbody2D rbody;
float speed = 0f;
public float moveSpeed = 0.6f;
public float acceleration = 0.2f;
public int turnSpeed = 20;
bool sails = false;
// Use this for initialization
void Start () {
anim = GetComponentInChildren<Animator> ();
rbody = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update () {
if (sails) {
rbody.transform.Translate (transform.right * (speed * Time.deltaTime));
speed += acceleration * Time.deltaTime;
if (speed > moveSpeed)
speed = moveSpeed;
if (Input.GetKey (KeyCode.LeftArrow)) {
rbody.transform.Rotate (0,0,turnSpeed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.RightArrow)) {
rbody.transform.Rotate (0,0,-turnSpeed * Time.deltaTime);
}
}
if (!sails) {
rbody.transform.Translate (transform.right * (speed * Time.deltaTime));
speed += -acceleration * Time.deltaTime;
if (speed < 0f)
speed = 0f;
}
if (Input.GetKeyDown (KeyCode.Space)) {
sails = !sails;
anim.SetBool ("sailsDown", sails);
}
}
问题不在于你的旋转,而在于你如何应用运动。
您正在使用 transform.right
,这是对象的本地权限。但是,当应用翻译时,您也将它应用于本地对象。
例如,如果您的船面朝下 (rotation.Z = -90),transform.right 值为 (0,-1,0),在世界坐标中这等于 "down".
但是随后您使用 rbody.transform.Translate(vector)
,它将使用本地坐标平移对象。这意味着如果您将 "down" 向量传递给它,它将局部向下移动,在 Z 轴旋转 -90 的情况下,意味着相对于世界移动 "left"。
您必须更改此行:
rbody.transform.Translate(transform.right * (speed * Time.deltaTime));
收件人:
rbody.transform.Translate(transform.right * (speed * Time.deltaTime),Space.World);
或:
rbody.transform.Translate(Vector2.right * (speed * Time.deltaTime));