AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

カードゲームを作ろう(5)

f:id:yasu9780:20150524232952p:plain

  • 手持ちカードをソート
  • 場より大きくて一番小さいカードを出す
  • 出せるカードがないときはパスする
  • ユーザーもパスできる
  • 全員がパスすると、最後に出した人が新たに好きなカードを出せる

手を出す前にタイマーで4秒停止して「考えてます」と表示する
(本当は考えてないけどw)

今後は二枚まとめて出せるとかやりますか。
ユーザーのUI的に面倒なんですよね
カードを複数選択して、捨てるボタンを作る必要があります。

カードゲームを作ろう(4)

f:id:yasu9780:20150524210350p:plain

  • カードをシャッフル
  • 4人に10枚づつ配る
  • ユニティちゃん→プロ生ちゃん→ニコ生ちゃん→ユーザーの順番にカードを場に出す

本来は2が最強ですが、簡単なので1最低、13最強になってます。
本来は場より大きい&最小のカードを出すべきですが、見つかったら出してます

カードは表と裏があるので、180度回転すると見えません
今はデバッグで見えてますが。

EmptyなGameObjetを作って、カードの表側のplaneと裏側のplaneを子供で配置してみました。

カードゲームを作ろう(3)

f:id:yasu9780:20150524192151p:plain

カードをシャッフルして10枚をユーザーに配り
クリックしたカードを場に捨てる

までできました。

シャフル。スワップを20回程度

for(i=0;i<=20;i++)
{
	int c1=Random.Range (1, 52);
	int c2=Random.Range (1, 52);
	int tmp = cardNo[c1];
	cardNo[c1]=cardNo[c2];
	cardNo[c2]=tmp;
}

クリックしたカードを場に動かす。
マウスのX座標で判定してもいいんですが、タワーディフェンスでやっていた光線飛ばしてObject特定でやってみました。これなら、カメラ移動をしてもカード選択ができます。
場にはbaというObjcet置いてるので、そこに移動します。
大富豪なら、場の最上面より強いカードしか捨てられないので、そこにロジックを入れることになります。

void Update () {
	if (Input.GetMouseButtonDown(0) )
	{
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		RaycastHit hit = new RaycastHit();
		Physics.Raycast(ray, out hit);
		if (Physics.Raycast(ray, out hit)) {
			Debug.Log("hit card");
			mycard = hit.collider.gameObject;
		}
	}
	if(mycard)
	{
		Vector3 pos = mycard.transform.position;
		pos.x -= speed * Time.deltaTime * (mycard.transform.position.x-ba.transform.position.x);
		pos.y -= speed * Time.deltaTime * (mycard.transform.position.y-ba.transform.position.y);
		mycard.transform.position = pos;
	}
}

カードゲームを作ろう(2)

f:id:yasu9780:20150524181503p:plain

Resourcesとして画像を読み込んで、動的生成したplaneに貼り付け成功

まずmaterialとtextureを貼ってるplaneを一つ作ってresourcesに入れておく
Instantiateで動的に生成
materialのtextureをトランプの該当png画像に張り替える
これでスクリプトでスマートに動的生成できました。
assetStoreで売ってるカードは、52枚をすべてprefab化してましたが、
自分で作るの面倒くさいし(´・ω・`)
2ドルだから買おうか迷ったけど、スクリプトで動的になんとか作れました。
planeのshaderをlegacyのtransparentにしておくと、カードの角がとれていい感じです


この辺が参考になりました
初めてtextureで上手くいかず、texture2Dにしたら表示されました
スクリプトでテクスチャを貼る~Unity | 電脳ノート

obj = new GameObject[53];
GameObject pf = (GameObject)Resources.Load("Card"); 

for(i=1;i<=9;i++)
{	
	Vector3 pos = new Vector3(1.5f-i*0.25f,3,1);
	obj[i] = GameObject.Instantiate(pf, pos, Quaternion.Euler(90, 0, 0) ) as GameObject;
	obj[i].transform.GetComponent<Renderer>().material.mainTexture = Resources.Load<Texture2D>("trump_png/trump00"+i);		
}

カードゲームを作ろう(1)

f:id:yasu9780:20150523213856p:plain

いつもユニティちゃんなので、今回はプロ生ちゃんも登場させようと思いましたが、二人を登場させてみると大きさが違うんですね。
プロ生ちゃん1に対し、ユニティちゃん2.9ぐらいで良さそうです。
次に、DirectionLightからの肌の質感が違いすぎる。
これはshaderとかを変える必要があるのかも知れませんが、このへんは知識が全然ありません(´・ω・`)

