// ターゲットが一直線上にいるかどうかレイチェックでテストする private bool checkShouldFire(Vector3 targetPosition) { chrControllerEnemyDemon ctrl = getMyController(); targetPosition.y = ctrl.transform.position.y; // 発射可能なときだけ距離・角度チェック→ラインチェック if (ctrl.CanFire()) { Vector3 localPosition = ctrl.transform.InverseTransformPoint(targetPosition); localPosition.y = 0.0f; if (localPosition.magnitude <= AIM_DISTANCE && Mathf.Abs(Vector3.Angle(Vector3.forward, localPosition)) <= AIM_ANGLE) { // ラインチェック RaycastHit hit; // FIXME エネミーもチェックして、できるだけ先頭の敵だけが発射するようにする if (cachedLayerMask == 0) { cachedLayerMask = 1 << LayerMask.NameToLayer("Wall") | 1 << LayerMask.NameToLayer("Player"); } Vector3 rayDirection = (targetPosition - ctrl.transform.position).normalized; if (Physics.Raycast(ctrl.transform.position, rayDirection, out hit, Mathf.Infinity, cachedLayerMask)) { return(hit.collider.gameObject.tag == "Player"); } } } return(false); }
private float AIM_DISTANCE = 10.0f; // この距離以下なら発射する. // ================================================================ // // このコントローラが前提とするコントローラクラスへの参照を返す private chrControllerEnemyDemon getMyController() { if (myController == null) { myController = this.control as chrControllerEnemyDemon; } return myController; }
private float AIM_DISTANCE = 10.0f; // この距離以下なら発射する. // ================================================================ // // このコントローラが前提とするコントローラクラスへの参照を返す private chrControllerEnemyDemon getMyController() { if (myController == null) { myController = this.control as chrControllerEnemyDemon; } return(myController); }