アプリ版:「スタンプのみでお礼する」機能のリリースについて

ゲーム制作で、壁にぶち当たってます。
ゲームエンジンは、Unityを使ってます。
言語の理解度は、C♯とJava(Androidスタジオを使うつもりでもあったので。。)の入門書を理解した程度です。
また、Unityの入門書で、サンプルゲームを作成して基本的な操作も学びました。
具体的には、既成アセットを用いたオブジェクトやテクスチャの配置等、既成スクリプトによるゲーム作成です。
そこで、ぶち当たってる壁を書いてみます。いざ、自分で考えてゲームを作成しようとすると、以下の事が問題となり全く進みません。(まずは、単純なマップに主人公が居て、スライムが無限生成され主人公に向かってきてそれをオートで主人公が切り倒して、お金と経験値を得て、宝箱からアイテムを得る。そんなRPGのゲームの一場面を作りたいです。)
①アセットキャラの使い方。
入門書では、配置するだけで動くキャラを設定できたのですが、例えば、「スペースキーで攻撃」をしたい場合、おそらく「スペースキーで攻撃するスクリプト」と「攻撃するアニメーション」が必要で、「攻撃するアニメーション」が作れない。また、アニメーションの設定がわからない。
②スクリプトが書けない。
入門書では、書いてあるスクリプトの意味は理解できます。
でも、いざ自分で書くとなると、
どのクラスのどのメソッドを書けば良いのかがわからない。よく、入門書では「この動きをしたいときは、このクラスのこのメソッドを用いて引数にこれを渡せばオケ」とか書いてて、教えてくれれば意味は理解は出来るんですが、そもそも知識が無いと「このクラスのこのメソッド」が浮かんでこない。
③英語の壁
高校で偏差値60程度の、普通の学生よりちょっとマシなレベルだと、解説を読んでも分かりかねる。。。

以上のような壁で、出来そうで出来ない焦燥感があってイライラしてます。
①については今日また検索するなり試すなりして、もう少し前進させようと思うのですが、②が大きな壁に感じます。
おそらく、リファレンスなる物の使い方が全くショボいのが原因なのでしょうけど。何せ混乱してます。
ここから、スキルアップしていくには、どういう手順で学べばいいのか、何というか、方向性が見えなくなってしまいました。

A 回答 (1件)

こんにちは。


簡単に一読させていただきましたが、まず、いきなりアニメーションやデータの整理やら考えだすと大変です。ゲームもプログラミングもまずはシンプルに物事を考えることが大切です。
いろいろとやりたいことがあるみたいですし、細かくステップを踏んでいけばOKです。

以下、2Dゲームで360度歩けるというゲームのベースを適当に作ってみるサンプルです。作法を追うのではなく、なぜそうするのかという考え方を追ってみてください:

まず、フィールドがあって、キャラクターが歩くという部分。
ここから作るとしましょう。フィールドもキャラクターもとりあえずGameObjectを作って、中にSprite2Dを配置すれば、とりあえずステージの完成ですね。
キャラの方のGameObjectは、Playerという名前にして、画像のOrderInLayerを1にしておきましょう。オーダーが同じだとちらつくので。

キャラクターを歩かせるためには、誰かが入力を監視して、誰かがそれを反映させないといけないですよね?
とりあえず、GameObjectでも作ってPlayerManagerという名前にリネーム、更に、PlayerManagerという名前のクラス(以降クラスはすべてMonoBehaviourを継承してくださいね)を作って、コンポーネントをアタッチしてください。

キャラクターを歩かせるには、動かす対象のオブジェクトがどれかわからないとダメですよね? なので、PlayerManagerに、public GameObject player = null; として、エディタ上で参照を渡せるようにしましょう。とりあえずビルドして、さっき作ったPlayerオブジェクトを、PlayerManagerのインスペクタから設定してください。

次に、まあ移動速は考えないで、毎フレーム入力チェックして、その方向に動かしてみましょう。
さて、アクティブなオブジェクトにアタッチされたコンポーネントは、初回1フレーム目前にStart、その後毎フレームUpdateが呼び出されることになっています。
ということで、void Updateを追加して、下記のようにすれば動くのではないでしょうか。

void Update () {
float dx = 0.0f;
float dy = 0.0f;
if (Input.GetKey(KeyCode.UpArrow)) {
dy = 0.1f;
}
if (Input.GetKey(KeyCode.DownArrow)){
dy = -0.1f;
}
if (Input.GetKey(KeyCode.RightArrow)){
dx = 0.1f;
}
if (Input.GetKey(KeyCode.LeftArrow)){
dx = -0.1f;
}
player.transform.position = new Vector3 (player.transform.position.x + dx, player.transform.position.y + dy, player.transform.position.z );
}

さて、キャラクターが動いたところで、そろそろ敵を配置してみましょう。
ところで、敵は任意の数がたくさん出てくるのですよね。そういう時は、敵オブジェクトをprefabにして、複製できるように作ると良さそうです。
さて、敵と味方ができたので、そろそろ仕切り役が必要そうですね。新しいクラス、GameManagerを作って、GameObjectをシーンに作ってGameManagerとリネームして、アタッチしてみましょう。

更に、GameManagerにはとりあえず以下のようにプロパティを設定してみます。
public GameObject enemyObject;
protected List<GameObject> enemies = new List<GameObject>();
(Listでエラーが出たら、using System.Collections.Genericを追加)

