質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

受付中

プレイヤーが敵から離れたときや敵が倒れた時に自動でロックオンを非表示にする方法

kofeko
kofeko

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

2回答

0リアクション

0クリップ

221閲覧

投稿2019/10/14 15:02

カメラのスクリプトは
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class CameraControllerVer : MonoBehaviour
{
public GameObject player;
public GameObject mainCamera;
public float rotate_speed;
private const int ROTATE_BUTTON = 2;
private const float ANGLE_LIMIT_UP = 60f;
private const float ANGLE_LIMIT_DOWN = -5f;
private LockOnTargetDetector lockOnTargetDetector;
[SerializeField]
public GameObject lockOnTarget;
protected LockonCursor lockonCursor;

void Start() { mainCamera = Camera.main.gameObject; player = GameObject.FindGameObjectWithTag("Player"); lockOnTargetDetector = player.GetComponentInChildren<LockOnTargetDetector>(); lockonCursor = GameObject.FindObjectOfType<LockonCursor>(); } void LateUpdate() { transform.position = player.transform.position; rotateCmaeraNaturalAngle(); if (Input.GetMouseButton(ROTATE_BUTTON)) { rotateCmaeraAngle(); } if (Input.GetButtonDown("Fire2")) { if (lockOnTarget == null) { // ロックオンターゲット取得 GameObject target = SetTargetClosestScreenCenter(); if (target != null) { lockOnTarget = target; lockonCursor.OnLockonStart(target.transform); } else { // 視点リセット iTween.RotateTo(gameObject, iTween.Hash( "rotation", player.transform.eulerAngles, "time", 0.5f )); } } else { // 既にターゲットが設定されていた場合は解除 lockOnTarget = null; lockonCursor.OnLockonEnd(); } } if (lockOnTarget) { lockOnTargetObject(lockOnTarget); } else { rotateCmaeraNaturalAngle(); if (Input.GetMouseButton(ROTATE_BUTTON)) { rotateCmaeraAngle(); } } float angle_x = 180f <= transform.eulerAngles.x ? transform.eulerAngles.x - 360 : transform.eulerAngles.x; transform.eulerAngles = new Vector3( Mathf.Clamp(angle_x, ANGLE_LIMIT_DOWN, ANGLE_LIMIT_UP), transform.eulerAngles.y, transform.eulerAngles.z ); } private void rotateCmaeraNaturalAngle() { Vector3 angle = new Vector3( Input.GetAxis("Angles X") * rotate_speed, Input.GetAxis("Angles Y") * rotate_speed, 0 ); transform.eulerAngles += new Vector3(angle.y, angle.x); } private void rotateCmaeraAngle() { Vector3 angle = new Vector3( Input.GetAxis("Mouse X") * rotate_speed, Input.GetAxis("Mouse Y") * rotate_speed, 0 ) ; transform.eulerAngles += new Vector3(angle.y, angle.x); } private void lockOnTargetObject(GameObject target) { transform.LookAt(target.transform, Vector3.up); } protected GameObject SetTargetClosestScreenCenter() { float search_radius = 15f; var hits = Physics.SphereCastAll( player.transform.position, search_radius, player.transform.forward, 0.01f, LayerMask.NameToLayer("LockonTarget") ).Select(h => h.transform.gameObject).ToList(); hits = FilterTargetObject(hits); if (0 < hits.Count()) { float min_target_distance = float.MaxValue; GameObject target = null; foreach (var hit in hits) { Vector3 targetScreenPoint = Camera.main.WorldToViewportPoint(hit.transform.position); float target_distance = Vector2.Distance( new Vector2(0.5f, 0.5f), new Vector2(targetScreenPoint.x, targetScreenPoint.y) ); Debug.Log(hit.gameObject + ": " + target_distance); if (target_distance < min_target_distance) { min_target_distance = target_distance; target = hit.transform.gameObject; } } return target; } else { return null; } } protected List<GameObject> FilterTargetObject(List<GameObject> hits) { return hits .Where(h => { Vector3 screenPoint = Camera.main.WorldToViewportPoint(h.transform.position); return screenPoint.x > 0 && screenPoint.x < 1 && screenPoint.y > 0 && screenPoint.y < 1; }) .Where(h => { foreach (var component in h.GetComponents<Component>()) { if (component is Enemy) { return true; } } return false; }) .ToList(); }

}
です。
ちなみに敵の位置を設定し距離でif文をかいたところNUllエラーになります。
どうすれば自動でロックオンを非表示にできるでしょうか?
回答よろしくおねがいします!

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。