我正在制作一个抓取枪,如果对象的 Layer
是 轻量级
,则将对象向玩家拉近,如果 Layer
是 地面
,则将玩家朝向对象拉近。
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
层的物体,因为我先写了对它的 if 语句。有没有办法让它不因为第一个if语句寻找背后的物体而穿过前面的物体,或者优先选择在前面的物体?
enum
仍然是一个int
底层类型(默认情况下..你甚至可以将底层类型更改为例如byte
、uint
等)..但这样你就有了一个特定的名称来表示你的值,不必一直记住0
或1
到底代表什么。由于它们是编译时常量,因此您可以再次使用switch
,这将更有效率。 - derHugovar
,而是在类级别上拥有一个private HitType hitType;
,然后将其分配给它。 - derHugovoid Update(){Vector3 dir;if (Input.GetMouseButtonDown(0)) dir = Vector3.forward;else if (Input.GetMouseButtonDown(1)) dir = Vector3.right;else return;int gm = LayerMask.NameToLayer("Default");int lwm = LayerMask.NameToLayer("Water");int layers = 1 << gm | 1 << lwm;if (Physics.Raycast(transform.position, dir, out RaycastHit raycastHit, float.PositiveInfinity, layers)){if (raycastHit.collider.gameObject.layer == gm) Debug.Log("地面"); else if (raycastHit.collider.gameObject.layer == lwm) Debug.Log("轻量级");}}
在新场景中放置三个立方体。 - Ruzihm