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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

889閲覧

一定の場所までまで上がり、その後0に戻したい。

Um_kok

総合スコア39

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/01/06 08:49

編集2021/01/07 00:04

こんにちは、只今ゲーム制作をしております。
そこで詰まってしまったので、質問させていただきます。

現在スペースを押したら、ジャンプしたようにしたいのですが、自分なりにコードを書いてみました

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CarContrl : MonoBehaviour 6{ 7 8 9 // 車のモデル  注意  子オブジェクトです。 10 [SerializeField] private Vector3 modelPos; 11 12 void Update() 13 { 14 if (Input.GetKeyDown(KeyCode.Space)) 15 { 16 print("スペースを押した"); 17 StartCoroutine(CarJump()); 18 } 19 } 20 21 22 23 } 24 /// <summary> 25 /// 車をジャンプする 26 /// </summary> 27 private IEnumerator CarJump() 28 { 29 print("ジャンプ"); 30 var CarJumpPos = 0; 31 var CarJumpMax = 10; 32 var CarJumpPower = 2; 33 34 while (CarJumpPos < CarJumpMax) 35 { 36 CarJumpPos += CarJumpPower; 37 modelPos = 38 new Vector3(modelPos.x, modelPos.y + CarJumpPos, modelPos.z); 39 print("ジャンプしている"); 40 yield return null; 41 } 42 43 while (CarJumpPos >= 0) 44 { 45 CarJumpPos -= CarJumpPower; 46 modelPos -= new Vector3(modelPos.x, modelPos.y - CarJumpPos, modelPos.z); 47 } 48 } 49}

やった事
ジャンプするのは、コルーチンで実行しております。
コードの通り、スペースを押したら、一定値まで上がり、そのあと0に戻るというものです。
注意なのですが、フィールドの modelPos というのは子オブジェクトなためこう言うコードにしております。(親に車を動かすコードが書いてあります。)
スペースを押してみても、動きませんが、コンソールにはスペースを押したしかでません。
コードが見にくいのですが、あまりいいやり方ではないです。うまいコードが欠けていないのはわかっております。
なので、お力をお貸しいただけないでしょうか?
解説やコメントなど加えてくださるとありがたいです。

ーーーーーーーーーーーーーーー 修正後---------------------------------

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class CarContrl : MonoBehaviour 7{ 8 9 10 // 車のモデル  注意  子オブジェクトです。 11 [SerializeField] private Transform modelPos; 12 void Update() 13 { 14 if (Input.GetKeyDown(KeyCode.Space)) 15 { 16 print("スペースを押した"); 17 StartCoroutine(CarJump()); 18 } 19 } 20 21 22 23 } 24 /// <summary> 25 /// 車をジャンプする 26 /// </summary> 27 private IEnumerator CarJump() 28 { 29 print("ジャンプ"); 30 var CarJumpPos = 0; 31 var CarJumpMax = 50; 32 var CarJumpPower = 2; 33 34 while (CarJumpPos < CarJumpMax) 35 { 36 CarJumpPos += CarJumpPower; 37 modelPos.transform.localPosition 38 += new Vector3(transform.localPosition.x, transform.localPosition.y + CarJumpPower, transform.localPosition.z); 39 print("ジャンプしている"); 40 yield return null; 41 } 42 43 while (CarJumpPos > 0) 44 { 45 CarJumpPos -= CarJumpPower; 46 modelPos.transform.localPosition -= new Vector3(transform.localPosition.x, transform.localPosition.y + CarJumpPower, transform.localPosition.z); 47 } 48 } 49}

これで動くようにはなったのですが、Z軸方向に飛んでしまいます。
何故でしょうか?ご意見ください。他にいいコードの書き方を教えてくだされば幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答依頼ありがとうございます。

スペースを押してみても、動きませんが、コンソールにはスペースを押したしかでません。

とのことですが、コルーチンを呼び出す処理がコメントアウトされているのは大丈夫ですか?

C#

1if (Input.GetKeyDown(KeyCode.Space)) { 2 print("スペースを押した"); 3 // StartCoroutine(CarJump()); 4}

追記: コルーチンでのジャンプ処理

一応コピペしてから改造したので仕様が大きく変わってるとは思いませんが、もし違っていたら適宜修正をお願いします。

C#

1using System.Collections; 2using UnityEngine; 3 4public class JumpTest : MonoBehaviour 5{ 6 7 // 車のモデル(子オブジェクト) 8 // 型をTransformに変更 9 [SerializeField] private Transform model_t; 10 11 [SerializeField] private float jumpHeight = 0.4f; 12 [SerializeField] private float jumpSpeed = 5.0f; 13 14 // スペースを連打するとコルーチンが何回も走るので防止用 15 private bool jumping = false; 16 17 void Update() { 18 if (Input.GetKeyDown(KeyCode.Space) && jumping == false) { 19 print("スペースを押した (jumping == false)"); 20 StartCoroutine(CarJump()); 21 } 22 } 23 24 /// <summary> 25 /// 車をジャンプする 26 /// </summary> 27 /* private IEnumerator CarJump() { 28 print("ジャンプ"); 29 var CarJumpPos = 0; 30 var CarJumpMax = 10; 31 var CarJumpPower = 2; 32 33 while (CarJumpPos < CarJumpMax) { 34 CarJumpPos += CarJumpPower; 35 modelPos = 36 new Vector3(modelPos.x, modelPos.y + CarJumpPos, modelPos.z); 37 print("ジャンプしている"); 38 yield return null; 39 } 40 41 while (CarJumpPos >= 0) { 42 CarJumpPos -= CarJumpPower; 43 modelPos -= new Vector3(modelPos.x, modelPos.y - CarJumpPos, modelPos.z); 44 } 45 }*/ 46 47 private IEnumerator CarJump () { 48 49 // モデルがセットされていなければ、エラー吐いてコルーチンが止まってしまうので終了 50 if (model_t == null) yield break; 51 52 print("ジャンプ開始"); 53 jumping = true; 54 55 // 子オブジェクト(車のモデル)のローカル座標(y)が親に対して必ずゼロとは限らないので一応格納。 56 float yOffset = model_t.localPosition.y; 57 // オフセットにジャンプの高さを足したものをジャンプの最終地点とする。 58 float localizedJumpHeight = yOffset + jumpHeight; 59 60 // 目標の高さより低ければ、ポジションを上げていく。 61 while (model_t.localPosition.y < localizedJumpHeight) { 62 // *** yだけいじる *** // 63 // ▼ model_t.localPosition.y = 1 のように直接はいじれないので変数に一度格納。 64 Vector3 localPos = model_t.localPosition; 65 localPos.y += jumpSpeed * Time.deltaTime; // yに足していく 66 localPos.y = Mathf.Clamp(localPos.y, yOffset, localizedJumpHeight); // yが最低値と最大値からはみ出ないようにClamp 67 model_t.localPosition = localPos; // 代入 68 // ******************* // 69 70 yield return null; // ループの場合、この記述がないとフリーズする 71 } 72 73 // 一応、最大値で代入しておく(たぶんなくてもいい) 74 model_t.localPosition = new Vector3(model_t.localPosition.x, localizedJumpHeight, model_t.localPosition.z); 75 76 // オフセット(始めの位置)より高ければポジションを下げる。 77 while (model_t.localPosition.y > yOffset) { 78 // *** yだけいじる *** // 79 Vector3 localPos = model_t.localPosition; 80 localPos.y -= jumpSpeed * Time.deltaTime; // yから引いていく 81 localPos.y = Mathf.Clamp(localPos.y, yOffset, localizedJumpHeight); 82 model_t.localPosition = localPos; 83 // ******************* // 84 85 yield return null; 86 } 87 88 // こっちも一応最低値で代入しておく(たぶんなくてもいい) 89 model_t.localPosition = new Vector3(model_t.localPosition.x, yOffset, model_t.localPosition.z); 90 91 print("ジャンプ終了"); 92 jumping = false; 93 94 // コルーチン終了 95 yield break; 96 } 97}

余談

大きなお世話かもしれませんが、コードをコピペした時、手を加えていないにも関わらずエラーが出ていました。
上のコードはそのエラーを修正したのち、改造したものになります。

原因は {} の数が合っていないという小さいものでしたが、エラーはエラーです。
スクリプトの記述について、今一度ご確認ください。

投稿2021/01/06 09:39

編集2021/01/07 09:53
PinoMatcha

総合スコア368

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

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

Um_kok

2021/01/06 11:27 編集

回答ありがとうございます。 これは、1回無限ループになってしまったことがあったので、その時コメントアウトしました。ミスです。 コメントを消しても、動きません。
Um_kok

2021/01/06 11:25

コメントを消しておきますすみません。
Um_kok

2021/01/07 00:00

質問を修正いたしました。お時間合うときにお願いします。
PinoMatcha

2021/01/07 09:53

回答に追記しました。
PinoMatcha

2021/01/07 09:59 編集

ごめんなさい、修正前のコードに手を加えてしまいました…。 動作は確認済みですが、私のコードは参考程度にでもしてください。
Um_kok

2021/01/07 10:27 編集

回答ありがとうございます。 いえいえ、わかりにくいところに書いてしまって申し訳ありません。 ミスしていたのは私なので、、 貴方様の書いてもらったコードを読みながら一文字ずつ打ってみたところ、 すごい分かりやすかったです。 いつもコメントをたくさん書いてくださってとても感謝しております。 実行してみると思い通りの動きをしてくれました! なるほど、Clamp で高さと低さの範囲を制限するのですね。 あとジャンプ中のことを考えておりませんでした。 やはりまだ私のコードの書き方が余り良くなかったですね。 いい勉強になりました。コードを書くときにはもうちょっと深く考えてみようと思います。 ありがとうございました。困ったことがあったら、またお願いします。
PinoMatcha

2021/01/07 10:43

実装したい処理について、コードを書く前にどういうフローで処理を走らせ、どこでエラーが想定されるのかを考えてみると良いかもしれません。 まぁ別に私もプロではないので、心に留めておいて貰えれば……。 頑張ってください。
Um_kok

2021/01/07 10:54

そうですね。実装前にきちんとエラーのことやその実装に何か抜けがないか、紙にでも書いてやってみます。 貴重なご意見ありがとうございます。 頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問