1. 程式人生 > 程式設計 >Unity3D實現物體排成弧行

Unity3D實現物體排成弧行

本文例項為大家分享了Unity3D實現物體排成弧行的具體程式碼,供大家參考,具體內容如下

一般用在Pico、HTC、DP等VR裝置中

效果:

Unity3D實現物體排成弧行

完整程式碼:

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),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),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),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);//微調,使得此物體看向正前方,將此行註釋,可以看到明顯區別
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。