Unity經典案例之:Fire Balls 多個圓環以及圓環的變速變向


版權申明:

  • 本文原創首發於以下網站:
  1. 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
  2. 優夢創客的官方博客:https://91make.top
  3. 優夢創客的游戲講堂:https://91make.ke.qq.com
  4. 『優夢創客』的微信公眾號: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);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM