Unity學習筆記(05):struct結構體、常用幾何體及3D模型導入、FBX模型導入

七、struct結構體

🚩get訪問器和set訪問器

必須實現訪問器才能實現讀寫的功能

value指的是外部傳入的值 在set訪問器裏使用value來統一替代

class Person
{
    int my_age;
    int sex;

    public int age
    {
        get { // 讀訪問器
            return this.my_age;
        }

        set { // 寫訪問器
            this.my_age=value;
        }
    }
}

public class game_scene : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Person p=new Person();
        p.age=10;
        Debug.Log(p.age);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

若想讓其只讀 只需將set訪問器刪除即可
同樣 若想讓其只寫 只需將get訪問器刪除即可

訪問器同樣可以擁有權限修飾符

🚩struct結構體

傳結構體 傳的是值 而不是引用

struct Dog
{
	string name;
	int age;
}

和引用類型不同 定義dog的時候 是定義了一個局部變量 是一個結構體值 會完整地在棧上分配出該結構體的內存
簡單來說 就是結構體的變量定義在哪 那麼結構體的內存就分配在哪
結構體定義在類裏面 那麼結構體的內存就分配在該類中

Dog dog;

但是 若是引用類型的話 那麼只是用於存放引用地址

struct Dog
{
    public string name;
    public int age;
}

若結構體的屬性爲public 那麼可以直接訪問該屬性 而不需要訪問器

Dog dog;
dog.name = "汪汪";
dog.age = 2;

因爲內存已經分配出來了 結構體變量定義在哪 那麼內存就分配在哪
結構體除了有數據成員 還可以有成員函數

public void setDog(string name,int age)
{
	this.name = name;
	this.age = age;
}

在結構體中 不能重載默認的無參構造函數
結構體若沒有重載默認的構造函數 那麼系統會自動生成默認的構造函數
默認的構造函數就會將每個數據成員賦值爲0

結構體也可以有帶參數的構造函數

struct Dog
{
    public string name;
    public int age;

    public Dog(string name,int age)
    {
        this.name = name;
        this.age = age;
    }
}

Dog dog = new Dog("汪汪", 2);
Debug.Log(dog.name+" - "+dog.age);

結構體不允許使用未初始化的數據成員

總而言之 結構體的new 和 class的new完全是兩碼事 不要記混淆了
類的new會在堆上分配內存 但是 結構體的new不會在堆上分配內存 而是使用原來的內存來調用對應的構造函數

傳值和傳引用是有區別的

傳入引用 那麼在函數內部修改 在外面也會修改
若傳入的是值 那麼在函數內部修改了 在外面是不變的 這樣需要在棧中複製一份值 不夠高效
結構體也是值 不要看着像是引用 就認爲是引用了

ref關鍵字 傳入引用

爲了提高效率 可以結構體參數傳引用
使用ref關鍵字即可

// 結構體默認傳的是值 裏面修改了 外面不會改變
public void setPointValue(Dog dog)
{
	dog.name = "狗";
	dog.age = 1;
}

// 結構體傳引用 裏面修改了 外面會改變
public void setPointValue(ref Dog dog)
{
	dog.name = "狗";
	dog.age = 1;
}

ref和out不一樣 out是從函數內將值帶出來 但在調用的時候並不會爲其分配任何實例
而ref的意思是 是傳入的時候不是傳值 而是傳入引用

🚩查看Unity代碼接口

Unity是不開放源碼的 若有些接口記不住 那麼可以鼠標雙擊類 然後F12 即可進入函數
在函數內還可以繼續F12 繼續深入查看定義的所有接口

若有些接口只有get 那麼是隻讀的 此時就不能爲賦值

部分函數是多態的 編譯器不知道要進入哪一種 此時無法直接F12進入
此時可以先進入該函數所在的類 然後再從類中進入

八、幾何體及3D模型導入

🚩常用幾何體

  • 平面 - plane
  • 立方體 - cube
  • 球體 - sphere
  • 膠囊體 - capsule
  • 圓柱體 - cylinder
  • 3D文字 - 3Dtext

在場景中 每格的大小是1m
在這裏插入圖片描述
在這裏插入圖片描述

🚩材質

創建一個材質

創建一個文件夾用於存放材質
在這裏插入圖片描述
create -> material 創建一個材質球

Shader設置着色類型
mobile的diffuse較爲常用
在這裏插入圖片描述
Albedo是物體的靜態材質 可以改變貼圖的疊加顏色
在這裏插入圖片描述
將材質圖片放入resources目錄下 然後點擊小圓點 即可選擇材質了
在這裏插入圖片描述
將材質球拖入 即可改變着色了:
在這裏插入圖片描述
Metallic調整材質的光照強度
在這裏插入圖片描述
mobile的diffuse就沒有這麼多可調整的屬性了
standard是鏡面反射 diffuse是漫反射
mobile的diffuse使用的是貼圖的本色 此時性能上會更加好
在這裏插入圖片描述

🚩材質的offset和tiling

材質所對應的紋理圖上有這些屬性:
在這裏插入圖片描述
wrap mode的repeat屬性 即 當圖片大小小於平面大小時 重複平鋪
wrap mode的clamp屬性 即 當圖片大小小於平面大小時 橫着拉伸 此時只有一塊圖片

當movile/diffuse模式時 有兩個參數:
Tiling是材質要鋪多少塊 當x=1 y=1 那麼只鋪一塊 就會全部拉伸
在這裏插入圖片描述
若x=2 y=1 則在x軸上會平鋪兩塊
在這裏插入圖片描述
Filter Mode:
貼圖的紋理可以隨意拉伸 此時同樣一張圖要貼的時候 拉伸大小也不一樣
此時的拉伸算法 就是Filter Mode
使得放大縮小更平滑
在這裏插入圖片描述

🚩FBX模型導入

各大工具導入到Unity是有一定的模型比例
基本是3DMax導入到Unity

FBX是一種模式 因其模型和動畫的配合較好 因此基本都是使用該格式
裏面有模型數據:
在這裏插入圖片描述
在這裏插入圖片描述
FBX存儲的有三種數據:

  • 1、模型頂點座標
  • 2、模型材質的紋理座標
  • 3、模型動畫

導入方式

在resources下新建一個文件夾 比如car代表汽車
然後將素材放入文件夾中:
在這裏插入圖片描述
Unity3D會自動生成材質:
在這裏插入圖片描述
模型數據:
在這裏插入圖片描述
將其拖入場景中:
在這裏插入圖片描述
若出現貼圖異常 還可自己給材質球關聯貼圖:
在這裏插入圖片描述
在這裏插入圖片描述
在模型節點下面可能還會有其他子節點:
當節點與模型相關 會字體顯示藍色
可以與模型斷開 字體恢復白色:導航欄GameObject -> Break Prefab Instance
在這裏插入圖片描述
還可以手動關聯材質:在這裏插入圖片描述
若很多不規範的材質 那麼只能手動導入了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章