目指せ!圧倒的な実力差

圧倒的な実力差を目指して日々の活動を記録します。情報技術やゲームについての雑記も記録

現行プロジェクト

  • 初めてのUnityでルーレットゲームを製作中

【Unity】 ルーレットの確定判定の構想

球がルーレットのポケットに入ったかどうかの確定判定について考えてみます。

確定条件と問題

・球がルーレットのポケットの位置にある

 中心からの距離がポケットより内側でも外側でもない位置にある

 つまりボールの中心位置が

 (ポケットの内側< 球 <ポケットの外側)

 である。今回はルーレットの中心からの相対距離で表す。

・球が静止している

 球が動いている状態はまだ確定していない

 つまり1秒くらい相対位置が変わっていない状態

 今回はルーレット自体が回っているためルーレットの回転速度と同じ速度で回転している状態を考えたい。

 ですが、もっと良い方法を見つけました。

 中心からの距離が変化しない状態というのは静止と言っても良いです。

総合すると

 球とルーレットの中心座標を相対的に取得。

 その距離を r とすると、

 (ポケットの内側 < r < ポケットの外側) ∧ ( r が一定時間同じ)

 の時にポケットに入ったことを判定する。

 そのポケットの位置は、角度を求めて判定すればいい←ここもうちょっと詰めないと

f:id:soutencloud:20140206180256p:plain

 

Unityでは相対距離を出す方法が簡単に出来るためオブジェクト同士の判定がとても楽です。絶対座標しかない場合、極座標系で表さなければならないです。

その辺はUnity万々歳ですね。

 

参考サイト

ActionScript入門Wiki - Unity - Transformをコードで取得、グローバルとローカルの違い

[Unity]親子関係 | CHO DESIGN LAB

【Unity】 ルーレットを違う角度から見せる

今まで固定カメラでしか見れなかったカメラ視点を切り替えられるようにしてみました。

見下ろし、側面、内側の3種類のカメラを作って、見せるカメラの切り替えのスクリプトを組みました。

f:id:soutencloud:20140206011736p:plain

Unity Web Player | Casino

↑から再生。

SPACEキーで再度打ち出し

Zで見下ろし、Xで側面、Cで内側カメラへの切り替え

 

切替方法

Camera型のインスタンスを3つ生成して、それぞれに名前をつける

Camera.enableをtrue, false切り替えることで、カメラを使用するか否か決められる。

入力を受付て、使うカメラのインスタンスだけenableをtrueにする。あとはfalse。

インスタンスの紐付け

カメラを切り替えるときに、Scriptの中のインスタンス紐付けのやり方が分からなかった。とても悩みました。

方法としては、ゲームオブジェクトを生成して、Tagなどで紐付けする方法がありましたが、ドラッグドロップで出来る方法を探していました。

javascriptでは

のようにやったことがあったので、その方法を悩みに悩んでいたら…

 

ただpublicにするだけでした。 

そうすると下のようにカメラをドラッグドロップで指定して、scriptのカメラに割り当てることが出来ました。

f:id:soutencloud:20140206012814p:plain

内部でコンストラクタとしてオブジェクトを突っ込んでるのか、置き換えてるのかは謎…

 

次回からは当たり判定を考えていきます。

 

参考サイト

Unity Script Reference:

メモ カメラ切り替え - けいごの日記

[Unity]他のスクリプトを参照する | CHO DESIGN LAB

ぷかぷかあひるさん: GetComponentでプロパティ

Unity3D - 【Unity】スクリプトからオブジェクトやコンポーネント操作まとめ - Qiita [キータ]

Unity入門/タグ - WisdomSoft

Unity-Project/Assets/Game Scene/C# Scripts/PlayerCamera.cs at master · 217/Unity-Project · GitHub

 

【Unity】 ルーレットの球を打ち出す

今回はルーレットの球をSpaceキーで再度打ち出しが出来るようにしました。

