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

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

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

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

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2204閲覧

unity 一定時間無敵になるアイテムを作りたい。

sutegoma

総合スコア37

C#

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

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/10/15 04:10

編集2017/10/15 07:38

使用エディター:Unity 2017.1.1f1 (64-bit)
環境:Windows10 Home
アクションゲームでマリオのスターよろしく、一定時間無敵になり
その後解除されるアイテムを作ろうとしています。
どうしたらよいのでしょうか。

行ったアプローチ
アイテム取得時のHPを記録
タイマーセット
HPを1万ぐらい(時間内に削り切れない程度)与え
時間を描写(あと*秒)
時間後記録したHPで上書き
結果 while文で処理落ち

mutekijikanメソッドのほうにif文で処理しようとする
結果:HPが増えない上一度に2ずつカウントが減り、残り1でストップしてしまう
例:

略 else if (other.gameObject.tag == "Star") { motonoHP = tankHP; starcount = 20; tankHP += 10000; InvokeRepeating ("mutekijikan", 0f, 1f); tankHP = motonoHP; tankLife.text = "HP:" + tankHP; } } 略 void mutekijikan(){ if (starcount > 0) { tankLife.text = "むてきあと" + starcount + "秒"; starcount -= 1; } ```    TankHealth.cs ```  using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class TankHealth : MonoBehaviour { public GameObject effectPrefab1; public GameObject effectPrefab2; public int tankHP; public Text tankLife; public GameObject LifeItem; private int motonoHP; public GameObject Star_get_effect; public GameObject Tank; private float starcount; void Start(){ tankLife.text = "HP:" + tankHP; } void OnTriggerEnter(Collider other){ if (other.gameObject.tag == "EnemyShell") { tankHP -= 1; tankLife.text = "HP:" + tankHP; Destroy (other.gameObject); if (tankHP > 0) { GameObject effect1 = (GameObject)Instantiate (effectPrefab1, transform.position, Quaternion.identity); Destroy (effect1, 1.0f); } else { GameObject effect2 = (GameObject)Instantiate (effectPrefab2, transform.position, Quaternion.identity); Destroy (effect2, 1.0f); this.gameObject.SetActive (false); Invoke ("GoToGameOver", 1.5f); } } else if (other.gameObject.tag == "Star") { motonoHP = tankHP; starcount = 20; tankHP += 10000; while (starcount > 0) { InvokeRepeating ("mutekijikan", 0f, 1f); } tankHP = motonoHP; tankLife.text = "HP:" + tankHP; } } public void AddHP(int amount){ tankHP += amount; if (tankHP > 10 && tankHP < 500) { tankHP = 10; } tankLife.text = "HP:" + tankHP; } void GoToGameOver(){ SceneManager.LoadScene("GameOver"); } void mutekijikan(){ tankLife.text = "むてきあと" + starcount + "秒"; starcount -= 1; } } ```  Starcontroller.cs ```  using System.Collections; using System.Collections.Generic; using UnityEngine; public class Starcontroller : MonoBehaviour { public GameObject Destroyeffect; public AudioClip get_audio; public GameObject Star_get_effect; public GameObject Tank_effect; void OnTriggerEnter(Collider other){ if (other.gameObject.tag == "Player") { Destroy (gameObject); Instantiate (Destroyeffect, transform.position, transform.rotation); AudioSource.PlayClipAtPoint (get_audio, Camera.main.transform.position); StartCoroutine ("destroy_effect"); } } IEnumerator destroy_effect() { yield return new WaitForSeconds (0.5f); Destroy (Destroyeffect); Destroy (get_audio); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードは ``` と、3つのバッククォート同士で挟むと整形されるので、コードを記載する場合は必ずそうしてください。

// こんな感じで整形されます。 void Start() { // do something. }

内容としては、無敵のときはダメージが入らないということですよね?
それであれば、無敵状態の場合はそもそもダメージ計算をしない、とすれば解決すると思いますがいかがでしょうか?

それから、while分は「1フレーム内ですべて実行」されるので、1フレームごとに処理を行いたい場合はUpdateメソッド内などで順次時間を減らすようにしないと想定通りに動きません。

投稿2017/10/15 06:59

edo_m18

総合スコア2283

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

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

sutegoma

2017/10/15 09:59

ありがとうございました。 ダメージが入らないようにlayerをコルーチンで一定時間変更して対応したところうまくいきました。 今後はソースは```で囲うようにします。
sutegoma

2017/10/15 10:01

誰かがこれを見たとき用にソース残しておきます ```else if (other.gameObject.tag == "Star") { StartCoroutine ("muteki"); } 略 IEnumerator muteki(){ gameObject.layer = LayerMask.NameToLayer ("Player_muteki"); yield return new WaitForSeconds (starcount); tankLife.text = "HP:" + tankHP; gameObject.layer = LayerMask.NameToLayer ("Player"); }```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問