unity绕z轴旋转

时间:2019-08-29 19:22:13

标签: c# unity3d

我试图在实例化对象时随机旋转它们。但是我很难仅在z轴上旋转。

GameObject currentcicrle = (GameObject)Instantiate (circlePointPrefab);//instaiate object
currentcicrle.transform.parent = parent;
currentcicrle.GetComponent<Renderer>().material = currentLineRender.GetComponent<LineRendererAttributes> ().material;
currentcicrle.transform.position = position;

currentcicrle.transform.rotation = Random.rotation;

3 个答案:

答案 0 :(得分:3)

currentcircle.transform.rotation = Quaternion.Euler(0.0, 0.0, Random.Range(0.0, 360.0);

currentcircle.Rotate(0.0, 0.0, Random.Range(0.0, 360.0));

请参见Previous Answer

答案 1 :(得分:2)

        currentcicrle.transform.RotateAround(center.position, Vector3.forward, Random.Range(0,360); 

答案 2 :(得分:2)

有几种方法可以实现此目的。 Eric和Kjell的答案已经包含一些答案,为了方便起见,我将在此处包括在内(如果您喜欢这些方法,请对其进行投票),但还将进一步延伸很多。


通过(本地)欧拉设置:

直接但冗长:

transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, Random.Range(0f,360f));

通过“复制,设置,替换”间接:

var angles = transform.localEulerAngles;
angles.z = Random.Range(0f,360f);
transform.localEulerAngles = angles;

直接和简短,通过扩展方法:

扩展库中的某处:

public static class Vector3Extensions {
    public static Vector3 WithZ(this Vector3 vector, float z) {
        vector.z = z;
        return vector;
    }
}

然后,每当需要仅设置Vector3的Z时,请使用扩展方法。在这种情况下:

transform.localEulerAngles = transform.localEulerAngles.WithZ(Random.Range(0f,360f));

变换本身的进一步扩展:

扩展库中的某处:

public static void SetLocalEulerAnglesZ(this Transform transform, float z) {
    transform.localEulerAngles = transform.localEulerAngles.WithZ(z);
}

然后将设置Z简化为:

transform.SetLocalEulerAnglesZ(Random.Range(0f, 360f));

将旋转应用于当前旋转:

旋转或旋转:

对于简单的轴对齐旋转很有用。默认为局部空间(相对于变换),但是第四个Space.World参数可用于绕世界轴旋转。

transform.Rotate(0, 0, Random.Range(0f, 360f));

对于更复杂的旋转很有用,不与本地轴或世界轴对齐。

transform.RotateAround(transform.position, transform.forward, Random.Range(0,360));

当前旋转+欧拉Z旋转:

对于复杂的复合旋转很有用。这里不是这种情况,但是如果要应用的旋转是在应用之前预先计算的一系列子旋转的乘积。四元数彼此相乘。

transform.rotation = transform.rotation * Quaternion.Euler(0, 0, Random.Range(0f, 360f));
相关问题