f:id:soutencloud:20140202001212p:plain

Unity Web Player | Casino

↑で再生。SPACEキーで再度打ち出し

入力の受付

入力は

Input.GetKey(KeyCode.~~)

をif文で囲めばOK。

GetKeyは押している間、GetKeyDownで押し下げの瞬間になる。

打ち出す毎に初速度を乱数で変えるようにした

 乱数生成はRandom.valueで0.0f ~ 1.0fまで生成してくれるようです。

Unityは基本的にフロート型なのかな?

初速度の与え方を rigidbody.AddForce(x, y, z)からrigidbody.velocityに変えた

AddForceだと今の加速度に更に加える形になるので、初期化として機能しないので変更しました。

打ち出し位置のリセット

transformのpositionの変更は

transform.position = new Vector3(x, y, z)

で変更できた。リファレンスによってはnewがかかれてないこともあるけど、基本的インスタンス生成して突っ込む感じになるらしい。

モデルを更に変更を加えてもらった

前のモデルの外周は36角形になっていて、壁に当たるように内側へ落とされていたが、それをなるべく円に近い形に変更してもらいました。

さらに、外周に球がハマるようにしてもらいました。

すり鉢状に変形してもらいましたが、Unity上でさらに縦に引き伸ばして調整しました。

 

だいぶ安定感のある打ち出しになったと思います。

次回はカメラ視点の変更をしたいと思います。

 

参考サイト

ActionScript入門Wiki - Unity - 入力情報を取得する

UnityをC#で超入門してみる #5 時間と入力の章 - Qiita [キータ]

マウスの位置にオブジェクトを移動させる - 強火で進め

Unity Rigidbody 加速度 | Blog for Smartphone Seminar 2013

UnityのC#で乱数を生成する。 « GONZNOTE

【Unity】 ルーレットの3Dモデルを作ってもらった

ルーレットのモデルがほしいとTwitterでつぶやいたら、作ってくださった方がいらっしゃいました。素晴らしいクオリティで、とても感謝です!

早速頂いたモデルを使ってルーレットを作ってみました。

f:id:soutencloud:20140130192739p:plain

Unity Web Player | Casino

↑から再生できます。

球に初速度をつけてみました

 

初速度は rigidbody.AddForce をStartの中で使いました。

調整が上手く行かず、とりあえず形になるように作りました。

調整は、摩擦、跳ね返り率、球の重さ、重力、初速度、打ち出し角度の調整がとてつもなく難しい。

打ち出すときに場外へ飛んでしまうことが多かったので、これから修正点の洗い出しも行っていきます。

 

いい感じに出来てきたので、次回は入力を受けつけられるようにしたい思います。

参考サイト

Unity3D の基本から学ぶ09: おじさんのプログラミング

ブロック崩しを作る: Unity3Dのゲームの作り方講座

ゲームオブジェクトをバウンドさせる。: Unity3Dのゲームの作り方講座

私がPS4を予約した理由

 2014年2月22日に日本での発売が決定しているPlayStation®4を予約しました。

海外では既に、最新機種としてではなく、現行機種としての扱いを受けているようで、PS4の売上は世界的に伸びています。

f:id:soutencloud:20140129184358j:plain

そんな中、Sony Computer Entertainment (SCE) は日本での発売を遅らせています。世界で最も?遅い発売となっています。このような商売戦略の意図やPS4の利点を自分なりに憶測、総評した結果PS4購入に踏み切りました。その理由を話します。

日本での販売開始の遅さの理由と評価したこと

なぜ、日本製のゲーム機が世界同時発売ではなく、最も遅い発売になったのか。様々な理由が考えられます。

1つ目は、ゲームソフトが揃っていないという理由です。過去のニュース記事でチラッと確認しました。結局発売1ヶ月前だけれどもローンチタイトルは少ないです。その点はかなり不満である事柄です。

