Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将两个游戏对象一起旋转?_C#_Unity3d_2d Games - Fatal编程技术网

C# 如何将两个游戏对象一起旋转?

C# 如何将两个游戏对象一起旋转?,c#,unity3d,2d-games,C#,Unity3d,2d Games,我有一个游戏,你需要旋转时钟。我不知道如何一起旋转两个或多个时钟箭头。箭头不在同一个时钟上。箭头有不同的旋转,它们必须保持它们的旋转差异。例如,一个箭头是180,另一个90度旋转后,第一个箭头应该是270,另一个是180。这是我的代码: using UnityEngine; using System.Collections; using System.Collections.Generic; public class MoveClock : MonoBehaviour { public Ga

我有一个游戏,你需要旋转时钟。我不知道如何一起旋转两个或多个时钟箭头。箭头不在同一个时钟上。箭头有不同的旋转,它们必须保持它们的旋转差异。例如,一个箭头是180,另一个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));
    }
}
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类移动时钟:单一行为
{
公共游戏对象根;
公共转换箭头;
公共环路集线器2D环路集线器;
公共BoxCollider2D BoxColliderRigger;
公共列表连接时钟;
公共游戏经理游戏经理;
公共BoxCollidater2D[]对撞机;
公共int n;
public BoxCollized R2D[]禁用的装配工;
公共利益平等;
常量浮点初始值=90;
静态公共int k;
公共浮动角度;
公共浮动捕捉角;
公共浮动dif;
公共矢量3鼠标;
公共向量3 dir;
公共卫生服务;
void Start()
{
zAngles=新整数[n];
设置角度();
计算偏差();
}
无效更新()
{
}
公共空心移动箭头(向外浮动捕捉角)
{
snapAngle=0;
if(输入。GetMouseButton(0))
{
mousepos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
dir=transform.position-鼠标点;
角度=数学Atan2(方向y,方向x)*数学Rad2Deg+初始值;
transform.rotation=四元数.AngleAxis(角度,矢量3.向前);
snapAngle=snapAngle(角度);
设置角度到(角度);
}
}
私有无效设置角度()
{
内倾角=360/n;
对于(int i=0;idiff)
{
minDiffrence=diff;
最近的=赞格斯[i];
}
}
返回最近的位置;
}
公共无效设置角度到(浮动a)
{
对于(int i=0;i
只需将一个对象作为另一个对象的子对象即可

A         //or   B
|__B      //     |__A
或以编程方式:

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

在此设置中,如果将A旋转任意角度,B将跟随,无需在代码中计算并保持它们的角度差。

在编辑器中,作为对象之间的父对象,这样做可能更容易。这样,您就可以调整箭头的变换,而不会影响其他箭头。但是,如果你旋转时钟,箭头也会随之移动。你使用的是全局空间还是局部空间?谢谢,我会试试。我可能总是想得太多了,不能说箭头在不同的时钟上