シーン内に、Enemyという名前のGameObjectを作って、中に敵の画像をつっこみましょう。(OrderInLayerを2にすることを忘れずに)ついでに、Enemyという名前のクラスを作り、アタッチします。
そのまま、EnemyをProjectウィンドウにドラッグアンドドロップし、prefabを作ります。prefabはオブジェクトのいわば設計図、ブループリント。これをGameManagerで後で生産します。

シーンのほうに戻ったら、GameManagerをインスペクタで表示して、enemyObjectに、Enemyのprefabを入れましょう。

あとはGameManagerのスクリプトを開いて、
void spawnEnemy(){
GameObject eo = Instantiate( enemyObject ) as GameObject;//実体化
eo.transform.position = new Vector3( Random.Range(-10f,10f), Random.Range(-10f,10f), 0 );//ランダムな位置に
enemies.Add(eo);
}
というものを追加します。あとは、GameManagerのStartで、
void Start(){
for(var i=0; i<10; i++) spawnEnemy();
}
とすれば、敵が10匹ランダムで出てくるようになるでしょう。

じゃあ、次は敵を動かしましょう。とりあえず、ランダムに動きまわってもらいます。
Enemyクラスを開いて、Updateを下記のようにしてみます。

void Update () {
float dx = Mathf.Sign( Random.Range (-1.0f, 1.0f) )*0.1f;
float dy = Mathf.Sign( Random.Range (-1.0f, 1.0f) )*0.1f;
transform.position = new Vector3 ( transform.position.x + dx, transform.position.y + dy );
}

さて、カサカサして相当気持ち悪い画面になったかと思います。
ハンズオンはここまでにしておきましょう。

このあと、位置からキャラの当たり判定をとったり、あたったらダメージを受けるようにしてみる、そのためにHPを追加したり、攻撃をできるようにして、攻撃範囲に敵がいたらHPを削るようにする、敵のスポーンをもっと複雑にする…とかまあいろいろとやることはあるかと思いますが…

基本的には、GameObjectを置く、prefab化すること、スクリプトをコンポーネントとしてアタッチして挙動を書いていくというのが一連の作成の流れです。
なぜ、ここでGameObjectを作ったのか、なぜここでクラスを作ったのか、一つづつご理解されるとよいのではと思います。

まずは、いろいろと遊んでみて、何ができるのか何ができないのかを知ってください。
与えられた機能を組み合わせれば必ずゴールに辿り着くことができます。
上記スクリプトを作成するにも検索を使いましたが、「キー入力 Unity」「Unity prefab 複製」「Instantiate Unity」みたいに検索するといろいろと情報が出てきますよ(日本語で)

個人的には、GameObjectでできることをリファレンスを見て知っていくのが最初の一歩かと思います。Unityは難しいことを考えず、とりあえずGameObjectやSpriteを置いて、必要なら参照を作ったり、prefabを作ったりして、あとはStartやUpdateにメインのロジックを書いていけば良いのです。
キッチリした開発、設計はもっとあとからでも良いので、まずは習作をたくさん作って感覚を掴んでください。

ゲームシステムを解説している書籍はかなり少ないと思います。
良書としては
http://www.amazon.co.jp/dp/4798021180
この辺りなんですが、この本で解説している部分の殆どをUnityが吸収しているし、もう少しプログラムに慣れてからでも良いのかもしれません。

補足で、アニメーションですが、おそらくメカニムか何かになっているのではないでしょうか?多分、設定されたトグル用プロパティに値を放り込めば、ステートが変わるはずです。その辺のキーワードで調べていってみてはいかがでしょうか。

他回答でも言った気がしますが、ぜひ頑張ってくださいね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
まさか、他質問まで受け付けてもらえるとは、本当にありがたいことです。

回答を読んでいて、この質問を投稿してから回答を貰うまでのタイムラグ中、他サイトで調べながら何となく制作の流れはこんな感じかなぁ…ん~、と、何となく思っていたことを整理してくれるような回答で嬉しかったです。
多分、今の自分に足りないことは
①言語の文法の理解の見直し。
〈〉←単純にこのカッコが出てくるスクリプトは、英語の意味で理解するものの、文法的な扱いが分かってない。なので、もう一度入門書を見直します。
②リファレンスの扱いに慣れてない。
これについては、いきなりリファレンスで探して読むのではなく、日本語的に分かりやすい検索をして、それからリファレンスを見直して頭を整理するという手順にしてみます。

あと、補足の回答のアニメーションに関してですが、まだ、メカニム(ん?聞いたことある…)、ステート(??肉??)、トグル??
というレベルなので、頂いたキーワードを元に紐解いて行く様にします!
実は、スペース押したらあるモーションをする等、無理矢理組み込んではみたものの、別アセットのモーションだと偶然組み込めたり、はたまた地面にめり込んだりフリーズしてたり、そもそもロックかかってて組み込めなかったり…なんだか知ること多いな!おいっ!って突っ込みながら色々試したのです。きっと、その理由がわかるキッカケになるのですね(希望的予想で笑)!

何せ、また方向性が見えて来ましたし、そもそも拙い質問に丁寧に答えてくれる人が居ることにモチベーションがグッと上がりました!
本当にありがとうございました!

お礼日時:2016/07/10 03:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!