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

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

新規登録して質問してみよう
ただいま回答率
85.48%
RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

Unity3D

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

Q&A

1回答

782閲覧

アイテムドロップについて

kirito

総合スコア1

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

Unity3D

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

0グッド

0クリップ

投稿2022/02/19 06:04

敵を倒したらアイテムドロップするようにしたいんですけど、現状敵を倒してもドロップせず、無限生成されてる状態なので解決お願いします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class EnemyManager : MonoBehaviour 6{ 7 ItemManager itemManager; 8 Enemy enemy1; 9 [SerializeField] 10 private float waitTime = 3f; 11 private float elapsedTime; 12 Enemy m_enemy; 13 [SerializeField] GameObject enemyPrefab; 14 [SerializeField] float interval; 15 [SerializeField] float time = 0f; 16 int maxEnemys = 5; 17 int currentEnemys; 18 [SerializeField] Transform player; 19 [SerializeField] Transform enemy; 20 // Start is called before the first frame update 21 void Start() 22 { 23 Vector3 playerPos = player.position; 24 Vector3 enemyPos = enemy.position; 25 maxEnemys = currentEnemys; 26 elapsedTime = 0f; 27 itemManager = GetComponent<ItemManager>(); 28 } 29 30 // Update is called once per frame 31 void Update() 32 { 33 Spawn(); 34 } 35 36 public void Spawn() 37 { 38 itemManager.ItemDrop(); 39 GameObject enemy = GameObject.Find(enemyPrefab.name); 40 if (enemy == null) 41 { 42 elapsedTime += Time.deltaTime; 43 if (elapsedTime > waitTime) 44 { 45 //enemy.transform.position = new Vector3(0, 0, 0); 46 GameObject newEnemy = Instantiate(enemyPrefab); 47 newEnemy.name = enemyPrefab.name; 48 elapsedTime = 0f; 49 } 50 } 51 } 52}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy : MonoBehaviour 6{ 7 public enum EnemyState 8 { 9 Walk, 10 Wait, 11 Chase, 12 Attack, 13 Freeze 14 }; 15 16 private CharacterController enemyController; 17 private Animator animator; 18 // 目的地 19 private Vector3 destination; 20 // 歩くスピード 21 [SerializeField] 22 private float walkSpeed = 1.0f; 23 // 速度 24 private Vector3 velocity; 25 // 移動方向 26 private Vector3 direction; 27 // 到着フラグ 28 private bool arrived; 29 // SetPositionスクリプト 30 private SetPosition setPosition; 31 // 待ち時間 32 [SerializeField] 33 private float waitTime = 5f; 34 // 経過時間 35 private float elapsedTime; 36 // 敵の状態 37 private EnemyState state; 38 // プレイヤーTransform 39 private Transform playerTransform; 40 41 [SerializeField] int m_enemyHp = 3; 42 // 攻撃した後のフリーズ時間 43 [SerializeField] 44 private float freezeTime = 0.5f; 45 46 // Use this for initialization 47 void Start() 48 { 49 enemyController = GetComponent<CharacterController>(); 50 animator = GetComponent<Animator>(); 51 setPosition = GetComponent<SetPosition>(); 52 setPosition.CreateRandomPosition(); 53 velocity = Vector3.zero; 54 arrived = false; 55 elapsedTime = 0f; 56 SetState(EnemyState.Walk); 57 } 58 59 // Update is called once per frame 60 void Update() 61 { 62 // 見回りまたはキャラクターを追いかける状態 63 if (state == EnemyState.Walk || state == EnemyState.Chase) 64 { 65 // キャラクターを追いかける状態であればキャラクターの目的地を再設定 66 if (state == EnemyState.Chase) 67 { 68 setPosition.SetDestination(playerTransform.position); 69 } 70 if (enemyController.isGrounded) 71 { 72 velocity = Vector3.zero; 73 animator.SetFloat("Speed", 2.0f); 74 direction = (setPosition.GetDestination() - transform.position).normalized; 75 transform.LookAt(new Vector3(setPosition.GetDestination().x, transform.position.y, setPosition.GetDestination().z)); 76 velocity = direction * walkSpeed; 77 } 78 79 if (state == EnemyState.Walk) 80 { 81 // 目的地に到着したかどうかの判定 82 if (Vector3.Distance(transform.position, setPosition.GetDestination()) < 0.7f) 83 { 84 SetState(EnemyState.Wait); 85 animator.SetFloat("Speed", 0.0f); 86 } 87 } 88 else if (state == EnemyState.Chase) 89 { 90 // 攻撃する距離だったら攻撃 91 if (Vector3.Distance(transform.position, setPosition.GetDestination()) < 2f) 92 { 93 SetState(EnemyState.Attack); 94 } 95 } 96 // 到着していたら一定時間待つ 97 } 98 else if (state == EnemyState.Wait) 99 { 100 elapsedTime += Time.deltaTime; 101 102 // 待ち時間を越えたら次の目的地を設定 103 if (elapsedTime > waitTime) 104 { 105 SetState(EnemyState.Walk); 106 } 107 // 攻撃後のフリーズ状態 108 } 109 else if (state == EnemyState.Freeze) 110 { 111 elapsedTime += Time.deltaTime; 112 113 if (elapsedTime > freezeTime) 114 { 115 SetState(EnemyState.Walk); 116 } 117 } 118 velocity.y += Physics.gravity.y * Time.deltaTime; 119 enemyController.Move(velocity * Time.deltaTime); 120 } 121 122 123 // 敵キャラクターの状態変更メソッド 124 public void SetState(EnemyState tempState, Transform targetObj = null) 125 { 126 state = tempState; 127 if (tempState == EnemyState.Walk) 128 { 129 arrived = false; 130 elapsedTime = 0f; 131 setPosition.CreateRandomPosition(); 132 } 133 else if (tempState == EnemyState.Chase) 134 { 135 // 待機状態から追いかける場合もあるのでOff 136 arrived = false; 137 // 追いかける対象をセット 138 playerTransform = targetObj; 139 } 140 else if (tempState == EnemyState.Wait) 141 { 142 elapsedTime = 0f; 143 arrived = true; 144 velocity = Vector3.zero; 145 animator.SetFloat("Speed", 0f); 146 } 147 else if (tempState == EnemyState.Attack) 148 { 149 velocity = Vector3.zero; 150 animator.SetFloat("Speed", 0f); 151 animator.SetBool("Attack", true); 152 } 153 else if (tempState == EnemyState.Freeze) 154 { 155 elapsedTime = 0f; 156 velocity = Vector3.zero; 157 animator.SetFloat("Speed", 0f); 158 animator.SetBool("Attack", false); 159 } 160 } 161 162 // 敵キャラクターの状態取得メソッド 163 public EnemyState GetState() 164 { 165 return state; 166 } 167 168 public void OnTriggerEnter(Collider other) 169 { 170 if (other.gameObject.CompareTag("Sword")) 171 { 172 m_enemyHp -= 1; 173 if (m_enemyHp == 0) 174 { 175 Dead(); 176 } 177 } 178 } 179 public void Dead() 180 { 181 Destroy(transform.root.gameObject); 182 } 183}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemManager : MonoBehaviour 6{ 7 public GameObject ItemObject; 8 [SerializeField] 9 private Item item; 10 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 22 } 23 public void ItemDrop() 24 { 25 if (item.GetItemName() == "回復薬") 26 { 27 for (int count = 0; count < 1; count++) 28 { 29 Instantiate(ItemObject, transform.position, Quaternion.identity); 30 } 31 } 32 } 33}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ItemManager はプレハブを座標指定せずにインスタンス化しているので、プレハブに設定された座標にアイテムを生成してしまっています。
アイテム生成処理を Update() から条件を指定せずに呼んでいるので、毎フレームプレハブが生成されています。

まずは、敵が Destroy される時に、その敵がいた座標にアイテムを生成する、という処理を作るとよいでしょう。
次に ItemManager でやっている「抽選処理」を追加するとよいのではないかと思います。

投稿2022/02/27 14:43

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問