我正在制作一把抓鉤槍,如果圖層為LightWeight,則將物體拉向玩家,如果圖層為,則將玩家拉向物體Ground
int groundLayer_mask = LayerMask.GetMask("Ground");
int lightWeightLayer_mask = LayerMask.GetMask("LightWeight");
//Shoots a raycast, and only works if layer is Ground
if (Physics.Raycast(Shoulder.transform.position, cam.transform.forward, out raycastHit, float.PositiveInfinity, groundLayer_mask))
{
//Hit Something
debugHitpointTransform.position = raycastHit.point;
hookshotPosition = raycastHit.point;
hookShotSize = 0f;
HookShotTransform.gameObject.SetActive(true);
HookShotTransform.localScale = Vector3.zero;
layerHit = 0;
state = State.HookShotThrown;
}
//Shoots a raycast, and only works if layer is LightWeight
else if (Physics.Raycast(Shoulder.transform.position, cam.transform.forward, out raycastHit, float.PositiveInfinity, lightWeightLayer_mask))
{
//Hit Something
debugHitpointTransform.position = raycastHit.point;
hookshotPosition = raycastHit.point;
hookShotSize = 0f;
HookShotTransform.gameObject.SetActive(true);
HookShotTransform.localScale = Vector3.zero;
layerHit = 1;
state = State.HookShotThrown;
}
但是,如果我朝一個帶有Ground層的物件的方向看,即使有一個層LightWeight比一個層更近Ground,它也適用于有層的那個,Ground因為我首先有 if 陳述句。有什么方法可以讓它不通過前面的物件只是因為第一個如果正在尋找后面的物件,或者讓它優先考慮前面的物件?
uj5u.com熱心網友回復:
除了layerHit. 所以無論哪種方式,這都是一種資源浪費;)
因此,為了提高效率并實作您想要的效果,只需將兩個圖層都包含在圖層蒙版中,并對兩個圖層僅進行一次光線投射 -> 它將使用從給定圖層首先命中的任何內容。
然后,您仍然可以檢查您實際擊中了if塊內的哪一層。
所以我會在 Inspector 中公開該欄位是可配置的
// Configure this via the Inspector
// it will be a drop-down from which you can select multiple entries
public LayerMask layers;
private void Awake ()
{
// if you really want to keep getting these by code
layers = LayerMask.GetMask("Ground", "LightWeight");
}
而且一般來說,我也會使用 anenum來獲得一些有意義的名稱,例如
public enum HitType
{
None = -1,
Ground,
Lightweight
}
然后使用單個光線投射,例如
int groundLayer_mask = LayerMask.NameToLayer("Ground");
int lightWeightLayer_mask = LayerMask.NameToLayer("LightWeight");
var hitType = HitType.None;
if (Physics.Raycast(Shoulder.transform.position, cam.transform.forward, out raycastHit, float.PositiveInfinity, layers))
{
//Hit Something
debugHitpointTransform.position = raycastHit.point;
hookshotPosition = raycastHit.point;
hookShotSize = 0f;
HookShotTransform.gameObject.SetActive(true);
HookShotTransform.localScale = Vector3.zero;
if(raycastHit.collider.gameObject.layer == groundLayer_mask) hitType = HitType.Ground;
else if(raycastHit.collider.gameObject.layer == lightWeightLayer_mask) hitType = HitType.Lightweight;
state = State.HookShotThrown;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385940.html
