質問するログイン新規登録

質問編集履歴

2

初心者マークをつけました。

2020/01/12 07:55

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
File without changes
body CHANGED
@@ -131,5 +131,5 @@
131
131
  ・障害物の設置(キャラと障害物に当たり判定をつけた)
132
132
  ・CPUキャラの自走(y軸下に向けて進むだけですが)
133
133
  ・一応、加速アイテムを取って加速しっぱなしの映像を貼っておきます。
134
- (とあるマンガの非営利二次創作で、拙い絵でお恥ずかしいのですがスルーしてください)
134
+ (とあるマンガの非営利二次創作で、拙い絵でお恥ずかしいのですがスルーお願します
135
135
  https://streamable.com/p6esx

1

投稿時の問題「加速できない」→現在「加速するが元の速度に戻らない」ということで、「加速できない」の自己解決も交え改訂しました。

2020/01/12 07:54

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- Unity縦スクロール障害物競争で、加速装置(パネル)作りたい
1
+ Unity縦スクロール障害物競争で、加速アイテム取っあと元の速さに戻るようにした
body CHANGED
@@ -1,70 +1,122 @@
1
- ### Unity縦スクロール障害物競争で、加速装置(パネル)を作りたい
1
+ ### Unity縦スクロール障害物競争で、加速アイテムを作りたい
2
2
 
3
- Unity、C#ともに初心者、そしてteratailでの質問が初めてなので、至らぬ点あるかと思いますがご容赦ください。
3
+ Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
4
4
  Unityの3Dモードで、縦スクロールの、障害物競争のようなゲームを作っています。
5
5
  具体的に書くと、「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
6
- 途中、①障害物(当たり判定使用)、②加速パネル踏んづけると数秒走るのが速くなる)、そして③アビリティパネルがある。
6
+ 途中、①障害物(当たり判定使用)、②加速アイテム一定時間速くなる)、そして③アビリティアイテムがある。
7
- アビリティパネル踏んづけるとそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
7
+ アビリティアイテムるとそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
8
- CPUも障害物を避けたり加速パネルやアビリティパネルを狙ってきたりする。」といったところです。
8
+ CPUも障害物を避けたり加速アイテムやアビリティアイテムを狙ってきたりする。」といったところです。
9
9
 
10
- この度は加速パネルについて質問致します。
10
+ この度は加速アイテムについて質問致します。
11
- このページからリンクを貼ることは避けますが、
12
- 「unity 加速装置」と検索講座ページが2つほど出てきて、どちらも同じスクリプトが載っています下記2つめ
11
+ まず、「unity 加速装置」と検索して出る講座ページの「加速パネル踏んづけて加速」ではダメだったので、
13
- これを試しましたが、
14
- ・当方のキャラクターオブジェクはrigidbody2D
12
+ 「加速アイテム(ゲッして加速)」にしました。
15
- ・しかし、お手本スクリプトのGet.Component<>はrigidbody
16
- おそらくこの点が問題なのではと思うのですが、作用しません。3Dのキューブに2Dのキャラがめりこむだけです。
17
- Get.Component<>のrigidbodyをrigidbody2Dに書き換えるとunityのコンソールにエラーが出ます(下記1つめ)。
18
13
 
19
- 解決法は、
20
- ①お手本スクリプトをrigidbosy2D仕様に書き換える
21
- ②加速オブジェクトのスクリプトではなく、自機キャラのスクリプトに記述する このどちらかかと思うのですが、
22
-
23
- ①を取るべきだとしたら、単に書き方がわからないという話になるので申し訳ないのですが、書き方をご教授頂きたく存じます。
24
- ②だとしたら、ifで書けるのかとは思うのですが、
25
- 日本語で言うと「もし加速パネルを踏んづけたら、A秒間、速度が+Bされる」という書き方がわからないので、
26
- やはり申し訳ないのですが書き方をご教授頂きたく存じます。
27
-
28
- ### 発生している問題・エラーメッセージ
29
-
30
- ```
31
- CS1503:Argument2:cannot convert from 'UnityEngine.ForceMode'to'UnityEngine.ForceMode2D'
32
- ```
33
-
34
- ### 該当のソーコード
14
+ ↓playerクリプトまるごと
35
-
36
15
  ```C#
37
16
  using System.Collections;
38
17
  using System.Collections.Generic;
39
18
  using UnityEngine;
40
19
 
41
- public class kasoku : MonoBehaviour
20
+ public class player : MonoBehaviour
42
21
  {
22
+ public float speed;//インスペクタで速度をいじくる宣言
23
+
43
- void OnTriggerEnter(Collider other)
24
+ private Animator anim = null;
44
- {
45
- other.gameObject.GetComponent<Rigidbody>().AddForce(new Vector3(0, -30, 0),ForceMode.VelocityChange);
46
- }//うちのキャラたちはRB2Dなので、これで動くか不明→だめだった
47
- //ゴールは下方向(y軸マイナス方向)なで、Vevtor3のyはマイナスに書き換えました
25
+ private Rigidbody2D rb = null;//アニメとRB変数宣言
26
+
48
- // Start is called before the first frame update
27
+ private string ochaTag = "Ocha";//★お茶タグを宣言
28
+
49
29
  void Start()
50
30
  {
51
-
31
+ anim = GetComponent<Animator>();
32
+ rb = GetComponent<Rigidbody2D>();//インスタンスを取得命令
52
33
  }
53
34
 
54
35
  // Update is called once per frame
36
+ private bool isKasoku = false;//★加速boolを宣言、通常は加速してないよ(お茶を取ってないよ)
55
- void Update()
37
+ void FixedUpdate()
56
38
  {
57
-
39
+ float verticalKey = Input.GetAxis("Vertical");//上下キー宣言
40
+ float horizontalKey = Input.GetAxis("Horizontal");//左右キー宣言
41
+ float ySpeed = 0.0f;//y軸移動速度の初期値
42
+ float xSpeed = 0.0f;//x軸移動速度の初期値
43
+ if(verticalKey<0)//下キーが押されたら(上に行く必要がないゲームなので下キーのみ指定しています)
44
+ {
45
+ anim.SetBool("run", true);//アニメon
46
+ ySpeed = -speed;//走る
47
+ }
48
+ else
49
+ {
50
+ anim.SetBool("run", false);//アニメoff
51
+ ySpeed = 0.0f;//走らない
52
+ }
53
+
54
+ if(horizontalKey>0)//右キーが押されたら
55
+ {
56
+ xSpeed = speed;//右に行く
57
+ }
58
+ else if(horizontalKey<0)//左キーが押されたら
59
+ {
60
+ xSpeed = -speed;//左に行く
61
+ }
62
+ rb.velocity = new Vector2(xSpeed, ySpeed);//上記の記述をこの式に代入して動いているそうですがよくわかってません。
63
+
64
+ if(isKasoku==true)//★加速フラグがtrueの場合の挙動
65
+ {
66
+ rb.velocity = new Vector2(xSpeed,ySpeed*4);//★y軸移動速度が4倍になる(今後通常時の走行速度の違う他キャラも増やすので、この方が汎用性があります)
67
+ }
68
+ else if(isKasoku==false)//★加速フラグがfalse、つまり通常時
69
+ {
70
+ rb.velocity = new Vector2(xSpeed, ySpeed);//★通常時と同じ速度を記述
71
+ }
72
+ }
73
+ private void OnCollisionEnter2D(Collision2D collision)//★(お茶との)衝突判定
74
+ {
75
+ if(collision.collider.tag==ochaTag)//★お茶タグとぶつかったら
76
+ {
77
+ isKasoku = true;//★加速フラグがtrueになるよ
78
+ Destroy(collision.gameObject);//お茶が消えるよ
79
+ }
58
80
  }
59
81
  }
60
-
82
+ //アイテムによる加速までできた。
61
83
  ```
