11.10.2011

Unityではじめるゲームづくり届きました

Unityではじめるゲームづくりは元々バンダイナムコゲームス内での勉強会のために翻訳されたGame Development With Unityです。
なのでセットアップからゲームの公開まで一通り網羅されているだけでなくその時使用されたスライド等や各チャプターのデータ等がDVDに付録として納められており、大変分かりやすい作りになっています。実際にゲームを一本作るような構成になっているのでゲームの作り方の学習にも最適かと思います。
なお、採用しているスクリプトはJavaScriptで統一されています。

9.12.2011

Unityによる3Dゲーム開発入門届きました

早速件の本が届いたので早速一通り読みました。
全体としては基本的な使い方から始まり、各機能の説明、プラットフォームの出力までの流れまで丁寧に書いてありました。そして図が多いので読みやすいですね。入門と書いてあるとおりこの本はチュートリアルです。ですのでこれから始める方にはまさにうってつけでしょう。逆にある程度触っていて、実際に組まれている方にはそこまでお薦めはしないです。何にせよ邦書が出たということが大事なのでここからユーザー数が増えたらいいなと思います。

9.08.2011

クリックしたところのオブジェクトを取得

Rayをカメラから取得し、RayCast使用し、RaycastHitを得ることでオブジェクト等を取得できます。


if (Input.GetKeyDown(KeyCode.Mouse0))
{
  RaycastHit ray_hit;
  var ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
  if (Physics.Raycast(ray, out ray_hit, 100))
  {
    var game_object = ray_hit.collider.gameObject;
  }
}
---

9.05.2011

Unity3D国内書籍

現在はまだ日本語書籍はありませんが、
2011年09月10日 発売予定
Unityによる3Dゲーム開発入門――iPhone/Android/Webで実践ゲームプログラミング

2011年10月15日 発売予定
Game Development With Unityの邦訳版

が出版される予定になっています。今後どんどん国内に入ってくると利用人口が増えそうですね。

9.01.2011

Prefabを動的に生成する

PrefabをScriptから動的に生成する方法をまとめました。
  1. プロジェクトにResourcesフォルダがなければ作成する。
  2. PrefabをResourcesフォルダに配置する。
プロジェクトの設定でまずはこれを行います。
そうすると
[Resources/Prefab/Effect/effect0]のPrefabを生成したい場合は、

string name = "Prefab/Effect/effect0" 

Instantiate(Resources.Load(name, typeof(GameObject)));


で、生成することができます。
毎回こう書くのも冗長的なので

 using UnityEngine;



public static class Prefab
{
    public static GameObject Create(string name)
    {
        return (GameObject)Object.Instantiate(Resources.Load(name, typeof(GameObject)));
    }
   
    public static GameObject Create(string name, Vector3 position, Quaternion quaterinon)
    {
        return (GameObject)Object.Instantiate(Resources.Load(name, typeof(GameObject)), position, quaterinon);
    }
}
 
としたほうが楽かもしれません。

Colliderによる衝突判定

衝突判定が必要になったので適当にまとめてみました。

衝突点や相対的な速度など詳細な情報が必要ない場合はColliderで十分。

RigidBodyコンポーネントとの衝突を行わず、接触判定だけが欲しい場合、ColliderコンポーネントかRigidBodyコンポーネントどちらかにIsTriggerにチェックを入れる。

 Colliderコンポーネント同士は接触も衝突も判定しない。

RigidBodyコンポーネントとの接触判定
  • void OnTriggerEnter(Collider other); - 接触開始時に呼び出される。 
  • void OnTriggerStay(Collider other); - 接触中に呼び出される。
  •  void OnTriggerExit(Collider other); - 接触終了時に呼び出される。
RigidBodyコンポーネントとの衝突判定
  • void OnCollisionEnter(Collision other); - 衝突開始時に呼び出される。 
  • void OnCollisionStay(Collision other); - 衝突中に呼び出される。
  • void OnCollisionExit(Collision other); - 衝突終了時に呼び出される。

8.14.2011

GUI作成 その1

GUIを作成しようと思ったので触ってみました。
以下のスクリプトを記述し、ボタンと垂直スライダーバー を表示してみました。

