Я действительно запутался в том, что вы пытаетесь сделать.Я не понимаю, хотите ли вы заморозить вращение или движение, поэтому я опубликую ответы на оба вопроса.Чтобы предотвратить перемещения и повороты, вызванные родительским объектом, вы можете использовать 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;
}
}
. Более подробную информацию об этом решении можно получить по адресу здесь
* 1008.*
РЕДАКТИРОВАТЬ Так как ответ выше не сработал для ОП.Я понял, в чем проблема.Код ОП отлично подходит для перемещения стрелки, но проблема, скорее всего, в том, где он вращает коробку.
Если он вращает коробку с помощью 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);
}