前言
最近开始接触3D游戏,现在有个3D场景需求是这样的:需要让8个玩家围城一个圈,均匀站列,看向圆心,如下图:
初步尝试
在Hierarchy面板创建一个父节点,用于承载生成的8个玩家,在Scene场景中,拖动并旋转每个玩家,使其尽可能呈相同间隔展示出来。运行发现,肉眼的偏差显而可见。因此,还是借助公示计算更加方便可靠。
再次尝试
首先使用角度计算公式,计算出每个玩家的角度间隔值:
//算出物体间隔角度
float angle = i * Mathf.PI * 2 / numberOfObjects;
使用Instantiate实例化出8个玩家的模型:
//实例化生成物体
Instantiate(prefab, pos, Quaternion.identity);
在Game模式下可以看到界面的显示如下图:每个玩家间隔相同角,呈圆形显示。
完整代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CircleShape : MonoBehaviour {
public GameObject prefab;//预制体
public int numberOfObjects = 8; //物体总数
public float radius = 5f; //圆圈半径
void Start()
{
for (int i = 0; i < numberOfObjects; i++)
{
//算出物体间隔角度
float angle = i * Mathf.PI * 2 / numberOfObjects;
//利用三角函数求位置
Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
//实例化生成物体
Instantiate(prefab, pos, Quaternion.identity);
}
}
}
最终尝试
使用Unity自带的3D模型时,看上去完美,无可挑剔。当换上真正的游戏模型时,是这样的。
因为人物模型有正面背面的区别,会导致朝向不是朝着圆心的,因此我们需要改变玩家模型朝向:
设置旋转角度
go.transform.localEulerAngles = new Vector3(0,(i-1)*(360/numberOfObjects),0);
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CircleShape : MonoBehaviour {
public GameObject prefab;//预制体
public int numberOfObjects = 8; //物体总数
public float radius = -1.2f; //圆圈半径
void Start()
{
for (int i = 0; i < numberOfObjects; i++)
{
//算出物体间隔角度
float angle = i * Mathf.PI * 2 / numberOfObjects;
//利用三角函数求位置
Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
//实例化生成物体
GameObject go = Instantiate(prefab, pos, Quaternion.identity);
go.transform.localEulerAngles = new Vector3(0,(i-1)*(360/numberOfObjects),0);
}
}
}