學習https://blog.csdn.net/VRunSoftYanlz/article/details/78881752
1.Component類
gameObject:組件附加的游戲對象。組件總是被附加到游戲對象上
transform:附加到此游戲對象Transform組件
tag:游戲對象的標簽
collider:附加到此游戲對象的collider組件
renderer:附加到此游戲對象的Renderer組件
rigidbody:附加到此游戲對象的Rigidbody組件
GetComponent:如果游戲對象有附加type組件,則返回
GetComponentInChildren:返回此游戲對象上type類型的組件或任何他的子對象,使用深度優先搜索
GetComponents:返回此游戲對象type類型的所有組件
GetComponentsInChildren:返回此游戲對象與其子對象所有type類型的所有組件
2.GameObject類
通過tag獲取游戲物體
static GameObject FindWithTag(string tag)
通過名字獲取游戲物體
static GameObject Find(string name)
常用屬性和方法
tag:游戲物體的tag
name:游戲物體的name
FindGameObjectWithTag(string tag):靜態方法,返回所有tag標識的物體,返回值是個數組
T GetComponent<T>():泛型實例方法,得到T類型的組件
SetActive(bool Value):實例方法,設置游戲物體是否是活動的
FindWithTag(string tag):靜態方法,得到tag標識的游戲物體
3.Transform類
負責游戲對象的變換(位置,旋轉,縮放)
維持父子關系
常用屬性
position:世界坐標系中的transform位置
localPosition:相對於父物體的位置
eulerAngles:歐拉角,旋轉的角度
rotation:世界坐標系中的變換的四元數
parent:物體父物體的Transform組件
root:物體最高層次父物體的Tranform組件
常用方法
void Translate(Vector3 translation):使當前對象朝translate
void Rotate(Vector3 eulerAngles):按給定的歐拉角旋轉
void Rotate(Vector3 point, Vector3 axis, float angle): 繞point點沿axis軸旋轉angle度
Transform Find(string name):通過名字查找子物體
void LookAt(Transform target):使物體朝向target點
4.Vector3類
點乘,又乘點積或內積
(x1,y1,z1)*(x2,y2,z2) = x1*x2+y1*y2+z1*z2
幾何意義:a*b = |a|*|b|*cos<a,b>
API: float dot = Vector3.Dot(Va, Vb);
點乘應用:
對於標准化過的向量, 點乘結果對於兩向量夾角的余弦值
float dot = Vector3.Dot(a.normalized, b.normalized);
float angle = Mathf.Acos(dot)*Mathf.Rad2Deg;
叉乘,又乘叉積或外積
(x1,y1,z1)X(x2,y2,z2) = (y1*z2-y2*z1, x2*z1-x1*z2, x1*y2-x2*y1)
幾何意義,結果為兩個向量所組成面的垂直向量,
API: Vector3 v = Vector3.Cross(a,b);
叉乘應用:
創建垂直於平面的向量
判斷兩條向量的相對位置
Vector3是封裝了向量運算相關變量和方法的結構體
normalized:標准化向量
magnitude: 向量長度
sqrMagnitude:向量長度平方(開方?)
forward: Vector(0,0,1)的簡碼
up: Vector(0,1,0)的簡碼
right: Vector(1,0,0)的簡碼
void Normalized() 標准化向量
static Vector3 Lerp(Vector3 from, Vector3 to, float t):兩個向量之間的線性差值
static float Angle(Vector3 a, Vector3 b):兩個向量的夾角
static float Distance(Vector3 a, Vector3 b): 兩向量之間的距離
5.Time類
time:從游戲開始到現在的所用時間
deltaTime:獲取上一次Update()方法執行的時間到本次執行Update()方法時間的差值
fixedDeltaTime:在物理和其他固定幀速率進行更新上一幀所消耗的時間,
timeScale:表示事件縮放,正常為1
6.Mathf類
Mathf封裝了常見的數學計算方法的結構體
Lerp:兩個浮點數之間進行插值
Clamp:返回一個限制值
sin,cos,abs,max, min,sqr,pi
7.Translate
transform.Translate(transform.forward*Time.deltaTime); 移動方向為(兩向量相加):自身在世界坐標系的方向+自身的前方方向
transform.Translate(transform.position*Time.deltaTime); 移動方向為(單向量)自身在世界坐標系的方向向量
transform.Translate(target.forward*Time.deltaTime); 移動方向為(單向量)目標的前方
transform.Translate(target.position*Time.deltaTime); 移動方向為(單向量)目標在世界坐標系的方向向量
8.GameObject, gameObject, Transform, transform區別和聯系
GameObject是類型,gameObject是一個對象
Transform是一個類,原來描述物體的位置,大小,旋轉
transform是Transform類的對象,依附於每一個物體,也就是當前游戲對象的一個組件
transform:當前游戲對象的transform組件
gameObject:當前游戲對象的實例
在unity中每個游戲對象都是一個gameObject, monodevelop中的gameObject就代表着腳本所依附的對象。每個gameObject都包含各種各樣的組件,由此可見transform是gameObject的一個組件,控制着gameObject的位置,旋轉,和縮放,而且每個gameObject有且僅有一個transform組件
gameObject.transform和transform.gameObject
gameObject.transform,是獲取當前游戲對象的transform組件,所以在start()中,gameObject.transform和this.transform,都是指向同一個對象
transform.gameObject, 獲取當前gameObject組件所在的gameObject,所以二者可以一直互相引用下去
9.對Vector3.Lerp插值的理解
游戲中有些跟隨動作不夠圓滑或者需要一個緩沖效果,這時一般會考慮到插值(比如攝像機跟隨主角)
插值是數學上的一個概念,公式表示就是 a + (b-a)*t, 這個也就是lerp的返回值(用這個公式分別算出x,y,z)
deltaTime就是這一幀到下一幀經歷的時間
10.四元數quaternion和旋轉
旋轉是三種坐標變換(縮放,平移,旋轉)最復雜的一種
三種旋轉的方法:矩陣旋轉,歐拉旋轉,四元數旋轉
四元數本質上是一種高階復數,是一個四維空間, 相當於復數的二維空間
三種旋轉方式(矩陣旋轉,歐拉旋轉,四元數旋轉)的優缺點:
矩陣旋轉: 旋轉軸可以是任意向量
缺點: 旋轉只需要一個向量和一個角度,4個值的信息,但矩陣法使用了16個元素
歐拉旋轉: 容易理解,形象直觀,表示方便,只需要3個值(分別對應x,y,z的旋轉角度)
缺點: 要按照一個固定的坐標軸順序旋轉,否則造成不同的結果。
會造成萬向節鎖現象。
四元數旋轉:可以避免萬向節鎖現象,只需要一個4維的四元數就可以執行繞任意過原點的向量的旋轉,方便快捷,在某些實現下比旋轉矩陣效率更高
缺點: 理解困難,不直觀
11.用點乘和叉乘來判斷物體與人物的相對位置
用點乘來判斷物體是在人物的前方還是后方
用叉乘來判斷在人物的左手邊還是右手邊
12.預設體
預設體是一個游戲對象及其組件的集合,目的是使游戲對象及資源能夠被重復使用,相同的游戲對象可以通過一個預設體來創建,此過程可以理解為實例化。
把一個游戲對象從層級視窗拖到工程視窗后就會生成一個預設體
prefab:通過預設體創建的游戲對象會在Inspector視窗出現prefab
select:點擊select可以選中創建該物體的預設體
revert:更改實例化后的游戲物體,點擊revert會取消更改
apply:將該對象的信息同步到預設體
13.多種移動方式參考
(1)transform.position
transform.position += Vector3.forward*Time.deltaTime*5;
(2)Translate
transform.Translate(Vector3.forward*5*Time.deltaTime, target.transform)
(3)Lerp
transform.position = Vector3.Lerp(transform.position, target.position, 0.5f*Time.deltaTime)
(4)獲取輸入設備的橫軸,縱軸
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
transform.position += new Vector3(hor, 0, ver)*Time.deltaTime*5f;
(5)剛體
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
rig.AddForce(new Vector3(hor, 0, ver)*5f*Time.deltaTime);
(6)Vector3.MoveTowards();
transform.position = Vector3.MoveTowards(transform.position, target.position, 5f*Time.deltaTime);
(7)SmoothDamp();
Mathf.SmoothDamp(); //角色控制器
1.人機交互
Input類是輸入系統的接口,使用這個類能夠讀取輸入管理器設置的案件,以及訪問移動設備的多點觸控或加速感應數據,可以通過該列來實現外部設備控制游戲場景里面的物體
鍵盤輸入的常用方法:
GetKey() 按鍵按下期間返回true
GetKeyDown() 按鍵按下的第一幀返回true
GetKeyUp() 按鍵松開的第一幀返回true
GetAxis()
2.碰撞器(Collider)
OnMouseDown 鼠標在Collider之上,按下鼠標,事件被觸發
OnMouseDrag 鼠標在Collider之上,拖動鼠標,事件被觸發
OnMouseEnter 移動鼠標進入Collider區域,事件被觸發
OnMouseExit 移動鼠標移出Collider區域,事件被觸發
OnMouseOver 鼠標在Collider之上,每幀都會調用事件
OnMouseUp 當鼠標彈起的時候,事件被觸發
OnMouseUpAsButton 當鼠標在同一個Collider上,按下又彈起 觸發該事件
3.剛體(Rigidbody)
常用屬性:
velocity 剛體的速度
angularVelocity 剛體的角速度
drag 物體的阻力
angularDrag 物體的角阻力
mass 物體的質量
useGravity 是否受重力影響
isKinematic 是否使用動力學
freezeRotation 是否凍結旋轉
collisionDetectionMode 碰撞檢測模式
position 剛體位置
rotation 剛體旋轉
注:所有組件屬性獲取方法:
rid = GetComponent<Rigidbody>(); print(rid.mass);
常用方法:
AddForce 給剛體添加一個力
AddExplosionForce 給剛體添加一個力,模擬爆炸效果
AddForceAtPosition 在指定位置添加一個力
AddRelativeForce 添加相對力,相對於坐標系統
AddRelativeTorque 相對於他的局部坐標系統添加力矩
4.碰撞檢測(Collider + Rigidbody)
條件1 兩個物體都有Collider
條件2 至少有一個帶有Rigidbody
條件3 兩個物體有相對運動
碰撞回調方法
OnCollisionEnter()、OnCollisionStay()、OnCollisionExit()
5.射線(Ray)
射線創建
public Ray(Vector3 orgin, Vector3 direction);
Ray ray = new Ray(transform.position, transform.forward);
射線碰撞的應用:使用Physics類的Raycast()方法實現射線碰撞檢測功能
bool Raycast(Ray ray, out RaycastHit hitinfo);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition)