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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

4回答

2903閲覧

Unity 死亡時に動けなくさせるプログラムはこれではなぜダメなんですか?

IUYWc1ixztjwmt8

総合スコア2

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/05/19 03:52

編集2021/05/19 03:54

Updateメソッドの中を見てほしいのですが、ここでaliveがTrueの時はHurt,Die,Attack,Jump,Runメソッドを適応するようにしているのでここをreturn falseにしたら死亡時に動けなくなるんじゃないかと思いIf分を使用したのですがvoidだからreturnは返せないよというエラーが出ました。
どうすればいいと思いますか?

まだUnity初めて1週間しかたっていないので簡単な質問でもご了承ください。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using System.Collections.Generic; 5namespace ClearSky 6{ 7 public class SimplePlayerController : MonoBehaviour 8 { 9 public float movePower = 10f; 10 public float jumpPower = 15f; //Set Gravity Scale in Rigidbody2D Component to 5 11 12 private Rigidbody2D rb; 13 private Animator anim; 14 Vector3 movement; 15 private int direction = 1; 16 bool isJumping = false; 17 private bool alive = true; 18 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 rb = GetComponent<Rigidbody2D>(); 24 anim = GetComponent<Animator>(); 25 } 26 27 private void Update() 28 { 29 Restart(); 30 if (alive) 31 { 32 Hurt(); 33 Die(); 34 Attack(); 35 Jump(); 36 Run(); 37 }else{ 38 return false; 39 } 40 } 41 private void OnTriggerEnter2D(Collider2D other) 42 { 43 anim.SetBool("isJump", false); 44 } 45 46 47 void Run() 48 { 49 Vector3 moveVelocity = Vector3.zero; 50 anim.SetBool("isRun", false); 51 52 53 if (Input.GetAxisRaw("Horizontal") < 0) 54 { 55 direction = -1; 56 moveVelocity = Vector3.left; 57 58 transform.localScale = new Vector3(direction, 1, 1); 59 if (!anim.GetBool("isJump")) 60 anim.SetBool("isRun", true); 61 62 } 63 if (Input.GetAxisRaw("Horizontal") > 0) 64 { 65 direction = 1; 66 moveVelocity = Vector3.right; 67 68 transform.localScale = new Vector3(direction, 1, 1); 69 if (!anim.GetBool("isJump")) 70 anim.SetBool("isRun", true); 71 72 } 73 transform.position += moveVelocity * movePower * Time.deltaTime; 74 } 75 void Jump() 76 { 77 if ((Input.GetButtonDown("Jump") || Input.GetAxisRaw("Vertical") > 0) 78 && !anim.GetBool("isJump")) 79 { 80 isJumping = true; 81 anim.SetBool("isJump", true); 82 } 83 if (!isJumping) 84 { 85 return; 86 } 87 88 rb.velocity = Vector2.zero; 89 90 Vector2 jumpVelocity = new Vector2(0, jumpPower); 91 rb.AddForce(jumpVelocity, ForceMode2D.Impulse); 92 93 isJumping = false; 94 } 95 void Attack() 96 { 97 if (Input.GetKeyDown(KeyCode.Alpha1)) 98 { 99 anim.SetTrigger("attack"); 100 } 101 } 102 void Hurt() 103 { 104 if (Input.GetKeyDown(KeyCode.Alpha2)) 105 { 106 anim.SetTrigger("hurt"); 107 if (direction == 1) 108 rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse); 109 else 110 rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse); 111 } 112 } 113 void Die() 114 { 115 if (Input.GetKeyDown(KeyCode.Alpha3)) 116 { 117 anim.SetTrigger("die"); 118 alive = false; 119 rb.gravityScale = 0; 120 rb.velocity = Vector2.zero; 121 122 123 } 124 } 125 void Restart() 126 { 127 if (Input.GetKeyDown(KeyCode.Alpha0)) 128 { 129 anim.SetTrigger("idle"); 130 alive = true; 131 } 132 } 133 134 } 135}

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

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

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

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

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

guest

回答4

0

Update関数はUnityのシステムが提供する機能で値を返すことは出来ませんし、仮にできても、(システムがそういう意図で用意していない限り) aliveに自動的に設定もしてくれません。aliveはアプリが定義した変数ですので、その管理はアプリ自身が行わなければなりません。どうするかと言うと死亡したら自身でtrueを設定するだけです。

投稿2021/05/19 05:06

Serbonis

総合スコア581

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

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

YAmaGNZ

2021/05/19 05:09

aliveは生存フラグでfalseで死亡じゃないですか?
Serbonis

2021/05/19 05:30

そうですね間違いました。
IUYWc1ixztjwmt8

2021/05/19 08:32

回答ありがとうございます、Dieメソッドで死んだときalive = false;と定義しているのですが死亡時動いてしまいます。
guest

0

ベストアンサー

メソッド内で処理終わりたいならreturnとだけ書けばとりあえずそこまでで終わります。
よくあるのが条件判定を先にもってきて判断する書き方です

cs

1 2void Attack () { 3 if(isDead) return; // 死んでたら実行しない 4 if(isJump) return; // ジャンプ中は実行しない 5 if(isAttack) return; // 攻撃中なら攻撃しない 6 7 // 攻撃処理 8}

今回提示コードだととりあえず下記の通りreturnだけにすれば動くと思いますが
このコードあんまり意味ないと思います。aliveでなければelseに入るんですが、そこでreturnしたところでスキップされる処理がありません。そもそもaliveがtrueのときのみ処理走ってるはずなので、aliveがfalseになれば動かなくなるんじゃないでしょうか?

cs

1 private void Update() 2 { 3 Restart(); 4 if (alive) 5 { 6 Hurt(); 7 Die(); 8 Attack(); 9 Jump(); 10 Run(); 11 }else{ 12 return; 13 } 14 }

投稿2021/05/19 04:16

hogefugapiyo

総合スコア3302

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

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

IUYWc1ixztjwmt8

2021/05/19 08:26

自分のコードのDieメソッドでaliveがfalseになっているのに死亡時動けてしまうんですよね。
hogefugapiyo

2021/05/19 08:55

private bool alive = true; を public bool alive = true;にするとインスペクターでfalse/trueを確認できるので、まずは死んだときにfalseになっているかを確認してみてください
IUYWc1ixztjwmt8

2021/05/19 09:44 編集

死んだときにはfalseになっていませんでした。 boolの値をfalseにした時は動かなくなりました。
hogefugapiyo

2021/05/19 09:45

① 自分のコードのDieメソッドでaliveがfalseになっているのに死亡時動けてしまうんですよね。 ② falseにしたら動かなくなりましたね。 ということは、①が間違っているということになります。aliveがfalseなら動かなくなることが確認できているので、死んだときにaliveがfalseになっていない or すぐtrueに戻っている のでしょう。
IUYWc1ixztjwmt8

2021/05/19 09:49

これもしかしたらなんですが、 3ボタンを押した時にしか発動されなくて、敵と接触した時に死んでも発動されないんじゃないんですか? ```cs if (Input.GetKeyDown(KeyCode.Alpha3)) ```
IUYWc1ixztjwmt8

2021/05/19 09:53

3ボタンを押したときはちゃんと死んだとき何も操作できないようになってました、ありがとうございます。
hogefugapiyo

2021/05/19 09:54

もちろんそうですよ。 動作確認のために自分でこう書かれているんじゃないんですか?
IUYWc1ixztjwmt8

2021/05/19 10:00

いえ、これはAsset Storeのキャラクターのプログラムなので自分で書いたプログラムじゃないんです。すみませんでした。
hogefugapiyo

2021/05/19 10:02

そうなんですね、解決してよかったです。
guest

0

voidだからreturnは返せないよというエラーが出ました。

voidじゃなくするとか

投稿2021/05/19 03:58

y_waiwai

総合スコア87719

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

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

0

>voidだからreturnは返せないよというエラーが出ました
返さなければいいんじゃなですか?

投稿2021/05/19 03:56

YAmaGNZ

総合スコア10222

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

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

IUYWc1ixztjwmt8

2021/05/19 04:07

return falseを falseだけにするってことですか?
YAmaGNZ

2021/05/19 04:19 編集

return false; を書かなければいいのではないですか? voidは値を返さないということなのでreturn;と値を返さないでreturnするという方法もあります。 C#の基本的な文法も学習されることをお勧めします。 また、質問する際は自分で解釈したエラー内容ではなくそのまま記載することをお勧めします。
YAmaGNZ

2021/05/19 04:21

というか、ソース見たら他のところでしっかりvoidの関数利用してreturnもしているじゃないですか。 ご自身でどのような意味を持つのか理解されていないということになりますね。 なおのことC#の基本的な文法を学習されるべきかと思います。
IUYWc1ixztjwmt8

2021/05/19 08:23

回答ありがとうございます、すみませんこれはUnityStoreで購入したAssetのコードなんで自分で書いてないんですよね。ですが、return;も学んだはずなのにreturn falseって書いてしまいました。勉強不足でしたすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問