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

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

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

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

Unity

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

Q&A

解決済

3回答

2761閲覧

Unity2Dでキャラを自動で徘徊させたい

anyone_anytime

総合スコア3

C#

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

Unity

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

0グッド

1クリップ

投稿2021/06/17 04:34

編集2021/06/17 06:32

前提・実現したいこと

やりたいことしてはマップ上でキャラクターを自動で徘徊させたいと考えています。
ただマップが複雑な形なのでGameObjetをチョコチョコ置いて、地点Aに着いたら地点Bへまたそこから地点Cへ。。
という感じにしようと思っています。

やってみたこと

C#

1public class JarasyController: MonoBehaviour 2{ 3 public float speed; 4 GameObject marker1; 5 GameObject marker2; 6 GameObject marker3; 7 GameObject marker4; 8 9 void Start() 10 { 11 marker1 = GameObject.Find("Marker1"); 12 marker2 = GameObject.Find("Marker2"); 13 marker3 = GameObject.Find("Marker3"); 14 marker4 = GameObject.Find("Marker4"); 15 } 16 17 void Update() 18 { 19 transform.position = Vector3.MoveTowards(transform.position, marker1.transform.position, speed * Time.deltaTime); 20 if (marker1.transform.position == transform.position) 21 { 22 transform.position = Vector3.MoveTowards(transform.position, marker2.transform.position, speed * Time.deltaTime); 23 } 24 } 25}

・そのほか
当たり判定が出たら次の地点へMoveToWardsで移動
にしてみるもなぜか次の地点へはいかずその場で固まったままでした。
当たった場合ログを出すようにしてみると、ログは問題なく出ました

NavMeshも試みたんですがマップはTileMapを使用せずSpriteRendererなので今回は出来なさそうでした。
もしSpriteRendererで可能であれば教えていただきたいです

###まとめ
他に何か徘徊させることができるアセットなどがあれば教えていただきたいです。
ChinemachineのDollyCartのようなもので,2Dで使えるものってないんでしょうか!
GameObjectを置いてくのは少し面倒なもので・・

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

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

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

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

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

fana

2021/06/17 06:07

ifの条件を満たした際の処理に書かれている marker.transform.position の marker って何者ですか?
anyone_anytime

2021/06/17 06:23

地点として置いているGameObjectです!
fana

2021/06/17 06:31 編集

いや, marker1, marker2, marker3, marker4 という(名称末尾に番号が付いた)奴らはメンバとして存在していることが読み取れるのですが, 末尾に番号がついていない marker という奴は提示コードからは正体不明に見えるのです. marker2, marker3, marker4 というやつらは,実装している処理とは無関係なのですか? (巡回地点は marker1~marker4 ではなくて,それらとは別の marker という奴なのですか?)
anyone_anytime

2021/06/17 06:31

ごめんなさい。2をかき忘れていたみたいです。marker2としてみていただければ
guest

回答3

0

ちなみに、以下のコードで正しく動かすことができました!
ただこれだと直線でしか動かすことができないのと書き方が面倒だったのでDOPathを使いました

C#

1public class JarasyController : MonoBehaviour 2{ 3 public float speed; 4 GameObject[] TargetPoints; 5 GameObject marker0; 6 GameObject marker1; 7 GameObject marker2; 8 GameObject marker3; 9 private int target = 0; 10 11 12 void Start() 13 { 14 marker0 = GameObject.Find("Marker0"); 15 marker1 = GameObject.Find("Marker1"); 16 marker2 = GameObject.Find("Marker2"); 17 marker3 = GameObject.Find("Marker3"); 18 TargetPoints = new GameObject[] { marker0, marker1, marker2, marker3 }; 19 20 } 21 22 23 void Update() 24 { 25 if(transform.position == TargetPoints[target].transform.position) 26 { 27 target++; 28 29 } 30 31 transform.position = Vector3.MoveTowards(transform.position, TargetPoints[target].transform.position, speed * Time.deltaTime); 32 } 33}

投稿2021/06/18 00:38

編集2021/06/21 08:21
anyone_anytime

総合スコア3

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

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

0

ベストアンサー

先に関係ない話をすると、Waypointとか複数個登録したい場合はListとかで可変にしておくと楽です。
リストの0番目に到着→リストの1番目に移動みたいな感じでプログラムできるので、処理が書きやすくなります。

・・・

NPCをどういう移動をさせたいかにもよるんですが
事前に手動でルートを決めるので良いなら、DOTweenのDoPathというのが便利です。
(DOTweenはUnityアセットで有料/無料がありますが無料版でほぼすべての機能が使えます)

※ 紹介サイトは3D動かしてますが、2Dでも考え方は同じです。


DoTweenのDOPathを使ったキャラクター移動
https://www.karvan1230.com/entry/2018/06/06/001025

指定した座標を順に移動させるDOTweenのDOPathで進行方向に体を向かせる方法と各座標の到達検知【Unity】【DOTween】
https://kan-kikuchi.hatenablog.com/entry/DOTween_Path

※ サイトで紹介されているDO Tween Pathコンポーネントはたしか有料版のみだった気がするので読み飛ばしていただいても構いません


ちなみにWaypoint到達時のコールバックや、ループ移動(ひたすらぐるぐる周回するとかも可能)、直角ではなく点同士を弧を描くように移動などかゆいところに手が届くオプションも色々あります。

投稿2021/06/17 07:29

hogefugapiyo

総合スコア3302

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

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

anyone_anytime

2021/06/18 00:39

ありがとうございます!2Dでも使えるんですね。。!助かりました。
guest

0

Unityは使ったことが無いので疎いのですが,
Update()というメソッドが,進行のために毎回(毎「フレーム」というのか?)呼ばれるのだとしたら,
そのコードでは,

CSharp

1 void Update() 2 { 3 //現在の状態どうあれ,何も考慮せずに,marker1 の方向に座標を更新する 4 transform.position = Vector3.MoveTowards(transform.position, marker1.transform.position, speed * Time.deltaTime); 5 //その結果,座標が marker1 と同じになったならば 6 if (marker1.transform.position == transform.position) 7 { //marker2 の方向に座標を更新する 8 transform.position = Vector3.MoveTowards(transform.position, marker2.transform.position, speed * Time.deltaTime); 9 } 10 }

という(注釈として書いた内容の)処理になるかと.

つまり,transform.position は,

  • 最初(にどこにいるのかわからないが)は,marker1 の方向に変化していく
  • 一度 marker1 の位置に達したら,以降は,

「marker1 と marker2 の間であって,おそらくは marker1 に極めて近い場所」にしかならない

という振る舞いになるでしょう.

とりあえず Update() 内の1行目の
【「現在向かいたい地点がどこなのか?」を全く考慮せずに,常に marker1 の方向に座標を変化させる】というところから,やりたいことと合っていないでしょう.

少なくとも,

  • 「今現在,向かうべき地点とは {marker1, marker2, marker3, marker4} のどれなのか?」
  • 「目標地点に到達したとき,次に向かうべき地点を {marker1, marker2, marker3, marker4} のどれにするのか?」

という話を解決(=実装)する必要があるでしょう.

投稿2021/06/17 06:45

編集2021/06/17 06:53
fana

総合スコア11954

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問