Как вращать два игровых объекта вместе?

У меня есть игра, в которой вам нужно вращать часы. Я не могу понять, как вращать две или более стрелки часов вместе. Стрелки не на одинаковых часах. Стрелки имеют разные повороты, и они должны сохранять свои разности вращения. 180 еще 90, так что после поворота на 90 градусов первый должен быть 270, а другой 180. Вот мой код:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MoveClock : MonoBehaviour
{

public GameObject root;
public Transform arrow;
public CircleCollider2D circleCollider;
public BoxCollider2D boxColliderTrigger;
public List<MoveClock> connectedClocks;
public GameManger gameManager;
public BoxCollider2D[] colliders;
public int n;
public BoxCollider2D[] disabledTriggers;
public bool equal;
const float initialValue = 90;
static public int k;

public float angle;
public float snapAngle;
public float dif;
public Vector3 mousepos;
public Vector3 dir;
public int[] zAngles;
void Start()
{
    zAngles = new int[n];
    SetAngles();
    CalculateDiffrence();
}
void Update()
{
}
public void MoveArrow(out float snapAngle)
{
    snapAngle = 0;
    if (Input.GetMouseButton(0))
    {
        mousepos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        dir = transform.position - mousepos;
        angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + initialValue;
        transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        snapAngle = SnapAngle(angle);
        SetAngleTo(angle);
    }
}
private void SetAngles()
{
    int angle = 360 / n;
    for (int i = 0; i < n; i++)
    {
        zAngles[i] = angle * i;
    }
}
private float SnapAngle(float target)
{
    float minDiffrence = float.MaxValue;
    float closest = float.MaxValue;
    for (int i = 0; i < zAngles.Length; i++)
    {
        float diff = Mathf.Abs(zAngles[i] - target);
        if (minDiffrence > diff)
        {
            minDiffrence = diff;
            closest = zAngles[i];
        }
    }
    return closest;
}
public void SetAngleTo(float a)
{
    for (int i = 0; i < connectedClocks.Count; i++)
    {
        if(equal==true)
            connectedClocks[i].arrow.rotation = Quaternion.AngleAxis(a, Vector3.forward);
        else
            connectedClocks[i].arrow.rotation = Quaternion.AngleAxis(a + connectedClocks[i].dif, Vector3.forward);
    }
}
public void CalculateDiffrence()
{
    for (int i = 0; i < connectedClocks.Count; i++)
    {
        Vector3 dir = connectedClocks[i].transform.position - transform.position;
        dir = connectedClocks[i].transform.InverseTransformDirection(dir);
        dif = SnapAngle(Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg+initialValue);
        Debug.Log(string.Format("{0} {1}", dif, connectedClocks[i].circleCollider.name));
    }
}
}

1 ответ

Просто поместите один из объектов как дитя другого, что подойдет.

A         //or   B
|__B      //     |__A

Или программно:

A.transform.parent = B.transform; //or
A.transform.SetParent(B.transform);

В этой настройке, если вы поворачиваете A на любые углы, B будет следовать, и нет необходимости вычислять и сохранять их угловую разницу в коде.

Другие вопросы по тегам