2つ目は、PS2, PS3の教訓を活かしたという理由です。SCEPS2の発売当初の売り切れ、PS3の世界同時発売による混乱と不良の対応を踏まえて、地域毎に発売日を分けたのだろう考えられます。初期不良の対応を1度に引き受けるのは難しいでしょうから。海外は初期不良の人柱的な考えはあるだろうし、それは評価できることです。私自身、初期不良には当たりたくないものですから。

世界的にシェアを獲得出来て、なおかつ不良の数も少ないと保証された状態ならば、日本のうるさいユーザーたちは納得して買っていくでしょう。私自身納得しています。

ハイスペックかつ価格を大幅に抑えた理由

PS3発売当初、6万円などの高額な機器でとても手が出せなかった。しかしPS4本体は赤字覚悟で利益をほぼ生まない価格帯におさえてきました。

もちろん、中に入っているハードウェアはミドルエンドゲーミングPCと同レベルなスペックを有して、エアフローや電力消費を抑えた最新技術の塊です。

なぜこのような価格帯にしたのか。今回のPS4の開発に関して "PS3から劇的に改善した" と言われていることは、"ゲームを作りやすくなった" ということです。

PS3のゲームソフト開発はとても面倒だったらしいです。それを(ゲーム開発者なら)誰でも? 簡単に作れるシステムに変えました。これにより、ゲームソフト開発を容易にしてたくさんゲームを出し売って稼ぐということがメインとなり、ハードウェア利益を犠牲にソフトを増やそうという考えです。また、インディーズゲームも推進していて、より多くのゲームが登場することになると考えています。ゲームが増えれば、ユーザーの満足度は上がります。ただ、ローンチが少ないのはいただけないです。

PS4はグローバルな流行の先端を掴んだ

PS4の新機能として、ゲームのプレイをワンボタンで共有(Share)出来るShareボタンが話題になっています。昨今のゲームはインターネットを通して、プレイ動画を投稿、ライブ配信することが一般化されてきています。(もちろん禁止されているゲームもあるでしょう。)そんな中、この機能はとても評価出来る機能です。世界中の人たちとゲームを通じて交流することをゲーム会社自体が推進してくれるというのは、時代の流れ、ユーザーの要望を理解した良い傾向です。また、カメラを使ってプレイしている顔を映しながらの配信も出来るという。これは世界的な流行の先端を掴んでると言えます。

私も購入したら配信してみようと考えています。

f:id:soutencloud:20140129175840j:plain

ゲームソフトのダウンロード配信

PS4ではゲームソフトをパッケージ(Blu-ray Disc)版とダウンロード(DL)版で購入できます。特にDL版を推進しています。DL版は小売店が必要なく、SCEに直接お金が行くため、安く提供出来るし、中古という概念がなくなるため直接利益が生まれるのです。その利益はゲームソフト作成に使われるだろうし、タイトルも自ずと増えるでしょう。

ユーザーとしては、安く購入できる(Amazonは卑怯)し、Discを取り扱わなくてよい為、今までのやりたいゲームのDiscを交換する。などといったことが前時代となりそうです。私も、やりたいときにすぐにプレイできるDL版の購入をPS3でしていますが、とても便利に感じます。PS4ではパッケージ版は一切購入しないと思います。

PlayStation®VitaPlayStation®Network, PlayStation™ Now との連携

携帯ゲーム機器としてPSVitaが販売されていますが、PS4ではPSVitaとの連携が注目されています。ネットワーク環境があれば、どこでも自宅のPS4と通信してゲームが出来る。そんなどこでもゲームが出来る環境が整うと言われています。

また、PS, PS2, PS3のゲームとの互換性についても、

クラウド技術を活用した 「プレイステーション」のストリーミングゲームサービス 「PlayStation™Now」 今夏より、米国でサービス提供開始

とあるようにネットワークの向こうのサーバーで動いているゲームを動かすという形に持って行っています。