using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour
{
	public GUISkin gui_skin = null;
	private float scroll_vertival = 0;
	
	// Use this for initialization
	void Start ()
	{
		
	}

	// Update is called once per frame
	void Update ()
	{
		
	}
	
	void OnGUI ()
	{
		if (gui_skin != null)
		{
			GUI.skin = gui_skin;
		}
		if (GUI.Button(new Rect(10, 10, 100, 100), "Button"))
		{
			print("Click");
		}
		scroll_vertival = GUI.VerticalScrollbar(new Rect(200, 10, 100, 100), scroll_vertival, 10, 0, 100);
	}
}
結果はこんな感じに
メンバーのgui_skinをpublicにしたのでスキンを変えたいときはプロジェクトに追加したGUISkinをドラッグして追加するだけなので結構簡単にさまざまなバリエーションが作れそうです。
もう少し触ってみたいと思います。

8.08.2011

複数のカメラの配置

複数のカメラの配置してみました。
カメラの切り替え
各カメラのTagを[MainCamera]にしました。
特にこのTagでないとだめということはありませんが、以降のスクリプトで使用するためそうしています。

GameObject-CreateEmptyでカメラコントロール用のオブジェクトを配置し、スクリプトを設定します。

以下のスクリプトを記述してみました。
using UnityEngine;
using System.Collections.Generic;

public class GameController : MonoBehaviour
{
    private List<GameObject> cameras = new List<GameObject> ();
    private int current_camera_index = 0;

    // Use this for initialization
    void Start ()
    {
        var objects = GameObject.FindGameObjectsWithTag ("MainCamera");
        foreach (GameObject game_object in objects)
        {
            if (objects != null)
            {
                cameras.Add (game_object);
            }
        }
    }

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown (KeyCode.Keypad5))
        {
            //参照カメラ切り替え
            ++current_camera_index;
            if (cameras.Count <= current_camera_index)
            {
                current_camera_index = 0;
            }
            for (int i = 0; i < cameras.Count; ++i)
            {
                cameras[i].camera.enabled = i == current_camera_index;
            }
        }
    }
}
これで実行すれば5キーを押すたびにカメラが切り替わります。

画面分割
おまけで画面分割を。
カメラのNormilizedViewPortRectを編集すれば画面分割ができます。
例えばカメラを2つ配置し、
片方はX:0,Y:0,W:0.5,H:1、
もう一方をX:0.5,Y:0,W:0.5,H:1にすれば
簡単に画面を縦に割ることができます。

8.07.2011

SceneViewでオブジェクトが表示されない

Unity3D3.4にしてからSceneViewにObjectが表示されないというのに悩まされていたのですが、解決しました。なぜかレイヤーの「Default」のチェックが外れており、表示されないようになっていました・・・なぜ・・・UnityAnswersでも結構そういう人いたみたいなので一応メモって置こうとおもいました。

8.04.2011

StringComparison.Ordinalについて

StringComparison.Ordinalでカナがどういう順番に並ぶのか必要になったので少し調べてみました。
using System;
using System.Collections.Generic;

namespace Ordinal
{
    class Program
    {
        static void Main(string[] args)
        {
            //3.0以降はコレクション初期化が楽で良いですね
            var targets = new List<String>
            {
               "ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ",
               "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ",
               "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ",
               "タ", "ダ", "チ", "ヂ", "ツ", "ッ", "ヅ", "テ", "デ", "ト", "ド",
               "ナ", "ニ", "ヌ", "ネ", "ノ",
               "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ",
               "マ", "ミ", "ム", "メ", "モ",
               "ヤ", "ャ",  "ユ", "ュ", "ヨ","ョ",
               "ラ", "リ", "ル", "レ", "ロ",
               "ヮ", "ワ", "ヰ", "ヱ", "ヲ", "ン",
               "ヴ", "ヵ", "ヶ", "ー"
            };
            //ソート
            targets.Sort((String rhs, String lhs) => String.Compare(rhs, lhs, StringComparison.Ordinal) );
            foreach (var str in targets)
            {
                System.Diagnostics.Debug.Write(str);
            }
        }
    }
}

これの実行結果が
ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶー
となりました。
てっきり、清音・撥音・濁音・半濁音の順なのかと思っていたのですが、撥音・清音・濁音・半濁音の順なのですね。unicode順だから当然と言えば当然ですが

それと今回ソースコードを貼るに当たって 自分用メモブログ:blogger でソースコードを綺麗に表示する方法を参考にさせていただきました。
これで<pre class="brush:csharp"> </pre>
で囲めばc#ハイライトが適用されるわけです。

UnityでLua

