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

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

ただいまの
回答率

91.01%

  • C#

    5772questions

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

  • Unity

    3022questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1000questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 452

sutegoma

score 27

使用エディター: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);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

// こんな感じで整形されます。  

void Start()  
{  
// do something.  
}  

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/15 18:59

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

    キャンセル

  • 2017/10/15 19: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");
    }```

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • C#

    5772questions

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

  • Unity

    3022questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1000questions

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