寫在前面
寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。這里只有部分語法知識。
九、父子關系
1、獲取、設置父對象
(1)獲取父對象
可以通過this.transform.parent獲取當前對象的父對象Transform組件,通過this. transform. parent. name直接獲取父對象名稱
void Start(){print(this.transform.parent.name);}
輸出:?
(2)設置父對象?
若是要“斷絕父子關系”,移除父對象
可以直接賦空:this.transform.parent = null
或者使用API:this.transform.SetParent(null)
執行效果如下:
設置父子關系,同樣的使用API:
this.transform.SetParent(GameObject.Find("father").transform);
直接在SetParent()中傳入目標對象的transform即可。這里需要提SetParent()的第二個參數,第二個參數為worldPositionStays
如果填true:?保持世界坐標(默認)
如果填false:直接采?本地坐標?
現在看一個示例:當前目標父對象transform信息為
?子對象(還未掛到父對象下)信息為:
運行代碼:
void Start(){this.transform.SetParent(GameObject.Find("father").transform,true);}
子對象當前信息如下,可見原世界信息沒有改變,inspector信息修改為了與父對象的相對信息
如果運行代碼為:
void Start(){this.transform.SetParent(GameObject.Find("father").transform,false);}
?子對象當前信息如下,inspector信息沒變:
但解開父子關系后,子對象世界信息發生改變:
?2、獲取、設置子對象
(1)移除所有子對象
使用this.transform.DetachChildren()斷絕與所有直接子對象的關系,不影響孫子對象;所有?對象變為場景根節點的子對象,位置/旋轉/縮放保持原世界坐標值
例如,這是原來的關系:
執行:
void Start(){this.transform.DetachChildren();}
(2)獲取子對象
按名查找:使?this.transform.Find("子對象名"),可以找到失活對象
獲取子對象數量:this.transform.childCount
按索引獲取子對象:this.transform.GetChild(索引),索引超范圍會報錯
如下例,此時有11個子對象:
我們可以查找里面任意一個子對象,也可以直接遍歷輸出子對象的名字:?
void Start()
{print(this.transform.Find("son").name);for(int i = 0; i < this.transform.childCount;i++){print(this.transform.GetChild(i).name);}
}
?部分輸出:
3、兒子的操作
這些都是固定的API,記住即可?
(1)判斷當前對象是否是自己的父對象
使用this.transform.IsChildOf()判斷當前對象是否是另?個對象的子對象。參數傳入父對象的transform。返回值是bool值。
public Transform son;void Start(){print(son.transform.transform.IsChildOf(this.transform));}
(2)編號相關?
可以用GetSiblingIndex()獲得自己作為兒子的編號,SetAsFirstSibling()將當前對象設置為第一個兒子
void Start()
{print(son.GetSiblingIndex());son.SetAsFirstSibling();
}
?運行結果:
?除此之外,還可以將自己設置為最后一個兒子、設置為指定編號的兒子:
son.SetAsLastSibling();son.SetSiblingIndex(5);
?需要注意的是,編號超出范圍自動設置為最后一個兒子。
十、 坐標轉換
1、世界坐標系轉本地坐標系
世界坐標系轉本地坐標系,可以幫助我們大概判斷相對位置
(1)世界坐標系的點轉換為相對本地坐標系的點
該轉換方式受縮放影響。一般來講,當立方體縮放為(2,2,2)時,轉換結果會縮小為原值的1/2;縮放為(0.5,0.5,0.5)時,結果會放大為原值的2倍。
void Start()
{print(Vector3.forward);print("轉換后的點:" + this.transform.InverseTransformPoint(Vector3.forward));
}
這里由于掛載的對象位置坐標就是?001,因此Vector3.forward以當前對象坐標為原點建立坐標系時,轉換后為000
(2)世界坐標系的方向轉換為相對于本地坐標系的方向
有受縮放影響和不受縮放影響,如下:
void Start()
{//不受print("轉換后的方向:" + this.transform.InverseTransformDirection(Vector3.forward));//受print("受縮放影響轉換后的方向:"+this.transform.TransformVector(Vector3.forward));
}
2、本地坐標系轉世界坐標系
(1)本地坐標系的點轉換為相對世界坐標系的點
受縮放影響
void Start()
{print(Vector3.forward);print("轉換后的點:" + this.transform.TransformPoint(Vector3.forward));
}
(2)本地坐標系的方向轉換為相對于世界坐標系的方向
有受縮放影響和不受縮放影響,如下:
void Start()
{print("轉換后的方向:"+this.transform.TransformDirection(Vector3.forward));print("受縮放影響轉換后的方向:" + this.transform.TransformVector(Vector3.forward));
}
十一、input輸入相關
1、檢測鼠標
(1)鼠標在屏幕上的位置
屏幕坐標的原點在屏幕的左下角, 往右是x軸正方向,往上是y軸正方向。屏幕是2D的,不存在z軸,所以z軸一直都是0。獲取鼠標位置使用Input.mousePosition
void Update(){print(Input.mousePosition);}
當鼠標一直在屏幕上動時,就會打印出鼠標位置:
(2)檢測鼠標輸入
鼠標的按鍵編號是:0代表左鍵、1代表右鍵、3代表中鍵。
若是想進行按下檢測,也就是鼠標按下的一瞬間 進入,需要使用:Input.GetMouseButtonDown() ,里面傳入0、1、2就可以分別檢測左鍵、右鍵、中鍵
void Update(){if(Input.GetMouseButtonDown(0)){print("鼠標左鍵按下");}}
若是想進行抬起檢測,也就是鼠標抬起的一瞬間 進入,需要使用:Input.GetMouseButtonUp()
void Update()
{if(Input.GetMouseButtonUp(1)){print("鼠標右鍵抬起");}
}
鼠標長按按下抬起都會進入,當按住按鍵不放時,會一直處于這個判斷
void Update()
{if(Input.GetMouseButton(0)){print("鼠標左鍵長按");}
}
以上需要注意的是,?Down/Up只在動作發?的瞬間觸發?次,長按會一直處于這個判斷,不停打印。?
最后是中鍵滾動,使用Input.mouseScrollDelta可以獲取中鍵滾動的Vector2值。
中鍵滾動改變y值,若是0就是未滾動狀態,向上滾動為正,向下滾動為負
print(Input.mouseScrollDelta);
2、檢測鍵盤
鍵盤同樣有三種狀態、按下、抬起、長按。
(1)鍵盤按下
檢測鍵盤按下方式為:Input.GetKeyDown(),推薦傳入枚舉參數為KeyCode.W,這個枚舉參數指的就是鍵盤按鍵w
還可以直接傳入要檢測的按鍵字符,不能傳入大寫字符串,只能傳入小寫字符串。例如直接傳入“q”無論用戶按下的是大寫Q還是小寫q都能正常檢測。
void Update()
{if(Input.GetKeyDown(KeyCode.W)){print("W按下");}if(Input.GetKeyDown("q")){print("Q按下");}
}
(2)鍵盤抬起
檢測鍵盤抬起方式為:Input.GetKeyUp()
void Update()
{if(Input.GetKeyUp(KeyCode.W)){print("W抬起");}
}
(3)鍵盤長按
void Update()
{if(Input.GetKey(KeyCode.S)){print("S長按");}
}
3、檢測默認軸輸入
由于常用的鍵盤輸入就是awsd進行上下左右移動,以及橫縱向移動鼠標調整位置或是視角。因此Unity內置了默認軸輸入相關的便捷方法。
其原理是:將輸?映射到?字坐標系,左/下為負值(-1到0),右/上為正值(0到1),中心點為0。
使用的方法是GetAxis,其中GetAxis有漸變,GetAxisRaw沒有漸變(只有0,-1, 1,沒有0~1或是0~-1的過程)
(1)鍵盤AD
使用參數Horizontal,當按A鍵時,就會輸出0~-1之間的數,一直長按會輸出-1;當按D鍵時,就會輸出0~1之間的數,一直長按會輸出1
void Update()
{print(Input.GetAxis("Horizontal"));
}
(2)鍵盤SW
使用參數Vertical,當按S鍵時,就會輸出0~-1之間的數,一直長按會輸出-1;當按W鍵時,就會輸出0~1之間的數,一直長按會輸出1
void Update()
{print(Input.GetAxis("Vertical"));
}
(3)鼠標橫向移動
使用參數Mouse X,當鼠標向左移動時,就會輸出0~-1之間的數;當向右移動時時,就會輸出0~1之間的數
void Update()
{print(Input.GetAxis("Mouse X"));
}
(4)鼠標縱向移動
使用參數Mouse Y,使用參數Mouse X,當鼠標向下移動時,就會輸出0~-1之間的數;當向上移動時時,就會輸出0~1之間的數
void Update()
{print(Input.GetAxis("Mouse Y"));
}
4、任意鍵
可以檢測是否有任意鍵或鼠標長按:Input.anyKey
是否有任意鍵或鼠標按下:Input.anyKeyDown
得到這一幀的鍵盤輸入:InputString
void Update()
{if(Input.anyKey){print("有一個鍵長按");}if(Input.anyKeyDown){print("有一個鍵按下(只打印一次)");print(Input.inputString);}
}
5、手柄輸入相關
//得到連接的手柄的所有按鍵名字string[] strs = Input.GetJoystickNames();//某一個手柄鍵按下if(Input.GetButtonDown("Jump")){}//某一個手柄鍵抬起if (Input.GetButtonUp("Jump")){}//某一個手柄鍵長按if (Input.GetButton("Jump")){}
6、移動設備觸摸相關
移動設備觸摸一般在UI里完成,這里用的很少
if(Input.touchCount>0){Touch t1 = Input.touches[0];//位置print(t1.position);//相對上次位置的變化print(t1.deltaPosition);}
是否啟用多點觸控
Input.multiTouchEnabled = false;
7、陀螺儀(重力感應)
例如,滾小球游戲就會用到
是否開啟陀螺儀:
Input.gyro.enabled = true;
一些靜態變量:
//重力加速度向量
print(Input.gyro.gravity);//轉速
print(Input.gyro.rotationRate);//當前旋轉的四元數
print(Input.gyro.attitude);
十二、屏幕相關
1、靜態屬性
(1)常用
獲取當前屏幕分辨率:
通過Screen.currentResolution獲取,獲取的是設備物理分辨率
返回值類型:Resolution結構體,包含width(寬)、height(?)和refreshRate(刷新率)
void Start()
{Resolution r = Screen.currentResolution;print("當前設備的物理分辨率的寬:"+r.width+"高"+r.height+")");
}
屏幕窗口當前寬高:
獲取的是當前游戲窗口的實際顯示尺寸,會隨窗口大小變化,更適合用于游戲內UI布局和位置計算
void Start()
{print(Screen.width);print(Screen.height);
}
屏幕休眠模式:
通過Screen.sleepTimeout設置,其中SleepTimeout.NeverSleep:? 永不息屏;??????SleepTimeout.SystemSetting:?? 使?系統設置
void Start()
{Screen.sleepTimeout = SleepTimeout.NeverSleep;Screen.sleepTimeout = SleepTimeout.SystemSetting;
}
(2)不常用
下面的都不常用,在開發時一般不在這里用代碼設置,了解即可
運行時是否全屏模式
Screen.fullScreen = true;
窗口模式,共有四種:
//獨占全屏
Screen.fullScreenMode= FullScreenMode.ExclusiveFullScreen;
//全屏窗口
Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
//最大化窗
Screen.fullScreenMode = FullScreenMode.MaximizedWindow;
//窗口模式
Screen.fullScreenMode = FullScreenMode.Windowed;
移動設備屏幕轉向相關
允許自動旋轉為左橫向、右橫向、豎向、倒置豎向
//允許自動旋轉為左橫向 Home鍵在左
Screen.autorotateToLandscapeLeft = true;//允許自動旋轉為右橫向 Home鍵在右
Screen.autorotateToLandscapeRight = true;//允許自動旋轉為上橫向 Home鍵在上
Screen.autorotateToPortraitUpsideDown = true;//允許自動旋轉為下橫向 Home鍵在下
Screen.autorotateToPortrait = true;
2、靜態方法
設置分辨率,一般移動設備不用,三個參數分別為:寬、高、是否全屏
Screen.SetResolution(1920, 1080, true);