一、人機交互Input類
人機交互的常用外部設備就是我們平時用的那些⿏標、鍵盤、⼿柄、遙杆、觸屏、VR⼿柄、按鍵、VR 等等一系列。我們就是使用這些與計算機進行交互,下面我們看看U3D中常用 的一些方法來實現交互。
- Input鍵盤輸⼊⽅法
GetKey ——按住時返回True
GetKeyDown ——按下第⼀個幀返回True
GetKeyUp ——鬆開第⼀幀返回True
例如:
//這三個方法返回值都是bool類型,所以可以直接用來判斷
if (Input.GetKeyDown(KeyCode.Space))
{
//如果爲真,執行一個功能,比如空格一般對應跳躍
}
- Input⿏標輸⼊⽅法(左鍵爲0,右鍵爲1,中鍵爲2)
mousePosition ——⿏標的屏幕座標
GetMouseButtonDown ——按下⿏標第⼀幀返回True
GetMouseButtonUp ——鬆開⿏標第⼀幀返回true
GetMouseButton ——按住⿏標返回True
例如:
if (Input.GetMouseButtonDown(0))
{
//如果按下左鍵,就執行此處的代碼
}
- Input虛擬軸/按鍵
打開U3D的設置⾯板 Edit->ProjectSetting->Input
-
自上到下一次對應下面的條目:
虛擬按鍵名稱
描述名稱±
對應按鍵±
備⽤按鍵±
擡起按鍵,值恢復爲0的時間
⼩於此值,計爲0(僅⽤於遙感)
按下按鍵,值到達+1或-1的時間
同時按下正負鍵值爲0
±反轉 -
獲取軸⽅法 GetAxis
Horizontal 鍵盤⽔平軸
Vertical 鍵盤豎直軸
Mouse X ⿏標⽔平移動距離
Mouse Y ⿏標垂直移動距離
Mouse ScrollWheel 獲取⿏標滾輪值 -
獲取虛擬鍵⽅法
GetButton
Fire
Jump
GetButtonDown
GetButtonUp
例如:
float hor = Input.GetAxis("HorizontalUI");
float ver = Input.GetAxis("VerticalUI");
//控制前後移動
transform.Translate(Vector3.forward * ver * moveSpeed * Time.deltaTime);
//控制左右轉向
transform.Rotate(Vector3.up * hor * turnSpeed * Time.deltaTime);
二、Prefab預設體(預製體)
- 什麼是預設體?
預設是Unity中的一種特殊的資源。
一般來說預設就是一個或者一系列組件的集合體,你可以在創建了預設以後,對預設進行實例化。
可以理解成你把一個做好的遊戲對象保存成了一個模具,你能夠通過這個模具直接創建對象。 - 怎麼保存一個對象爲預設體?
在U3D中,可以通過直接將遊戲對象拖入Project面板以創建一個預設體
- 怎麼通過一個預設體實例化一個遊戲對象?
可以通過——Instantiate(預設體,位置 Vector3,旋轉 Quaternion)——這個方法實現 - 怎麼銷燬一個遊戲對象?
可以通過——Destroy方法銷燬對象
該方法有兩個重載——⽴刻銷燬 Destroy(gameObject)——延遲銷燬 Destroy(gameObject,3f) - 例如:
//在transform.position位置創建一個旋轉爲transform.rotation的shellExplosionPrefab對象
//並在explosionTime時間後銷燬
Destroy(Instantiate(shellExplosionPrefab, transform.position, transform.rotation), explosionTime);
-
預設體的作⽤
1、使⼀個遊戲對象以單獨⽂件的⽅式存在
2、使⽤該預設體⽂件,即可隨時創建出與該預設體完全⼀樣的遊戲對象到場景中 -
預設體注意:
給預設體拖拽屬性對象時,只能拖拽⽂件,不能拖場景⾥的遊戲對象 -
點擊場景中⽤預設體⽣成的對象可以進行下面的操作
Select 選中屬於的預設體⽂件
Revert 還原成與預設體⽂件⼀致的對象
Apply 將當前遊戲對象的設置應⽤到預設體
三、碰撞器
- 碰撞體組件的作⽤
1、⽤⼀個包圍盒(box、sphere、capsule)將⼀個模型包裹起來,該包圍盒來描述碰撞範圍
2、配合剛體組件,實現物理碰撞效果 - Collider組件
碰撞盒編輯 Edit Collider
是否設置爲觸發器
添加物理材質
碰撞體⼤⼩中⼼設置 - Collider種類
Box
Sphere
Capsule
Mesh(能不⽤就別⽤,必須要⽤的話, 減少頂點和⾯)
。。。。。。
剛體
剛體是可以用來完成逼真物理效果的物理組件,包括重⼒、阻⼒、作⽤⼒與反作⽤⼒。
- RigidBody屬性
質量:在同⼀場景中,兩個剛體的質量不要差超過100倍
阻⼒
⻆阻⼒
是否使⽤重⼒
是否開啓動⼒學(保留物理效果但⽆論發⽣怎樣的碰撞,都不會發⽣位置和旋轉的改變)
插值運算:內插值、外插值
碰撞檢測:間隔檢測 離散、連續檢測 增加檢測到碰撞的概率、間隔連續交替
約束:位置約束、⻆度約束
注意:對物體的操作要麼使用Transform組件,要麼使用RigidBody組件,不要混合使用
- 常⽤屬性
velocity 速度(⽮量)
angularVelocity
drag
angularDrag
useGravity
isKinematic
freezeRotation
collisionDetectionMode - 常⽤⽅法
AddForce(Vector3) 添加⼀個⼒
AddExplosionForce 添加爆炸⼒——參數列表(爆炸⼒⼤⼩Float,爆炸點Vector3,爆炸半徑Float)
注意:執⾏了添加爆炸⼒的⽅法,纔會產⽣爆炸,不執⾏⽅法,即便距離爆炸點很近,也不會有任何的爆炸效果
AddForceAtPosition 在⼀個點上施加⼀個⼒
AddRelativeForce 添加相對⼒
AddRelativeTorque 添加相對⼒矩
碰撞檢測
- 碰撞產⽣的條件
兩物體都有Collider、⾄少有⼀個帶有RigidBody、兩物體保持相對運動 - 回調⽅法
OnCollisionEnter(Collision other) ——碰撞開始⼀瞬間時調⽤⼀次
OnCollisionStay(Collision other)—— 碰撞過程中相對運動時持續調⽤,每幀⼀次
OnCollisionExit(Collision other) ——碰撞分離⼀瞬間時調⽤ - 回調⽅法參數 Collision(包含以下信息)
(1)collider 當前物體所碰撞到的遊戲對象(遊戲對象的碰撞體組件)
(2)contacts[] 所有碰撞點的信息:normal、point(碰撞點的座標) Vector3、…
觸發事件
- 觸發事件產⽣的條件
兩物體都有碰撞體
⾄少有⼀個帶有剛體
兩碰撞體⾄少有⼀個是觸發器 - 設置觸發器 將碰撞體組件中的isTrigger屬性勾選
- 回調函數
OnTriggerEnter(Collider other) 進⼊觸發器的時候調⽤⼀次
OnTriggerStay(Collider other) 處於某個觸發器之中的時候持續調⽤,每幀⼀次
OnTriggerExit(Collider other) 退出觸發器的時候調⽤⼀次
碰撞和觸發異曲同工,所以只給出一個觸發的例子。
- 例如:
//當該觸發器被觸發時,如果是玩家觸發的,將調用該玩家的Tank組件中的Invincible()方法,
//並銷燬這個觸發器,否則不做任何操作
void OnTriggerEnter(Collider player)
{
if (player.tag.Equals("Player"))
{
player.GetComponent<Tank>().Invincible();
Destroy(gameObject);
}
else
{
return;
}
}
物理射線(⽤於檢測碰撞體)
- 射線類Ray
射線組成部分:起點(origin)、⽅向(direction )
獲取⿏標屏幕射線 ——ScreenPointToRay ——將屏幕上的⼀個點轉換成射線 - 發射射線
Raycast 發射物理射線,返回⼀個碰撞檢測對象RaycastHit
RaycastAll 發射物理射線,返回所有碰撞檢測對象RaycastHit
RaycastHit對象中包含——collider 碰撞物體的Collider組件、point 碰撞點座標 - 例如:
//實例一個射線
Ray ray = new Ray(transform.position + Vector3.up, transform.forward);
//用來保存射線碰撞對象的信息
RaycastHit hitInfo;
//射線檢測碰撞
if (Physics.Raycast(ray, out hitInfo))
{
//如果射線碰到了碰撞器就執行以下代碼
GameObject obj = hitInfo.collider.gameObject;
if (obj != null && obj.tag.StartsWith("Player"))
{
Debug.DrawLine(ray.origin, hitInfo.point);
if (time > CDTime)
{
tankWeapon.Shoot();
time = 0f;
}
}
}
有疑問的可以私信博主。
點個關注,給個讚唄!
下面的鏈接是用以上只是做的一個坦克大戰單機遊戲的腳本實現,有興趣的可以看一看。
https://blog.csdn.net/maybe_ice/article/details/104738968