一起來玩U3D之基礎物理引擎

一、人機交互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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章