unity 禁用child旋转
Unity disable child rotation
我的 object 在 unity 2d 中有一个问题,当我将箭头射到盒子对撞机到另一个元素时,当它命中并进入 child 我的意思是箭头变成child of parent (BOX) child 开始向左和向右旋转..我真的想禁用 child 的左右旋转 ..盒子 (parent) 仍然需要像以前一样旋转..我有这样的代码,我在 rigidbody2d 中的箭头处于运动学模式...
这是箭头脚本..
{
public float flySpeed = 20f;
private Rigidbody2D arrowBody;
private bool shouldFly;
// Start is called before the first frame update
void Start()
{
shouldFly = true;
arrowBody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (shouldFly == true)
{
//make our pin fly
arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "target")
{
shouldFly = false;
transform.SetParent(collision.gameObject.transform);
} else if(collision.tag == "arrow")
{
SceneManager.LoadScene("quickGameOverScene");
}
}
}
我真的很困惑你想做什么。我不明白你是想冻结旋转还是移动,所以我会 post 回答这两个问题。为了防止由父对象引起的平移和旋转,您可以像这样使用 LateUpdate
:
Quaternion InitRot;
Vector3 InitPos;
void Start () {
InitRot = transform.rotation;
InitPos = transform.position;
}
void Update()
{
//figuring out when to save position when attached to BOX
if(gameObject.transform.parent == null)
{
InitRot = transform.rotation;
InitPos = transform.position;
}
}
void LateUpdate () {
//If attached to box do not translate do not rotate
if (gameObject.transform.parent != null)
{
transform.rotation = InitRot;
transform.position = InitPos;
}
}
您可以从 here
获得有关此解决方案的更多信息
编辑
由于上面的答案不适用于 OP。我弄清楚了实际问题是什么。 OP 的代码非常适合移动箭头,但问题很可能出在他旋转框的位置。
如果他使用 transform.Rotate(Vector3.forward* 90)
旋转框,每个 Update
中的相同旋转量将导致失真,因为每个 Update
中的帧时间不相同。因此,他需要像这样使用 Time.deltaTime
来旋转盒子以实现一致的旋转: transform.Rotate(Vector3.forward* 90*Time.deltaTime);
这会在每个时间间隔内旋转相同的量并消除失真。这些是我用于任务的脚本,对我有用。
箭头脚本:
public float flySpeed = 20f;
private Rigidbody2D arrowBody;
private bool shouldFly;
private Vector2 initPos;
private Quaternion initRot;
// Start is called before the first frame update
void Start()
{
shouldFly = true;
arrowBody = GetComponent<Rigidbody2D>();
//arrowBody.isKinematic = true;
initPos = gameObject.transform.position;
initRot = gameObject.transform.rotation;
}
// Update is called once per frame
void Update()
{
if (shouldFly == true)
{
//make our pin fly
arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
}
if(gameObject.transform.parent == null)
{
initPos = gameObject.transform.position;
initRot = gameObject.transform.rotation;
}
}
void LateUpdate()
{
if (gameObject.transform.parent != null)
{
gameObject.transform.position = initPos;
gameObject.transform.rotation = initRot;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("Collision happened");
if (collision.tag == "target")
{
shouldFly = false;
transform.SetParent(collision.gameObject.transform);
}
else if (collision.tag == "arrow")
{
SceneManager.LoadScene("quickGameOverScene");
}
}
以及旋转盒子的脚本:
public float rotationSpeed = 70f;
void Update()
{
transform.Rotate(Vector3.back, rotationSpeed * Time.deltaTime);
}
我的 object 在 unity 2d 中有一个问题,当我将箭头射到盒子对撞机到另一个元素时,当它命中并进入 child 我的意思是箭头变成child of parent (BOX) child 开始向左和向右旋转..我真的想禁用 child 的左右旋转 ..盒子 (parent) 仍然需要像以前一样旋转..我有这样的代码,我在 rigidbody2d 中的箭头处于运动学模式...
这是箭头脚本..
{
public float flySpeed = 20f;
private Rigidbody2D arrowBody;
private bool shouldFly;
// Start is called before the first frame update
void Start()
{
shouldFly = true;
arrowBody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (shouldFly == true)
{
//make our pin fly
arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "target")
{
shouldFly = false;
transform.SetParent(collision.gameObject.transform);
} else if(collision.tag == "arrow")
{
SceneManager.LoadScene("quickGameOverScene");
}
}
}
我真的很困惑你想做什么。我不明白你是想冻结旋转还是移动,所以我会 post 回答这两个问题。为了防止由父对象引起的平移和旋转,您可以像这样使用 LateUpdate
:
Quaternion InitRot;
Vector3 InitPos;
void Start () {
InitRot = transform.rotation;
InitPos = transform.position;
}
void Update()
{
//figuring out when to save position when attached to BOX
if(gameObject.transform.parent == null)
{
InitRot = transform.rotation;
InitPos = transform.position;
}
}
void LateUpdate () {
//If attached to box do not translate do not rotate
if (gameObject.transform.parent != null)
{
transform.rotation = InitRot;
transform.position = InitPos;
}
}
您可以从 here
获得有关此解决方案的更多信息编辑 由于上面的答案不适用于 OP。我弄清楚了实际问题是什么。 OP 的代码非常适合移动箭头,但问题很可能出在他旋转框的位置。
如果他使用 transform.Rotate(Vector3.forward* 90)
旋转框,每个 Update
中的相同旋转量将导致失真,因为每个 Update
中的帧时间不相同。因此,他需要像这样使用 Time.deltaTime
来旋转盒子以实现一致的旋转: transform.Rotate(Vector3.forward* 90*Time.deltaTime);
这会在每个时间间隔内旋转相同的量并消除失真。这些是我用于任务的脚本,对我有用。
箭头脚本:
public float flySpeed = 20f;
private Rigidbody2D arrowBody;
private bool shouldFly;
private Vector2 initPos;
private Quaternion initRot;
// Start is called before the first frame update
void Start()
{
shouldFly = true;
arrowBody = GetComponent<Rigidbody2D>();
//arrowBody.isKinematic = true;
initPos = gameObject.transform.position;
initRot = gameObject.transform.rotation;
}
// Update is called once per frame
void Update()
{
if (shouldFly == true)
{
//make our pin fly
arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
}
if(gameObject.transform.parent == null)
{
initPos = gameObject.transform.position;
initRot = gameObject.transform.rotation;
}
}
void LateUpdate()
{
if (gameObject.transform.parent != null)
{
gameObject.transform.position = initPos;
gameObject.transform.rotation = initRot;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("Collision happened");
if (collision.tag == "target")
{
shouldFly = false;
transform.SetParent(collision.gameObject.transform);
}
else if (collision.tag == "arrow")
{
SceneManager.LoadScene("quickGameOverScene");
}
}
以及旋转盒子的脚本:
public float rotationSpeed = 70f;
void Update()
{
transform.Rotate(Vector3.back, rotationSpeed * Time.deltaTime);
}