Unity3DでLuaInterfaceを呼び出しているのを見たので同じようにやってみました。Unity3d in gameenginejp : Windows で C# から Lua をつかう
dllの配置と配布時にさえ気をつければ簡単に動かせるのでほかのライブラリでもいろいろと試してみようと思います。しかし、Unityなんでもできるね。

心機一転

新しいPCが手に入ったので3.4もでたので改めてUnity3DインストールしたらMonoDevelopが使いやすくなっている気がする。バージョンがあがったからということにしておこう。

7.18.2011

Unityでのスクリプト環境整備その1

Unityをなんともなしに始めてみたのですがどうにもビルトインエディタであるUniSciTEが使いにくかったのでいろいろ探してみました。
そこで見つけたのがNotePad++を使用したUnityScriptの編集です。以下に補足しておきます。
尚、UnityとNotePad++がインストールされているものとして書いていきます。(私の環境ですとUnity v3.3.0f4、NotePad++ v5.9.2のunicode版です。)
まずはNotePad++をインストールします。(私がインストールした時点でv5.9.2でした。)

ドキュメントの関連付け

  1. NotePad++のプラグイン、「LanguageHelp」をここのNotePad++plugin > LanguageHelpからダウンロードします。(私がダウンロードした時点ではv1.40)
  2. NotePad++ディレクトリ\pluginsにLanguageHelpU.dllのみ配置します。
  3. 配置したらNotePad++を起動し、メニューからプラグイン>LanguageHelp>Optionsを選択し、Addでメニューが出るので各項目を埋めて行きます。Name:にUnity、Extension listに使用するスクリプトの拡張子を記述します。複数ある場合はスペースを空けて記述します。例)js cs。Extended help file pathにhttp://unity3d.com/support/documentation/ScriptReference/30_search.html?q=$word$を入れます。
  4. ワードを選択した状態でCtrl+F1で選択ワードを検索できるようになりました。
キーワードのハイライト
  1. Unityディレクトリ\Editor\Data\Tools\UniSciTE\unitykeywords.propertiesの中の2行目にUnityで使用するキーワードがあるのでそれをコピーします。
  2. NotePad++のメニューから設定>スタイル設定を選択し、JavaScriptのKEYWORDを選択、ユーザ定義のキーワード項に先ほどコピーしたキーワードを貼り付けます。ちなみにこのやり方ですとC#は対応できないようです。恐らくStyleIDを定義しないといけないのだと思いますがないようなので今回はスルーします。
  3. 保存して閉じるを行い、キーワードのハイライトが変わるのが確認できるかと思います。尚、テーマを変更する際には同じようにキーワードを追加しなければなりません。
オートコンプリートの呼び出し
  1. NotePad++のメニューから設定>環境設定>自動保存/入力補完の入力候補の「入力の毎に補完を行う」と「関数名補完」と「入力の直後関数のパラメータヒントを表示」のうち、必要なものにチェックを入れる。「入力の直後関数のパラメータヒントを表示」のみチェックを入れるとうるさくなくてよいかもしれません。その場合はデフォルトですとCtrl+Spaceでヒントを表示します。
  2. Notepad++ディレクトリ\plugins\APIs\内の使用するスクリプトに対応するファイルを開く。例)javascriptであれば、javascript.xml、C#であればcs.xmlを開く。
  3. javascriptであればhttp://unity.igorrafael.com/home/UnityAPI_JS.xmlをダウンロードし、C#であればhttp://unity.igorrafael.com/home/UnityAPI_CS.xmlをダウンロードし中身を<AutoComplete>以下に追記する。
  4. これで関数の入力補完ができるようになりました。
UnityのエラーコンソールからNotePad++にジャンプする
    UniSciTEじゃないとエラーコンソールに跳べないので細工を行います。
  1. Unityディレクトリ\Editor\Data\Tools\UniSciTEを開き、UniSciTE.exeのバックアップを取る。
  2. Project Kyrill:Redirect to Notepad++で言及されてい通り、UniSciTEにしかエラー行を渡してくれないので踏み台にすることでNotePad++にエラー行が渡されるようにします。詳しくは先ほどのエントリーを参考にしてもらえればシンタックスエラーがエラーコンソールに表示されているときに直接エラー行へジャンプできるようになるかと思います。

これでかなり使いやすくなったと思います。他にもNotePad++の便利なプラグインがいろいろとあるようなので探してみてよさそうなのがあったらまとめたいと思います。またUnity関連のTips的なものがあればその都度まとめます。