Unity3D实现物体排成弧行
作者:SandmanRUN 发布时间:2022-10-15 12:23:06
标签:Unity3D,弧行
本文实例为大家分享了Unity3D实现物体排成弧行的具体代码,供大家参考,具体内容如下
一般用在Pico、HTC、DP等VR设备中
效果:
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CanvasPositionManager : MonoBehaviour
{
private float radius = 700f;//圆的半径
private int numberOfObjects;//每行排列多少个物体
private int theChildCount;//需要排列的物体的总个数
private void Awake()
{
if (this.transform.name == "GGKFTherUIP")//这里可以忽略,是我自己的需求,根据不同场景中的物体名字决定一行排列多少个
{
numberOfObjects = 5;
}
else
{
numberOfObjects = 10;
}
theChildCount = this.transform.childCount;//物体总个数就是当前物体下的子物体的个数
GerCurP(this.transform);//排列
}
private void Start()
{
}
/// <summary>
/// 半圆排列
/// </summary>
/// <param name="trans"></param>
public void GerCurP(Transform trans)
{
if (theChildCount <= numberOfObjects)//如果总个数小于等于一行的个数,那只需要排列一行
{
print("个数不超过十个");
for (int i = 0; i < trans.childCount; i++)
{
float angle = i * Mathf.PI/ numberOfObjects;//根据每个物体(i)乘圆周率(Π)
Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
this.transform.GetChild(i).position = pos;
}
}
else
{
print("个数!!!超过十个");
int temp = trans.childCount / numberOfObjects;//行数(伪行数)
int tempNumber;//记过下边的if else计算,得出真正所需的行数(真行数)
float highUp = 0;
if (temp % numberOfObjects == 0)
{
tempNumber = temp;
}
else//对10取余不为零,补一行
{
tempNumber = temp + 1;
}
Debug.Log("总共有几行" + tempNumber);
//排列思路:(我的每个物体高度是200)第一行排在-200,然后每行依次+200,最后一行排在第一行下边也就是-400,这样开起来比较居中。因为排列太多行会看不清楚内容,所以一般五六行就够了,所以采用比较固(僵)定(硬)的排列方式,可以根据自己需求更改。
for (int i = 0; i < tempNumber; i++)//循环几列
{
if (i == tempNumber - 1)//最后一行Y坐标需要排在第一行的下边(固定值,-400位置)
{
for (int j = (numberOfObjects * i); j < trans.childCount; j++)//最后一行的头到最终末尾
{
if (j >= (numberOfObjects * i) && j < trans.childCount)
{
float angle = (j - (numberOfObjects * i)) * Mathf.PI/ numberOfObjects;//每行的每个点占圆周率的比例
print(angle);
Vector3 pos = new Vector3(-Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;//对angle取余弦和正弦值再乘以半径获得当前物体在的坐标
this.transform.GetChild(j).position = new Vector3(pos.x, pos.y - 400, pos.z);//坐标赋值
}
}
}
else
{
for (int j = (numberOfObjects * i); j < numberOfObjects * (i + 1); j++)//每行的开头到当前行的末尾
{
if (j >= (numberOfObjects * i) && j < numberOfObjects * (i + 1))
{
float angle = (j - (numberOfObjects * i)) * Mathf.PI/ numberOfObjects;//
print(angle);
Vector3 pos = new Vector3(-Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
this.transform.GetChild(j).position = new Vector3(pos.x, pos.y + highUp - 200, pos.z);
}
}
}
highUp += 200;
}
}
}
}
调整所有对象的朝向(每个物体都挂载)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testSortUI : MonoBehaviour {
private Transform centralPoint;//这个是圆的中心点
private void Start()
{
centralPoint = GameObject.FindGameObjectWithTag("contralpoint").transform;
this.transform.forward = this.transform.position - centralPoint.up;//所有物体看向圆心
this.transform.localEulerAngles = new Vector3(0, this.transform.localEulerAngles.y, this.transform.localEulerAngles.z);//微调,使得此物体看向正前方,将此行注释,可以看到明显区别
}
}
来源:https://blog.csdn.net/SandmanRUN/article/details/108444764
0
投稿
猜你喜欢
- 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。下面我们以水果为例,首先定
- 一. 项目需求我们做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的开源框架,最常见的就是mycat,shar
- 看到某些App里面有读取联系人的功能,然后自己尝试了一下。发现这个挺简单的。然后自己就做了一个demo给大家,希望借这个demo可以让大家学
- MyBatis在注解上使用动态SQL1、用script标签包围然后像xml语法一样书写@Select({"<script&g
- spring 多文件配置:1、properties文件2、YAML文件一、properties文件在 Spring Boot 中, 多环境配
- 前言:List 去重指的是将 List 中的重复元素删除掉的过程。此题目考察的是对 List 迭代器、Set 集合和 JDK 8 中新特性的
- 前言前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。要实现类似
- 大致分为以下几个方面:一些查询指令整理使用SQL语句进行特殊查询检测表字段是否存在数据库升级数据库表字段赋初始值一、查询指令整理1.链式执行
- 前言日志接口(slf4j)slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具
- 方法一、利用控件或窗体的Paint事件中的PainEventArgs在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEve
- 一、项目需求二、项目思路1、菜单制作2、中奖号码生成 getNumber (随机数 Math.random)3、购买号码和中奖号码比对 生成
- 简述在学着使用Java的命令行来编译java文件的时候,遇到了这个问题Windows操作系统报错“‘
- Kotlin的控制流与其他语言一样,顺序,分支,循环顺序语句就不多说,分支有两种,if-else和when(类似于Java中的switch)
- SpringAOP 通过JoinPoint获取参数名和值在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失
- 这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别今天就和大家一起深入
- 1、什么是 IOC?IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。传统的创建对象的方法是直
- 当一个结合中想根据某一个字段做去重方法时使用以下代码IQueryable 继承自IEnumerable先举例:#region linq to
- 一个专门实现访问sql server数据库增删改查的操作代码,分享给大家,具体内容如下using System;using System.C
- 最近有很多同学,竟然不知道如何使用Intellij IDEA打开Java项目并启动现在来讲一下,希望不要忘记了 1、打开IDEA开机页面 M
- 文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如:google