私の目指すネットワーク社会は、直接人と接する機器(端末)は現在のスマートフォンなどの弱く小さなデバイスで、高負荷な処理はネットワークの向こう側で行えばいい。そんな世界が日々形になっていっていると実感しています。

PS4およびゲームに期待すること

私のゲーム生活で考えていることがあります。ゲームは自分の好きなときに好きなだけ、いつでもどこでも、誰とでも遊べるものであると考えています。

そのためにはネットワーク基盤がしっかりしてないといけません。頑張って欲しいです。

ゲームの面白さはリアルさだけではない。一流のプランナーが生み出した面白いゲームって言うは、簡素でもやっぱり面白い。ゲームの満足度は期待を裏切らないことだと思う。人が何を期待し、何を残念に思うのか。それを理解して開発に取り組んでほしいです。

今、ふと思ったのですが、就職活動している現在。ネットワーク技術に一生こだわっていきたいと思っています。SCEのネットワーク部門もあるなとついでに調べてしまった。とっても魅力的に映りました。

 

 

【Unity】 ルーレットの3Dモデルを作ってみた 3Dモデリング

前回の最後にルーレットのモデリングほしいと言いましたが、

簡単なモデリングなら自分でもできると思い、初挑戦してみました。

使ったモデリングツールは

Wings 3D

OpenSourceでWin, Mac, Linuxに対応している模様。私はWin機がメイン

インストールして、いじくりまわしたらそれっぽいのが出来ました。

f:id:soutencloud:20140129040141j:plain

意外といい出来栄え。

これをUnityに導入するため、obj形式で保存して、ドラッグドロップしました。

f:id:soutencloud:20140129041221p:plain

Unity Web Player | Casino

↑から再生できます。やり直しはブラウザリロード。

残念がらテクスチャは禿てしまったので、カラーで補完。

前回のルーレットのスクリプトを貼り付けて、動かしました。

ついでに、球体に物理演算をつけて、モデル自体にも当たり判定つけました。

 

なかなかに気に入った。テクスチャ貼りはどうやるんだろうか・・・

よくわからないのでまた今度

 

参考サイト

Unity - Unity Manual

ゲームオブジェクトをバウンドさせる。: Unity3Dのゲームの作り方講座

 

【Unity】 ルーレットみたいにオブジェクトを回してみた

Unityでなにかゲームを作ってみようとはじめました。

カジノのルーレットゲームを作りたい。

ってことで、とりあえず、円柱を回してみました。

f:id:soutencloud:20140129012537p:plain

Unity Web Player | Casino

↑から再生できます。

作った工程

1.HierarchyのCreateからCylinderを生成して、潰す

2.ネットにあった適当なルーレット画像をObjectテクスチャとして貼り付け

3.TransformのRotationがオブジェクトの回転であることを知る

4.横回転時計回りはRotationのY軸を加算していけばいいことが分かった

5.C#スクリプトを生成

6.スクリプトをCylinderオブジェクトに埋め込む

7.ライトとカメラ調整してプレビュー

8.Web Playerとして出力してDropBoxのPublicフォルダにアップロード

 

Rotationを変えるのにサイトを回ったが、どうやら回転させるのは、transform.Rotate()あたりをいじればよさそうだ。

初期化するのに参考サイトにあったVectorを突っ込むやり方だと上手く行かなかった。

transform.rotation のメソッド見てみたら、Setというメソッドがあったので、セットしてみたら初期化出来たので、360度まわったら0度に初期化し直すコードを挿入してオーバーフローを防いだ

円柱のオブジェクトだと平らでルーレットにならない。3Dモデリングを誰かに頼んで、ルーレット作ってもらおうと思う

 

参考サイト

Unity - コードからTransformに値を設定する

DropboxのPublicフォルダを使って簡易webサーバにする。

コードをはてなブログへ貼り付ける方法