62
84
 
85
+ 今困っているのは、加速したあと元の速さに戻せないことです。
86
+ 例:5秒間、走る速さが4倍になる。その後は元の速さで走る(キャラクターごとに元の走る速さは違います)
87
+ というふうにしたいです。
88
+
63
89
  ### 試したこと
90
+ ・コルーチンが正解かと思い、上記スクリプトにねじ込もうとしました。
64
91
 
92
+ ###エラー、メッセージ
93
+ 以下、上記スクリプトにコルーチンをねじ込んだ部分を抜粋
94
+ ```C#
95
+ void Start()
96
+ {
97
+ anim = GetComponent<Animator>();
65
- ・Get.Component<>のrigidbodyrigidbody2Dに書き換えた(上記のとおりだめでした)
98
+ rb = GetComponent<Rigidbody2D>();//インスタンス取得命令
99
+ StartCoroutine("Kasoku");
100
+ }
101
+ IEnumerable Kasoku()
102
+ {
103
+ rb.velocity = new Vector2(xSpeed, ySpeed * 4);
104
+
105
+ yield return new WaitForSeconds(5)
106
+
107
+ //ここに「元の速度に戻る」と書くべきだと思うのですが、書き方がわかりません。
108
+ }
109
+ ```
66
- ・スクリプトを3Dキュではなく自分で描た加速パネルの画像(2DandUI)くっつけ、is triggerにチェックを入
110
+ ①この質問ペでは見えませんがVisuialStdioにおてxSpeedとySpeed赤線が引か
111
+ 「現在のコンテキストに(xSpeed/ySpeed)という名前は存在しません」と出ます。
112
+ playerスクリプト内で定義(?)していると思うのですがだめなのでしょうか。
113
+ ②スクリプト内にも書きましたが、元の速度に戻るという命令の書き方がわかりません。
67
-  (エラーは出ませんが作用もありません
114
+ 丸投げ状態で申し訳のですがご教授頂きく存じます。
115
+
116
+ ★playerスクリプトですが、上記のものはvelocityで動かしていますが、アドバイスを頂きAddForceで動くものも作りました。
117
+ 今回はvelocityのものを載せましたが、AddForceの方が加速と減速の問題が解決しやすいならそちらにしますのでお教え頂きたいです。
118
+
119
+
68
120
  ### 補足情報(FW/ツールのバージョンなど)
69
121
 
70
122
  ■作業環境
@@ -75,4 +127,9 @@
75
127
  ・キャラクターのアニメーション実装、及び下キー入力によるアニメ遷移
76
128
   (待機時:歩いている→下キー入力:走る(手足の動きが早くなる))
77
129
  ・キャラクターの下と左右の移動。上に行く必要はないので、上キーを入力しても動きません。
130
+ ・カメラのプレイヤー追従(y軸)
78
- ・障害物の設置(キャラと障害物に当たり判定をつけた)
131
+ ・障害物の設置(キャラと障害物に当たり判定をつけた)
132
+ ・CPUキャラの自走(y軸下に向けて進むだけですが)
133
+ ・一応、加速アイテムを取って加速しっぱなしの映像を貼っておきます。
134
+ (とあるマンガの非営利二次創作で、拙い絵でお恥ずかしいのですがスルーしてください)
135
+ https://streamable.com/p6esx