七、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
還可以手動關聯材質:
若很多不規範的材質 那麼只能手動導入了