
首先我们要在 FPS 控制器中创建一个名为 isPressed 的布尔变量。
private bool ..isPressed;
此时需要检查 Update 的方法,如果使用新的输入系统按下鼠标左键时显示十字线,则设置按下等于 true。
如下所示:
if (Mouse.current. leftButton.wasPressedThisFrame)
{
_isPressed = true;
}
接着创建一个屏障层和一个敌人层,选择敌人和屏障并向它们添加到层中。

转到 FixUpdate 方法,创建一条投射在屏幕中央的光线,使用 Camera.main.ViewportPointToRay 来执行此操作,再使用图层蒙版先击中敌人。
[serializeField]
private GameObject _muzzleFlash;
[ SerializeField]
private Transform _firingPosition;
现在3D天堂想在每次按下鼠标左键时实例化枪口闪光,如下所示:
if (Mouse.current. leftButton.wasPressedThisFrame)
{
GameObject flash= Instantiate(_muzzleFlash,_firingPosition.transform.position,Quaternion.identity);
flash.transform.parent = _firingPosition.transform;
_isPressed = true;
}
当瞄准击中敌人时,敌人的身体上显示血液粒子,可以使用物理点光线投射来做到这一点。
例如:
private void FixedUpdate()
{
if (isPressed -=true)
{
Ray rayOrigin = Camera.main.ViewportPointToRay(new Vector3(0.5f,0.5f,0));
RaycastHit hitInfo;
if (Physics.Raycast(rayOrigin,out hitInfo,Mathf.Infinity,1 <<6))
{
Instantiate(_enemybloodParticle,hitInfo.point +(hitInfo.normal* 0.0025f),Quaternion.LookRotation(hitiInfo.normal));
_isPressed = false;
}
}
}
private void FixedUpdate()
{
if ( _isPressed == true)
{
_isPressed = false;
Ray rayOrigin = Camera.main.ViewportPointToRay(new Vector3(0.5f,0.5f,0));
RaycastHit hitInfo;
if(Physics.Raycast(rayOrigin,out hitInfo,Mathf.Infinity, 1 << 6 & ~(1 << c7))
{
if (hitInfo.collider != null)
{
Instantiate(_enemybloodParticle,hitInfo.point + (hitInfo.normal* 0.025f),Quaternion.identity);
Debug.Log("IsPressed: " + _isPressed);
}
}
}
}
如果使用的是 FPS 相机遇到一些常见错误,因为有时主相机标签不会有 MainCamera 标签,请确保添加此标签以避免空异常错误。

现在来检查下是否击中了敌人的对撞机,先使用 hitInfo 点对撞机,再使用 hitInfor 获取 AI 组件,最后调用 damage 方法。
注意:
为什么要再次检查命中对象的碰撞器,因为物理点射线投射会过滤 enemy_model 碰撞器。
如下所示:
private void FixedUpdate()
{
if (_isPressed == true)
{
_isPressed = false;
Ray rayOrigin = Camera.main.ViewportPointToRay(new Vector3(0.5f,0.5f,0));
RaycastHit hitInfo;
if (Physics.Raycast(rayOrigin,out hitInfo,Mathf.Infinity,1 <<6))
{
if (hitInfo.collider.gameObject . layer==6)
{
Debue.Log("HitInfo Name :" + hitInfo.collider.name);
_enemy = hitInfo.collider.GetComponent<AI>();
if (_enemy !=null)
{
_enemy . Damage();
}
lnstantiate(_enemybloodParticle, hitlnfo.point + (hitInfo.normal*0.025f), Quaternion.identity);
}
else
{
return;
}
}
}
}
但这里有一个好处是如何修复 AI 脚本中的损坏方法逻辑。
public void Damage()
{
if (_isDead == false)
{
_health--;
}
if (_health < 1)
{
_health = 0;
_isDead = true;
_currentState = AIState.Death;
}
}
到这里一起看看最终的效果。

…
以上是3D天堂关于在 Unity 中创建十字线框架的全部内容,如果你有任何反馈,请随时在本页面下方留言。