Unity3D基礎論-開發(fā)游戲必備的組件、屬性、方法(1)

人機交互

人機交互Input類:

常用的外部設備主要有:鼠標、鍵盤、手柄、搖桿、觸屏、VR手柄。。。。。。

Input鍵盤輸入方法: ? ?

GetKeyDown檢測鍵盤按下 ? ? ? ? ? ?按下時返回Ture

GetKey檢測鍵盤按住 ? ? ? ? ? ? ? ? ? ? 按住時返回Ture

GetKeyUp檢測鍵盤抬起 ? ? ? ? ? ? ? ? 抬起時返回Ture

用法:

?if(Input.GetKeyDown(keyCode.W)){};

KeyCode.Alpha0 ? ? ? ?數字(Alpha0代表0以此類推)

KeyCode.A ? ? ? ? ? ? ? ? 字母(KeyCode.W代表A以此類推)

Input鼠標輸入方法:

可以用鍵盤的方法:Input.GetKeyDown(KeyCode.Mouse0){}

Mouse0 /左鍵 ? ? ?Mouse1/右鍵 ? ?Mouse2 ?/滾輪

也有自己的方法:

參數: ?0,左鍵; ? ?1,右鍵 ; ? ? ? 2,滾輪 ?。。。。

GetMouseButton(0)檢測鼠標持續(xù)按下? ? ? ? ? ? ? ? 按住鼠標返回Ture

GetMouseButtonDown() 檢測鼠標按下 ? ? ? ? ? ? ?按下鼠標第一幀返回Ture

GetMouseButtonUp()檢測鼠標抬起 ? ? ? ? ? ? ? ? ? 松開鼠標第一幀返回Ture

mousePosition當前鼠標屏幕坐標

Vector3 position = Input.MousePosition; ????Debug.Log(position);


Input虛擬軸/按鍵:

設置虛擬軸按鍵面板路徑: ? ? ? Edit->ProjectSetting->Input

詳細設置有: ? ? 虛擬按鍵名稱、描述名稱+-、對應按鍵+-、備用按鍵+-、抬起按鍵,值恢復為0的時間、小于此值,計為0(僅用于搖桿)、按下按鍵,值達到+1或-1的時間、同時按下正負鍵值為0、+-反轉。。。。。

GetAxis:獲取軸方法

//獲取虛擬軸上的位移量

float vertical = Input.GetAxis("Vertical");

Vertical:鍵盤豎直軸

例: ?前后行走代碼

if (vertical > 0.1f)

{

gameObject.transform.Translate(Vector3.forward * Time.deltaTime);

}

else if (vertical < -0.1f)

{

gameObject.transform.Translate(Vector3.back * Time.deltaTime);

}

Horizontal:鍵盤水平軸

例:左右行走代碼

if (horizontal > 0.1f)

{

gameObject.transform.Translate(Vector3.right * Time.deltaTime);

}

else if (horizontal < -0.1f)

{

gameObject.transform.Translate(Vector3.left * Time.deltaTime);

}

Mouse X ?鼠標水平移動距離 ? ?Mouse Y ? 鼠標垂直移動距離 ? ? Mouse ScrollWheel ? ? 獲取鼠標滾輪值

例:旋轉代碼

//獲取兩個軸上的偏移量

float horizontal = Input.GetAxis("Horizontal");

float vertical = Input.GetAxis("Vertical");

//求絕對值

if (Mathf.Abs(horizontal) > 0.1f || Mathf.Abs(vertical) > 0.1f)

{

//轉身。

//1.需要旋轉的弧度

float a = Mathf.Atan2(horizontal, vertical);

float degress = a * 180 / Mathf.PI;

//2、旋轉

gameObject.transform.eulerAngles = new Vector3(0, degress, 0);

//始終向前移動

gameObject.transform.Translate(Vector3.forward * Time.deltaTime);

}


預設體: Instantiate?

位置: ?Vector3 ? ?旋轉: Quaternion

Resources.Load();? 動態(tài)加載資源

Object prefab = Resources.Load("Cube");

1.1、現(xiàn)將這個預設體加載到內存中

//注意:1:要加載的預設體必須放到Resources文件夾下

// ????2:這一步加載得到的結果是一個Object類型的

Instantiate(prefab);

1.2、實例化一個預設體的對象

//注意:這一步得到的結果其實也是一個Object

GameObject.Instantiate(prefab);

所以,如果需要得到一個GameObject,需要強制類型轉換 ?【關鍵字as】

GameObject obj = ?GameObject.Instantiate(prefab) as GameObject;

銷毀:Destroy()

參數:銷毀對象、銷毀時間

Destroy(gameObject, 3)延遲銷毀

Destroy(gameObject,)立即銷毀

GameObject.Destroy(gameObject, 3);


