欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

unity之3D场景人物呈圆形均匀排列

  |   评论   |   浏览

前言

最近开始接触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); } } }

项目路径:https://gitee.com/shirln/circle-shape


标题:unity之3D场景人物呈圆形均匀排列
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2022/06/23/1655973668885.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发

Gitalking ...