7つ目は基本のセッティング。大きさはResolutionの項目で設定するので、Transformをいじっても変わらない。///Projectors影を作る。///SkyBoxMainCameraのAddComponent>Rendering>SkyBoxで起動。テクスチャを読み込んで空に配置する。///CharactorController上の人体アニメーションを参照。アセットからキャラクターをヒエラルキーやシーンにドラッグすることで起動する。インスペクターでアニメーションファイルを設定、ほかの数値も設定すると、それで終了。デフォルトでは矢印で移動、シフト押しながらで走る。///Particlesアセットからシーンへドラッグして使用。インスペクターで調整して使う。///アセットストアから検索WindowsのAssetStoreからネットで検索、ログインしてダウンロードできる。インポートでダウンロード。インポートするとUnityのAssetsに入っている。シーンにドラッグして使用。Kit上の人体アニメーションを参照。///StandardAssets(Mobile)モバイル用のアセット。JoyStick:スマホに仮想のジョイスティックが出現し、それで操作できるようになる。GameObjectでCreateEmptyを出し、そこにこのアセットの中にあるJoyStickをコンポーネントで適用するといい。インスペクターのTextureでジョイスティックの形を選択する。スケールは0でもうまくいく。PixcelInsetで大きさと位置を調整、ゲームビューを見ながらやる。////////////////////スクリプトアセットの中にスクリプトファイルを作り、書く。使用したいオブジェクトにAddComponentのScriptでそのスクリプトを選ぶことで適用される。////////////C#///C++との違い==はない:if(a==0)ではなく、if(a=0)でOK。変数定義の仕方:long,float,doubleは中身の最後にそれぞれL,f,dを入れる。文字列のstringがある。基本的に、実数はfloat,整数はintを使う。"qwer";スコープ:任意の場所で{}で囲むことで、変数のスコープ調整が可能。<>がない:「でない」は!=しか使えない。cは小数点以下切り捨てられ、答えは3になる。///////クラスクラスとインスタンスとメソッド:クラスは頭が大文字で、プログラムの中では出てこない。インスタンスはクラスと名前が同じで、頭が小文字。メソッド(関数)は頭が大文字。クラスやインスタンスとは別物なので注意。Transformはクラス、transformはインスタンス、Translate()はメソッド。Vector3はクラス。ややこしい問題:GameObjectのtransformプロパティにTransformクラスがあり、そのインスタンスaaでも作る。Transformクラスにpositionプロパティがあるので、aa.positionとでも作る。positionプロパティにVector3クラスがあり、そのインスタンスbbでも作る。インスタンスなので、aaとbbは別物である。aa.bb.xのようにはできない。1行で操作できるインスタンスは一つだけ。例:下のいずれも可能。Vector3(1,1,1);Web辞書の見方:ランタイムクラスにクラス名一覧が出ている。GameObjectクラスを開くと、そのプロパティ(Variables)にtransformプロパティがある。transformの中にTransformクラスがある。Transformクラスを開くと、そのVariablesにpositionプロパティがある。positionの中にVector3クラスがある。Vector3クラスを開くと、そのVariablesにxプロパティがある。GameObjectのVariablesにtransformがあり、この関係ではGameObjectのインスタンスをaaとすると、aa.transformのように使える。TransformのVariablesにpositionがあり、この関係ではTransformのインスタンスをbbとすると、bb.positionのように使える。Vector3のVariablesにxがあり、この関係ではVector3のインスタンスをccとすると、cc.xのように使える。数値;○○.○○.○○......のような形のとき、インスタンスは左端にしか出ず、関数は右端にしか出ない(つまりこの左端のインスタンスを今制御しているということ)インスタンスも関数も、2つ以上は出ない。プロパティは2つ以上も普通に出る。クラス名はインスタンスを定義するときにしか出てこない。継承元クラス名(){}のように書く。using:パッケージ(クラスの塊)を読み込むための記述。最初の2行でUnityの基本動作に必要なクラス群を読み込む。MonoBehavior:MonoBehaviorがUnityの元の状態を記述したクラス。MonoBehaviour{}と本文を書く。要するに、MonoBehaviourに追加したものが、Unityの本文なのである。///静的プロパティ静的プロパティというものがあり、これは特殊で、インスタンスなしで使えるもので、これは最初が大文字になる。InputやCameraなど。////////////コールバック関数(イベントドリブン)○○したときに××する、というもの。イベントドリブン関数のこと。基本的に、a,b,cなどは自分で作った変数。それ以外は自分で作った変数ではない。:物理挙動の直前に呼び出される。シーン上の全てのオブジェクトに対して呼び出しされた後に呼び出される。Awake():インスタンスがロードされたときに呼び出される///FixedUpdate()と物理演算(Physics)FixedUpdate()は、Updateとは異なり、フレームに依存せず、一定の間隔で呼び出される。Updateはマシン能力によって更新時間が異なるため、つまり処理落ちが発生するが、FixedUpdateは基本的にそういうことが起こらない、とされている。このため、物理演算など正確な値を取得したい場合は、処理の重さに左右されるUpdate関数ではなく、FixedUpdate関数を使用するのが望ましい。{rigidbody.AddForce(Vector3.up);}のように、Updateとは別に記述する。FixedUpdate()の中にInput系のもの(Input.GetKeyDownとか)を記述すると、正しく動かないらしい。それはマシンの性能によってUpdateとFixedUpdateが時間的に1対1で対応しないかもしれないということであり、マシンによって2対1とか3対1のように対応してしまう。Input入力はUpdateの速度で処理するのが限界で、Fixedで使うとImputはブツ切りに処理されるので、正しく入力されない感がある。Inputに対応した変数も同様。要するに、Inputとそれで変化する変数はUpdateで処理し、それによって何かが動いたり、物理演算で動いたりするときはFixedで処理するとよい、ということ。///コルーチンUpdate関数は1秒に30フレームくらいだが、この30という数字を変えることができる。WaitForSeconds(1f);}}まず上のように関数を作り、実行時にはStartCoroutine("Fade");のように書く。すると、Fadeという関数は、1秒おき(1fのところ)に実行されるため、処理が非常に軽くなる。///タイマータイマーの例。0;}}Time.deltaTimeは更新間隔の秒。これが0.1秒とすると、上の場合だと20更新、つまり2秒ごとにその処理が起きる。これでコルーチンを使うと、ややこしくなって上手く動かないことが多いらしい。面倒ならこのようなタイマーでよい。時間的に少し後に処理させたい場合のテクニック。StartCoroutine(MyFunc);その他:OnDestroyOnApplicationQuitOnDisable/////////////////例文//その物体をx方向へ0.01移動する。//Translateは相対なので注意。Vector3(0.0f,0.0f,0.1f));とすると、常に単にカメラの見ている方向に進むだけ。カメラが回転しても常にカメラの見ている方向へ進む。(a);//その物体を1,2,2へ移動する。a;//その物体をpitch方向へ1度回転する。(a);//その物体をX方向へ2倍スケールする。(k);//↑キーを押すとXへ0.01移動。Vector3(0.01f,0,0));}//マウス左を押し続けている間はX方向へ0.01移動。Vector3(0.01f,0,0));}//GGという名前のゲームオブジェクトを探して変数aに入れる//このFindという命令は、Updateの下に入れるのが望ましい。この中に位置情報まで含んでいるらしく、MonoBehaviour直後にやると、位置情報がUpdateされない情報のままになってしまう。a;//その物体にマウスが乗るとその物体をX方向へ2倍の大きさにする(物体が奥行き100の場所まで有効)//レイがぶつかる物体にはコライダを設定する必要がある//Rayを飛ばすとき、飛ばす元の物体にコライダが設定してあると、コライダの中心位置がずれているとレイの飛び方がめちゃくちゃになるので、コライダは空の子オブジェクトを作成し、そこにつけるのがよい。a.ToString();//マウスボタン押している間だけ見えなくする。回転しているのを見れば分かるが、見えていない間も動き続けている。a;//テクスチャのスケールを変化(1だとそのまま、2だと同じ面積のポリゴンに2つテクスチャが入る。テクスチャ自体は小さくなる。b;//その物体が何かに当たると最後にロードされたシーンを最初から開始する。//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。無効だと色は変化しない//Application.LoadLevel()はメソッドで()のシーンをロードする。//Application.loadedLevelは最後にロードしたシーンを示す(最後にロードされたレベルのインデックス、という)最初にロードされたシーンは0。(Application.loadedLevel);}//その物体が何かに当たると、当たった先のインスペクターの物体名がSSであれば、SSを黄色に変える。//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。Color.yellow;}}//その物体が何かに当たると、当たった先のインスペクターのタグ名がPlayerであれば、それを黄色に変える。//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。GameObject.Find("BB");b.SetActive(false);//ゲームオブジェクトcがアクティブかどうか調べてコンソールに結果を出す。アクティブならtrue,非アクティブならfalseをcに入れる。b.activeSelf;Debug.Log(c);//ゲームオブジェクトbを回転させようとして(Rotate)、それが不可能だった場合、コンソールに「Wow!!」と出す。//tryの中をやろうとして、エラーが出るとcatchの{}を実行する。eはエラーが出たという引数。Triggerが有効になっている必要がある。Awakeがあらかじめオフの場合。("ParticleSystem");は、すでに設定してあるパーティクルを呼び出す命令。("ParticleSystem");と持ってくることはできない。("ParticleSystem")だけでは「ただのコンポーネント」のインスタンスを取っただけなので、パーティクルにはならない。true;//画面にフォグを使用する(Edit-RenderSettingの)。Updateに仕込む。(b);//ランダム値//実際に完全にランダムな値を出そうとしたら、ゲーム開始時間を計るなどしたほうがよい。-10〜10までのランダム値。10.0F));0〜1までのランダム値。PlayerPrefs.GetInt("Result");//別のスクリプトファイルから変数を取り出して変化させたり、別ファイルから関数を実行したりする(参照渡しという方法)//このときaaa.csの適用オブジェクトとbbb.csの適用オブジェクトは異なるとする。オブジェクトAAにaaa.csのみ、オブジェクトBBにbbb.csのみ適用しているとする。{}}//C#とJavascriptの間で変数名などを参照したい場合//相互に参照させることは不可能で、片道通行なら可能らしい。AssetsかPluginsに入れ、これ以外のフォルダから参照するようにする。Assetsに入れ、自分で作ったコードをここ以外のフォルダに入れて、上記の方法で参照する。Assetsフォルダが一番初めにコンパイルされるため、このようにできるらしい。//////////////////////課金と広告収入についてスマホアプリの課金は、クレジットカードやキャリア決済。未成年は、キャリア決済は購入限度が限られており、クレジットカードは使えないため、未成年対象のゲームで課金収入を目的にしても効果はなさそうである。広告収入は問題なさそうだ。課金方法は、NTTドコモでは、クレジットカード、キャリア決済(NTTドコモの月料金と同時に払う)、バーコード(クーポン券みたいなもの)がある。問い合わせの欄を作る必要がある。問い合わせは自分のところのメールアドレスで、不具合で課金してもアイテム購入ができなかった場合などに備えた問い合わせ。広告収入のほうが、対応や不具合が起きたときの対処は楽である。アンドロイド48の例:はっきりいって、課金するのとしないのとでは大違いで、課金しなければ途方もない時間がかかるか、ほとんどクリア不可能に見えるほどの差がある。課金すればものすごい優遇処置が当然。実質、課金しなければクリア不可能といってよい。実際にゲームを楽しむためには課金が不可欠なようになっている。重要なこととして、課金しなければゲームの本当の楽しさを知ることができないように設定するのがよさそうだ。計算:ダウンロード数と広告収入は同じくらいらしい。1万ダウンロードなら、広告収入は1万。仮にユーザーの1割が500円の課金をした場合、1万DLなら1000人が500円の課金で、50万円になる。課金と広告収入を比べると、課金のほうが多くなるはず。ダウンロード数を稼がなくても、いかに課金させるかを重視することで、十分な売り上げを出せる可能性はある。///何に課金するか大きく2種類ある。ペナルティの軽減は、もともとある程度難易度が高すぎるとか、膨大に時間がかかるように仕組んでおき、課金することで誰でもクリアしやすいようにするもの。課金しなければ非常にクリアが難しいか、非常に時間がかかるように仕組むのがベスト。サービスの追加は、あらかじめすべてのサービスを無料で遊べないようにしておき、かつ追加のサービスが無料サービスよりも魅力のあるものにしなければ意味がない。無料と同じくらい面白いものを追加するのではなく、無料よりも面白い要素の追加ならさらに効果的である。ペナルティを軽減する:時間のかかるゲームで、時間を節約するために課金する(札束で殴るゲーム、RPGでレベルチートさせるなど)プレーヤーの推測力、反射神経など、足りない部分を補う(脱出ゲームでヒントを出す、アクションゲームで敵が減る、ポイントが増えるなど)サービスを追加する:音ゲーで難易度の高い楽曲を追加。アクション、脱出ゲームで、さらに難しいステージを追加する。このやり方は、最初から難易度が高いと、さらに難易度の高いものをやらせようとすると、下手な客はやる気がおきないので注意する。脱出ゲームでさらに怖い、あるいは難しいステージを追加。コンテンツ(3Dコンピューターグラフィックを含むコンピューターグラフィック、サウンド、ミュージックなどを含む)またはチュートリアルなど、ビデオゲームおよびインタラクティブメディア(双方向メディア、一方的に見せる単なる動画などは含まれない)の一部に組み込まれるデジタル素材である。Processor(支払い処理業者)によって支払われる。著作権を主張するために、Unityがこちらの名前、住所その他の連絡先情報を侵そうとしている第三者に送信する権利を有する。価格設定は米ドルで設定し、端数は認められない。Unityが顧客に対し、妥当な通貨で表示する。手取りは、あらゆる手数料を差し引いて30%が取られる。70%がすべてがこちらに入る。PayPalによる支払いでは、月ごとに支払われる。アカウントを提供すれば、払ってくれる。こちらのほうが早いし、手数料もかからないようなので、有利。小切手または電子送金の場合、四半期ごとに支払われ、手数料を取られ、しかも250ドル以下だと支払われない。無料提供の場合、Unityにも当然手数料は支払われない(Unityに嫌がられるかもしれない)返金は支払い業者の規約による。アセット提供の際、提供者の情報がダウンロード画面に表示される。保守やクレーム対応は提供者が行う。上げ減少などが起こる場合がある。販売額が50ドル未満の場合、Unityは顧客に購入額を返金し、提供者に請求されることがある。50ドル以上なら、支払い業者のポリシーに従う。提供した素材を消すと、顧客も以降はダウンロードできなくなる。提供者は、自分のウェブサイトで決済機能をつければ、無料素材に対して寄付を募ることができる。素材の「機能拡張版」を別のところで販売してはいけない。そのままならたぶん平気。寄付の募り文句は、アセットストアページ以外に表記してはいけない。Unityは提供者の素材の著作権を奪い取るわけではない。好きに処理できるわけではない。顧客が提供者に個人情報を与える場合、提供者は個人情報の秘密を守らなければらない。提供者が、顧客から受け取った個人情報を、Unity素材のための宣伝とか(メールに新しい素材作ったよ!とか)はしてもいいが、Unity外ではどんな目的でも使ってはならない。素材を別のところで販売するために、Unityを宣伝目的などに利用してはならない。素材に悪評がついたとき、あまりひどいならそれについてUnityに問い合わせることができる。素材を更新した場合、バージョン表記は提供者の責任で。不謹慎なものは作ることができず、削除されたり、訂正を求められる。Unityは提供した素材をプロモーションなどに使うことができる。アセットを取得した顧客に対し、提供者は商用の販促、宣伝してもかまわない。素材の中に第三者の素材が含まれる場合、その第三者の許可を得なければ出せない。素材を削除することはいつでもできるが、顧客から取り戻すなどはできない。