碰撞器: ?Collider組件

Collider組件:

碰撞盒編輯 ? Edit Collider、是否設置為觸發(fā)器、添加物理材質、碰撞體大小中心設置。。。。。

1、關于碰撞:

如果兩個物體想發(fā)生碰撞,需要具備兩個條件:

1.1:兩個物體都需要有剛體組件

1.2: 兩個物體都需要有碰撞盒子

2、碰撞盒子 (Collider)

用來描述一個物體真正可以發(fā)生碰撞的部位

種類:BoxCollider、SpherCollider...........

鼠標碰撞回調方法:

OnMouseEnter(Collision c) ? ?鼠標進入到碰撞體范圍的第一幀調用一次

OnMouseOver(Collision c) ? ? 鼠標進入到碰撞體范圍內持續(xù)調用,每幀一次

OnMouseExit(Collision c) ? ? ? 鼠標離開碰撞體范圍的最后一幀調用一次

OnMouseDown ? ? ? ? ? ? ? ? ? ? ? ? 在碰撞體范圍內按下時,調用一次

OnMouseDrag ? ? ? ? ? ? ? ? ? ? ? ? ?在碰撞體范圍內按下,持續(xù)調用,每幀一次

OnMouseUp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在碰撞體范圍內按下,抬起鼠標左鍵,調用一次

OnMouseUpAsButton ? ? ? ? ? ? ? 在碰撞體范圍內按下并抬起,執(zhí)行一次。


碰撞檢測:

回調方法:

OnCollisionEnter(Collision other) ? ? 碰撞開始一瞬間時調用

OnCollisionStay(Collision other) ? ? ?碰撞過程中相對運動時持續(xù)調用,每幀一次

OnCollisionExit(Collision other) ? ? ? 碰撞分離一瞬間時調用

回調方法參數: Collision

collider:當前物體所碰撞到的游戲對象(游戲對象的碰撞器組件)

contacts[]:所有碰撞點的信息 ? normal、 ?point(碰撞點坐標)、Vector3

Trigger觸發(fā)器:

觸發(fā)事件產生的條件:兩個物體都有碰撞體,至少有一個帶有剛體,兩個碰撞體其中有一個是觸發(fā)器。

使用代碼來設置Trigger

//gameObject.GetComponent().isTrigger = true;

Collision表示碰撞

//c.gameObject獲取與當前物體發(fā)生碰撞的物體

假如不希望兩個物體發(fā)生物理上的碰撞,但是還要檢測是否接觸到了一起

//可以給一方的Collider組件設置Trigger

//添加Trigger如果需要捕獲到碰撞,需要執(zhí)行的以下的回調

需要觸發(fā)器啟用才能用下面的方法


Trigger

回調函數:

void ?OnTriggerEnter(Collider c)

{

Debug.Log("進入觸發(fā)器的時候調用一次");

}

void ?OnTriggerStay(Collider c)

{

Debug.Log("處于某個觸發(fā)器之中的時候持續(xù)調用,每幀一次");

}

void ? OnTriggerExit(Collider c)

{

Debug.Log("退出觸發(fā)器的時候調用一次");

}


剛體: RigidBody屬性

作用:完成逼真物理效果的物理組件,重力、阻力、作用力和反作用力等。

主要屬性有:速度[velocity]、角速度[angularVelocity]、阻力[drag]、角阻力[angularDrag]、是否使用重力[useGravity]、是否開啟動力學[isKinematic]、插值運算(內插值、外插值)、碰撞檢測[collisionDetectionMode](間隔檢測、連續(xù)檢測、間隔連續(xù)交替)、約束(位置約束、角度約束)。

注意:對物體的操作使用Transform組件,要么使用RigidBody組件,不要混合使用

常用方法:

private Rigidbody r;

r = gameObject.GetComponent(); ? 獲取組件

AddForce:

//通過給一個物體添加一個力,來實現(xiàn)物體的移動

//是相對于世界坐標的力

//給一個物體移動的力

//r. AddForce(Vector3.forward * 1000);

AddRelativeForce:

//給一個物體添加一個力

//是相對于自身坐標的

// r. AddRelativeForce(Vector3.forward * 500);

AddTorque:

//給一個物體添加一個力矩

//給一個物體旋轉的力

//相對于世界坐標

//r. AddTorque(Vector3.forward * 500);

AddRelativeTorque:

//給一個物體添加一個力矩

//相對于自身坐標

//r. AddRelativeTorque(Vector3.forward * 500);

AddExplosionForce:

//需要給每個要爆炸的物體添加上爆炸的腳本

//添加一個爆炸力

//第一個:表示力的大小

//第二個:爆炸中心點

//第三個:爆炸半徑

r.AddExplosionForce(1000, new Vector3(20, 1, 20), 1000);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容