人機交互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)檢測鼠標持續按下? ? ? ? ? ? ? ? 按住鼠標返回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();? 動態加載資源
Object prefab = Resources.Load("Cube");
1.1、現將這個預設體加載到內存中
//注意: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、是否設置為觸發器、添加物理材質、碰撞體大小中心設置。。。。。
1、關于碰撞:
如果兩個物體想發生碰撞,需要具備兩個條件:
1.1:兩個物體都需要有剛體組件
1.2: 兩個物體都需要有碰撞盒子
2、碰撞盒子 (Collider)
用來描述一個物體真正可以發生碰撞的部位
種類:BoxCollider、SpherCollider...........
鼠標碰撞回調方法:
OnMouseEnter(Collision c) ? ?鼠標進入到碰撞體范圍的第一幀調用一次
OnMouseOver(Collision c) ? ? 鼠標進入到碰撞體范圍內持續調用,每幀一次
OnMouseExit(Collision c) ? ? ? 鼠標離開碰撞體范圍的最后一幀調用一次
OnMouseDown ? ? ? ? ? ? ? ? ? ? ? ? 在碰撞體范圍內按下時,調用一次
OnMouseDrag ? ? ? ? ? ? ? ? ? ? ? ? ?在碰撞體范圍內按下,持續調用,每幀一次
OnMouseUp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在碰撞體范圍內按下,抬起鼠標左鍵,調用一次
OnMouseUpAsButton ? ? ? ? ? ? ? 在碰撞體范圍內按下并抬起,執行一次。
碰撞檢測:
回調方法:
OnCollisionEnter(Collision other) ? ? 碰撞開始一瞬間時調用
OnCollisionStay(Collision other) ? ? ?碰撞過程中相對運動時持續調用,每幀一次
OnCollisionExit(Collision other) ? ? ? 碰撞分離一瞬間時調用
回調方法參數: Collision
collider:當前物體所碰撞到的游戲對象(游戲對象的碰撞器組件)
contacts[]:所有碰撞點的信息 ? normal、 ?point(碰撞點坐標)、Vector3
Trigger觸發器:
觸發事件產生的條件:兩個物體都有碰撞體,至少有一個帶有剛體,兩個碰撞體其中有一個是觸發器。
使用代碼來設置Trigger
//gameObject.GetComponent().isTrigger = true;
Collision表示碰撞
//c.gameObject獲取與當前物體發生碰撞的物體
假如不希望兩個物體發生物理上的碰撞,但是還要檢測是否接觸到了一起
//可以給一方的Collider組件設置Trigger
//添加Trigger如果需要捕獲到碰撞,需要執行的以下的回調
需要觸發器啟用才能用下面的方法
回調函數:
void ?OnTriggerEnter(Collider c)
{
Debug.Log("進入觸發器的時候調用一次");
}
void ?OnTriggerStay(Collider c)
{
Debug.Log("處于某個觸發器之中的時候持續調用,每幀一次");
}
void ? OnTriggerExit(Collider c)
{
Debug.Log("退出觸發器的時候調用一次");
}
剛體: RigidBody屬性
作用:完成逼真物理效果的物理組件,重力、阻力、作用力和反作用力等。
主要屬性有:速度[velocity]、角速度[angularVelocity]、阻力[drag]、角阻力[angularDrag]、是否使用重力[useGravity]、是否開啟動力學[isKinematic]、插值運算(內插值、外插值)、碰撞檢測[collisionDetectionMode](間隔檢測、連續檢測、間隔連續交替)、約束(位置約束、角度約束)。
注意:對物體的操作使用Transform組件,要么使用RigidBody組件,不要混合使用
常用方法:
private Rigidbody r;
r = gameObject.GetComponent(); ? 獲取組件
AddForce:
//通過給一個物體添加一個力,來實現物體的移動
//是相對于世界坐標的力
//給一個物體移動的力
//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);