版權申明:
- 本文原創首發於以下網站:
- 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
- 優夢創客的官方博客:https://91make.top
- 優夢創客的游戲講堂:https://91make.ke.qq.com
- 『優夢創客』的微信公眾號:umaketop
- 您可以自由轉載,但必須加入完整的版權聲明!
目標
- 使用腳本創建不同大小的圓環
- 使用腳本創建多個圓環
- 改變其速度與方向
創建不同大小的圓環
-
我們先在場景里面新建一個GameObject重命名為Disc,把坐標設置到原點(0,0,0),並把Platform底下的腳本去掉,加入到Disc下面,並把Platform腳本打開重命名為Disc,選中創建圓環的代碼,並把它提取出來,提取方法的操作如下圖所示:
- 選中要提取方法的代碼段
- 此時會看見彈出一個方塊
- 點擊方塊,選擇“提取方法”菜單項
-
提取出來后重命名為CreatArch(方便以后打開項目看到后不會忘記),並把代碼修改如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ProBuilder;
public class Disc : MonoBehaviour
{
public Material mat;//圓環的材質
public Transform xRig;//
// Start is called before the first frame update
void Star()
{
CreatArch(8,Random.Range(20,80),0);
}
/// <summary>
/// 創建一個任意大小的圓環
/// </summary>
/// <param name="radius">半徑</param>
/// <param name="deg">角度</param>
/// <param name="rot">初始旋轉(繞y軸)</param>
private void CreatArch(int radius, int deg, int rot)
{
//創建圓環
ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex, deg, radius, 0.5f, 1, 20, true, true, true, true, true);
pbMesh.GetComponent<MeshRenderer>().material = mat;
//使圓環平躺
pbMesh.transform.Rotate(-90, 0, 0);
//設置圓環的父節點,使其繞着父節點公轉(父節點默認創建在原點)
xRig = new GameObject("xRig").transform;
pbMesh.transform.SetParent(xRig,false);
xRig.SetParent(this.transform,false);
}
// Update is called once per frame
void Update()
{
xRig.Rotate(0, 1, 0);
}
}
創建多個圓環
打開Disc腳本,並編寫更改代碼如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ProBuilder;
public class Disc : MonoBehaviour
{
public Material mat;//圓環的材質
public int ArchNum = 3;
// Start is called before the first frame update
void Star()
{
for(int i = 0;i<ArchNum;i++)
{
int avgDeg = 360/ArchNum;//每個圓環占的角度
CreatArch(8,Random.Range(20,80),i*avgDeg);
//攜程
StartCoroutine(ChangeSpeed());
}
}
IEnumerator ChangeSpeed()
{
while (true)
{
yield return new WaitForSeconds(Random.Range(1f, 3f));
rotSpeed = Random.Range(-120, 120);
}
}
/// <summary>
/// 創建一個任意大小的圓環
/// </summary>
/// <param name="radius">半徑</param>
/// <param name="deg">角度</param>
/// <param name="rot">初始旋轉(繞y軸)</param>
private void CreatArch(int radius, int deg, int rot)
{
//創建圓環
ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex, deg, radius, 0.5f, 1, 20, true, true, true, true, true);
pbMesh.GetComponent<MeshRenderer>().material = mat;
//使圓環平躺
pbMesh.transform.Rotate(-90, 0, 0);
//設置圓環的父節點,使其繞着父節點公轉(父節點默認創建在原點)
Transform xRig = new GameObject("xRig").transform;
pbMesh.transform.SetParent(xRig,false);
//設置圓環初始在圓盤的旋轉角度
xRig.Rotate(0,rot,0);
Transform yRig = new GameObject("yRig").transform;
xRig.SetParent(yRig,false);
yRig.SetParent(this.transform,false)
}
// Update is called once per frame
void Update()
{
this.transform.Rotate(0, 1, 0);
}
}
這樣每次啟動游戲我們就能看到場景里有多個圓環了
改變圓環的旋轉速度以及方向
打開我們的Disc腳本,並添加一個共有變量名為(float類型)rotSpeed = 90,並修改我們Update里面的代碼,然后添加一個攜程,如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ProBuilder;
public class Disc : MonoBehaviour
{
public Material mat;//圓環的材質
public int ArchNum = 3;
public float rotSpeed = 90;
// Start is called before the first frame update
void Star()
{
for(int i = 0;i<ArchNum;i++)
{
int avgDeg = 360/ArchNum;//每個圓環占的角度
CreatArch(8,Random.Range(20,80),i*avgDeg);
}
}
/// <summary>
/// 創建一個任意大小的圓環
/// </summary>
/// <param name="radius">半徑</param>
/// <param name="deg">角度</param>
/// <param name="rot">初始旋轉(繞y軸)</param>
private void CreatArch(int radius, int deg, int rot)
{
//創建圓環
ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex, deg, radius, 0.5f, 1, 20, true, true, true, true, true);
pbMesh.GetComponent<MeshRenderer>().material = mat;
//使圓環平躺
pbMesh.transform.Rotate(-90, 0, 0);
//設置圓環的父節點,使其繞着父節點公轉(父節點默認創建在原點)
Transform xRig = new GameObject("xRig").transform;
pbMesh.transform.SetParent(xRig,false);
//設置圓環初始在圓盤的旋轉角度
xRig.Rotate(0,rot,0);
Transform yRig = new GameObject("yRig").transform;
xRig.SetParent(yRig,false);
yRig.SetParent(this.transform,false)
}
// Update is called once per frame
void Update()
{
this.transform.Rotate(0, rotSpeed*Time.deltaTime, 0);
}
}