肝心のカードですが、spriteの使い方が全然分からず、
とりあえず、CanvasにrawImageで一枚だけ表示してみました。
スクリプトから動的にRawImageを大量生成して、画像をそれぞれ指定すればいけそうな気がします。
本来はどのようにやるのが正解かはよくわかりません。
本来、2Dモードでやるべきなのかもしれませんが、それだと3Dのキャラクターも出せないしね。
というわけで、カード一枚表示しただけです。

f:id:yasu9780:20150523222928p:plain

プロ生ちゃんに、ユニティちゃんのshaderを適用
ニコ生ちゃんも追加(ユニティちゃんのshader適用)
やはり質感が違う……
というか、本筋から外れている

TowerDefenseで20万点の人出現

http://rafeel.s602.xrea.com/td/td.html

5万点ぐらいのランキングの奴はだいたい私なんですが、
TDはリピーター率が悪くて、
敵が箱だし、面白みがないし、仕方ないなーとは思ってたんですが

難易度を下げてるってのもあるんですが、20万点ってことはかなり先まで行ったんだろうなあ
ありがとうございます。
このへんまで行くと作業ゲームになってたと思いますが、


ゲーム性を上げるには、

  • 道の経路をだんだん変える
  • 敵を、ちゃんとポリゴンのモンスターキャラに変える
  • 砲台の種類を2つからもっとふやす
  • 砲台をレベルアップできるようにする
  • ストーリーをつける

など色々とあると思いますが、まだテスト版みたいな感じですので。


こういうゲームってのは、それぞれ面ごとの面白さを考えないといけないと
手間がかかるし、難しいですね。
アングリーバードみたいなのも、そういう難しさがあるし。
例えば、テトリスとかぷよぷよは、そういう手間がなく、面白さを作れるので楽だし、
優れてますね。
クラッシュ・オブ・クランなんかは、ユーザーが試行錯誤して作った村を、ユーザーが攻めるので、
運営側は手放しでいいわけですから賢いです(ゴブリン村はありますが)
基本的に、オフラインゲームは、開発側が面を用意し、面が尽きるとユーザーは手放す
かといって、オンラインゲームで、ユーザーだけで遊んでくれと言っても、
MMORPGみたいに「やることがない」みたいなことも起きるわけで、

一本道←→多少分岐←→面が手間←→自由だけどやることない

みたいな軸でとらえられると思いますが、
自分が興味が有るのは、個別の面を、コンピュータに自動生成させて、難易度とか面白さを
ちゃんと評価できる仕組みを作ることですね。


たとえば、倉庫番を考えた場合、コンピューターにランダムに配置を作らせて、それをコンピュータに解かせて、解があることを確認すれば、ゲームとしては成立する。
そこで、解が複数あったり、経路が短いなら、そのゲームは簡単だし、
経路が長いなら、そのゲームは難しい。
面白さは、偽の経路がたくさんあるけど、正しい経路は一つだけみたいなこともあるだろうけど、
一般に難易度より、面白さを評価する方が難しいと思います。

同じことは、詰将棋の自動生成にも言えると思います。
例えば、30手詰めの詰将棋があっても、一本道なら難しくない場合もあるわけです。
しかも面白くない(いや面白かも?)
逆に、3手づめでも、思いつかないような発想がいると、その詰将棋は面白いってことになる。
突き詰めると、ユーザーをミスリードさせるものは面白く、させないものは面白く無い。
後者は作業ゲームになる。
前者は、要するにミステリー小説です。落ちがあるのは、ユーザーをだますから成立するわけです。
人間はなぜか騙されていることに気づいてて、ちゃんと伏線があると、面白いと感じるようにできている。

クイズゲームで83コンボの人が出現

http://rafeel.s602.xrea.com/webplay.html

5/22に83コンボ(連続正解)の人が出現
すごーい
おそらく、クイズオブワルキューレのベテランプレイヤーと思うけど、
ほとんど覚えてるんでしょうね。

ちなみにランキング2位の22コンボは私です。
全ジャンルランダムの方がコンボを伸ばしやすい印象があります。
特定ジャンルだと、難問が出て、そこで途切れてしまう。
(といっても時間制限がないので、検索して調べれば答えられるんですが)
ただ、確率で考えると、全ジャンルランダムでも難易度はいっしょと思うんですが謎です

クイズが難易度高いので、低難易度のクイズで作ればよかったかなとちょっと後悔しております。
このプログラムの仕組みは、モンスターを倒すみたいな方向に拡張して、
クイズ以外にも学習アプリにしてみたいなと思ってます。