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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

3471閲覧

unityで無敵時間

ShiR0

総合スコア17

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2018/11/03 17:28

前提・実現したいこと

unityで「敵に当たると、HPが減る」というスクリプトを書き実行したのですが、連続でHPが減っていきすぐに倒れるようになってしまいました。なので数秒無敵時間をつけようと思うのですが、私はC#初心者なので作ったコードが変になると怖いので質問しました。

発生している問題・エラーメッセージ

HPが一瞬でなくなる

該当のソースコード

using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class Health : MonoBehaviour { public int Maxhealth = 100; public Text shellLabel; void Start() { shellLabel.text = ("+") + Maxhealth; } void OnControllerColliderHit(ControllerColliderHit hit) { if (hit.gameObject.tag == "ta") { Maxhealth -= Random.Range(5, 12); shellLabel.text = ("+") + Maxhealth; } } private void Update() { if (Maxhealth == 0) { SceneManager.LoadScene("gameover"); } } }

試したこと

unityC#の本を読みましたが必要とする記述がありませんでした。

補足情報(FW/ツールのバージョンなど)

unity2018.2.4f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

いくつかの方法があります。
1つは、接触後に自信を無敵とし敵を素通りさせる場合は、colliderを一時的になくすという方法もあります。ゲームオブジェクトのLayerを新規に作成し、collision Matrixを設定します。敵との当たり判定はなくすけど、アイテムや障害物(壁、床など)との当たり判定は残したいなど色々設定できます。
これはUnityに特化した方法です。

一般的には、フラグをたてて、フラグが立っている期間は敵と接触してもライフが減らないように実装します。
mutekiFlagmutekiTImetimeStepを追記しました。
適当な場所で宣言し初期値を設定してください。

void OnControllerColliderHit(ControllerColliderHit hit) { if (hit.gameObject.tag == "ta" && mutekiFlag == 0) { mutekiFlag = 1; Maxhealth -= Random.Range(5, 12); shellLabel.text = ("+") + Maxhealth; } }
private void Update() { if(mutekiFlag == 1){ mutekiTime -= timeStep; if(mutekiTime < 0){ mutekiFlag = 0; } if (Maxhealth == 0) { SceneManager.LoadScene("gameover"); } }

この実装方法の場合、自身の当たり判定は残っているので、ライフは減りませんがcollider同士で押し合うことは可能です。例えば無敵時間後に敵を素通りしない仕様とするならこの方法が適しています。

投稿2018/11/03 23:55

YOshim

総合スコア1085

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

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

ShiR0

2018/11/04 09:24

すみません言われた通りにしたのですが、変わらずすぐに0になってしまいます。 public class Health : MonoBehaviour { public int Maxhealth = 100; public Text shellLabel; public float mutekiFlag =0; public float mutekiTime = 3; public float timeStep = 0; void Start() { shellLabel.text = ("+") + Maxhealth; } void OnControllerColliderHit(ControllerColliderHit hit) { if (hit.gameObject.tag == "ta" && mutekiFlag == 0) { mutekiFlag = 1; Maxhealth -= Random.Range(5, 12); shellLabel.text = ("+") + Maxhealth; } } private void Update() { if(mutekiFlag == 1){ mutekiTime -= timeStep; if(mutekiTime < 0){ mutekiFlag = 0; } if (Maxhealth <= 0) { SceneManager.LoadScene("gameover"); } } } }
YOshim

2018/11/04 13:08

mutekiTimeが短いです。 update()は非常に短い時間間隔で実行されますので、3だとすぐに0になります。 とりあえずmutekiTimeの初期値を増やしてください。 あと、指摘が漏れていましたが、一度無敵時間が終われば、mutekiTimeに改めて初期値を入力してください。そうしないと2回目以降の接触でmutekiTimeが-からはじまり、すぐに無敵状態が解除されます。 *現在timeStepが0なのになぜ無敵状態が解除されるのかが少し気になります。
ShiR0

2018/11/07 13:59

返信できなくて申し訳ないです。値を大きくしたりしたら、動きました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問