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

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

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

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

Unity

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

Q&A

解決済

4回答

5658閲覧

Unity2Dでグラディウスのオプションのようなものが作りたいです

makkun2425

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2018/12/27 10:39

編集2018/12/28 08:26

Unity2Dでグラディウスのオプションのようなものが作りたいです

Unity2Dで横スクロールのSTGを作ろうと思っていて、
グラディウスのオプションのようなパワーアップを作りたいと思っていますが
プログラミングは初心の初心で全く分かりません...
とりあえずこんなものを仮に使っています

using UnityEngine; using System.Collections; public class Homing : MonoBehaviour { GameObject Player; GameObject homingObj; public float Speed; // Use this for initialization void Start() { Player = GameObject.Find("Player"); homingObj = GameObject.Find("Homing"); } // Update is called once per frame void Update() { this.transform.position = Vector2.MoveTowards(this.transform.position, new Vector2(Player.transform.position.x, Player.transform.position.y), Speed * Time.deltaTime); } }

イメージ説明

ですが、近道をして追いかけてくるのではなく、
追われる側が通った所を通るようにして追ってほしいのです。
そして追われる側が動きを止めると追う側も止まるようにしてほしいです。
ちなみにオプションは2つ付けるつもりです。
お願いします。

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

Unity.2018.2.8f1 Personal(64bit)

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

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

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

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

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

bochan2

2018/12/27 12:09

動画のリンクか挙動のイラストなどを上げれば、回答する人の助けになるのでお願いします
makkun2425

2018/12/27 14:18

分かりました。 今日はもう遅いので後程上げることにします。ありがとうございます。
Hawn

2018/12/28 08:03 編集

こちらの回答はオプション一個のみの回答で良いのでしょうか? それとも今後の拡張性を考えてオプション複数個に増えるのを想定した回答の方が良いのでしょうか?
makkun2425

2018/12/28 08:23

オプションは2個つけるつもりです。 言葉足らずですみません…
Hawn

2018/12/29 02:53 編集

判りました。
guest

回答4

0

ベストアンサー

まずオプション一つで想定した動きをするのか確認したい為、
下記内容試して下さい。

1.シーン上にPlayerとOptionをひとつづつ用意します。
2.下記スクリプトをPlayrに取り付けて、そのInspectorからoptionObjへ動かしたいOptionを入れて下さい。
3.再生ボタンを押してPlayrを暫く移動させ、追随するか確認して下さい。

C#

1using UnityEngine; 2using System.Collections.Generic; 3 4public class OptionMoveControll : MonoBehaviour{ 5 6 public GameObject optionObj; 7 int interval = 30; 8 9 List<Vector3> playerPosition = new List<Vector3>(); 10 void Start() 11 { 12 playerPosition.Add(transform.localPosition); 13 } 14 void Update() 15 { 16 if (playerPosition[playerPosition.Count - 1] != this.transform.localPosition) 17 { 18 playerPosition.Add(transform.localPosition); 19 20 if (playerPosition.Count > interval) 21 { 22 optionObj.transform.localPosition = playerPosition[0]; 23 playerPosition.RemoveAt(0); 24 } 25 } 26 } 27}

シーンのオブジェクト配置やPlayerの移動制御の方法によっては変な動きすると思うのでそれが発生したら教えて下さい。

上記が問題無く動作すれば追記1,2に進んで下さい。

追記1:Optionを2個以上に増やす場合

1.上記の状態から更にシーン上にOption2を追加した場合、Option1OptionMoveControllをアタッチしてインスペクタからoptionObjにはOption2を入れて下さい。
2.これを繰り返せばオプションの数は制限無く増やせます。

追記2:Optionとの間隔を変える

int intervalで間隔を決めています。
ここの数値が大きくなれば距離が離れ小さくすれば距離が短くなります。

直接コードから30の部分を書き換えて調整するか、
public int intervalに変更してインスペクタから変更出来るようにすると良いです。


ランタイム中の適用に関しての追記3は質問の先の段階なので削除しました。

投稿2018/12/28 09:30

編集2018/12/29 02:55
Hawn

総合スコア1222

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

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

makkun2425

2018/12/28 12:49

こちらもいろいろ試してみたのですが、残念ながらついてきてくれません... バージョンの違いで対応していないのでしょうか? ここまでしてくれたのに、何もわからなくてすみません...
Hawn

2018/12/29 02:56 編集

バージョンの違いで動かなくなる類のコードでは無いのでその可能性は極少です。 一応同じ2018.2.8f1で動くのは確認しました。 私とは別のizmktrさんのコードでまだ少しエラーが出るところがありますが、直せば初回一回オプションがワープして以降は問題なく動きます。 そちらは試したでしょうか?
Hawn

2018/12/28 14:28 編集

それといろいろ試したというのは具体的に何を試したのでしょうか? 「ついてきてくれません」というのはオプションが全く動かないという事で違いないでしょうか? 質問で提示されていないPlayerを動かすクラスが影響しているか、自身で作成したHomingクラスをまだオブジェクトに付けたままかもしれないのでその辺り見直して下さい。
Hawn

2018/12/28 15:03

一番考えられるのは手順2の「InspectorからoptionObjへ動かしたいOptionを入れて下さい」が出来てない可能性が高い気がしますが。
makkun2425

2018/12/28 15:05

いろいろ試したというのは、 rightbodyをいじってみたり、 テスト用のsceneで作動させてみたり、 他の方々のコードも試してみたりといった感じの事をしました。 そうした上で全く動かないのですが、 同じバージョンで動作済みならばこっちに問題があるようですね。 念のため後日playerのスクリプトを送ってみます。 手間をおかけしてすみません…
makkun2425

2018/12/28 15:09

それが、ちゃんとPlayerにスクリプトを入れ optionObjにプレハブ化した「Option1」を入れて有ります。 明日もう一度確認してみます。
Hawn

2018/12/28 17:33

流石に無いと思いますが「シーン上」の「Option1」を入れずに、Projectから直接「Option1」のPrefabを入れてるという事は無いでしょうか?
makkun2425

2018/12/29 01:21 編集

その通りでした。 シーンとprojectで違うんですね... 無事ついてきてくれます!ありがとうございます! izmktrさんのでも動きました!
Hawn

2018/12/29 02:48 編集

そうでしたか。 動いたようであれば良かったです。 オプション二個以上の方法は追記で書いておきました。
makkun2425

2018/12/29 08:11

本当に助かりました! 何事も丁寧に対応していただいて本当にありがとうございます! これからはできる限り自力で頑張っていきたいと思います。 最後まで付き添っていただいて本当にありがとうございました!
guest

0

こうですかね?
bochan2さんのスクリプトのおかしい部分を修正しただけですが…

csharp

1/* 自機に貼り付けるスクリプト */ 2public ChasedObject:MonoBehavior{ 3 [System.NonSerialized] 4 public List<Vector3> queue = new List<Vector3>(); 5 int max = 60; /* オプションに入れるdalayの最大値より大きい値を設定 */ 6 Vector3 beforeposition; 7 void Start(){ 8 beforeposition = transform.position; 9 } 10 11 void Update(){ 12 if (beforeposition != transform.position){ 13 queue.Add(transform.position); 14 if (max < queue.Count) queue.RemoveAt(0); 15 beforeposition = transform.position; 16 } 17 } 18} 19 20/* オプションに貼り付けるスクリプト */ 21/* chasedに自機のインスタンスを、dalayに遅らせる時間を設定 */ 22 23class ChaserObject: MonoBehavior{ 24 public ChasedObject chased; 25 public int dalay; 26 27 void Update(){ 28 if (dalay < chased.queue.Count){ 29 transform.position = chased.queue[dalay]; 30 } 31 } 32}

投稿2018/12/28 09:28

izmktr

総合スコア2856

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

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

0

敵側

C#

1 2public SampleScript:MonoBehavior:{ 3 int l=30; 4 public TargetScript target; 5 int count; 6 void Start(){ 7 count=0; 8 } 9 void Update(){ 10 if(count<target.p.Count) 11 transform.position=target.p[count]; 12 count++; 13 } 14} 15

こっちはターゲット側に貼り付けて下さい

C#

1public TargetScript :MonoBehavior:{ 2 public List<Vector3> p; 3 public int l=60; 4 void Start(){ 5 p=new List<Vector3>(); 6 } 7 void Update(){ 8 p.Add(transform.position); 9 if(p.Count>l) 10 p.RemoveAt(0); 11 } 12}

デバッグしてませんが、とりあえず取り急ぎ。

投稿2018/12/27 12:24

bochan2

総合スコア2050

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

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

0

オプションの数が1個であれば,下記サイトのやり方で実現できると思います.
VRの入力を保存し遅延追従させる

AnimationCurveのAddKey()を使って「主機(追われる側)がこの時間にこの位置にいた」という情報を保存していき,Evaluate()で一定時間遅らせて位置を取り出すという流れになると思います.

ボタンを押すたびにオプションが増える,等の場合は,オプションが生成された順番に応じて遅延時間を増やす処理が必要になるかと思います.

投稿2018/12/27 12:24

Takaya901

総合スコア181

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問