Browse Author

cafe16162

BulletをMac OS X(Xcode)で用いる

オープンソースの物理エンジンBulletをXcodeで用いるときにちょっと手こずったので。
「Bullet Xcode」なんかでぐぐるといくつか出てきますが、それぞれでやり方が微妙に違ったりするので、個人的に一番簡単だと思った手順を下記にまとめておきます。

  • 下準備

ビルドにCMakeのコマンドライン版を用いるので事前に使えるようにしておいてください。Homebrewなどのパッケージマネージャーを用いてインストール、あるいは、CMakeのGUI版があるならそれ経由でインストールも可能です。CMakeのGUI版は過去にインストールしたけどコマンドライン版は使えないなー(cmakeコマンドが効かない)という方は下記をターミナルで入力してください。

PATH="/Applications/CMake.app/Contents/bin":"$PATH"
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install

CMake(GUI版)の”Tools”->”How to Install For Command Line Use”メニューの記述がソースです。気になる方は確認してみてください。
さて、これで下準備は完了です。


  • Bulletのダウンロード

さて、まずはBulletをダウンロードしないと何も始まりません。

https://code.google.com/archive/p/bullet/downloads

上記サイトからUnix用のものをダウンロードして、適当なフォルダで展開しておいてください。
(執筆時の最新版は「bullet-2.82-r2704.tgz」です)

 

  • Bulletのビルド

次はビルドをします。CMakeでやると簡単だよーという記述があったのでCMakeを用います。今回はビルド後にXcodeプロジェクトに組み込みやすいように、BulletをFrameworkディレクトリとしてライブラリ化します。

上記手順でダウンロード後に展開したフォルダ名を「bullet-2.82-r2704」とします。
下記をターミナルで入力してください。

cd bullet-2.82-r2704
mkdir bullet-build
cd bullet-build
cmake .. -G "Unix Makefiles" -DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \
   -DCMAKE_OSX_ARCHITECTURES='i386;x86_64' -DCMAKE_BUILD_TYPE=RelWithDebInfo \
   -DCMAKE_INSTALL_PREFIX=/Library/Frameworks -DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \
   -DBUILD_DEMOS:BOOL=OFF
make -j4
sudo make install

途中、少し時間がかかるかもしれません。気長に待ちましょう。
しばらくして全ての処理が完了したらルートディレクトリのLibrary/Frameworksを見てみましょう。

ls /Library/Frameworks/

とやって、そこにBullet〜系のフレームワークとLinearMath.frameworkが生成されていれば完璧です。

 

  • 自分のXcodeプロジェクトに導入する

Bulletをフレームワークとして用いることができるようになったので、あとはそれを自分のプロジェクトに導入すれば終了です。
Xcodeのプロジェクト設定画面を開いて、Build Phase -> Link Binary With Libraries の項目に先ほど生成したFrameworkを追加するわけですが、ここでのデフォルトのパスが先ほどインストールした/Librari/Frameworksではなく、/System/Library/Frameworksになっているため、普通に検索したのでは出てきません。

open /Library/Frameworks/

などとやって、Finderで開いたのちにドラッグ&ドロップしてください。
スクリプトでは下記のファイルをインクルードするようにしてください。

#include <BulletDynamics/btBulletDynamicsCommon.h>

はい、これでXcodeでもBulletを用いることができます。


参考にさせていただいたサイト
http://bulletphysics.org/mediawiki-1.5.8/index.php/Installation
http://lv4.hateblo.jp/entry/2014/02/05/095646
http://blog.livedoor.jp/homuerio/archives/15360956.html


先日、渋谷WWWで行われた酸欠少女さユりさんの2ndワンマンライブ「ミカヅキの航海」を観に行きました。演出、演奏、歌、MC、なにからなにまで最高でした。すべて細かく書きたいところですが、今回の記事以上に長くなってしまうかもしれないのでひとまず堪えます。

いやーーーーー、是非また行きたい!!!!

そう思える素敵なライブでした。ありがとうございます。

さユりさん応援してます。これからも頑張ってください。

Box2Dの導入(VS2013とXcode7.1.1の例)

以前、2D物理演算ライブラリ”Box2D”を自分の環境に導入した時の個人的なメモです。
Visual Studio 2013 と Xcode 7.1.1 の両方でやったので、それぞれでの手順を簡単に。

・Box2Dの入手

上記ページから「Box2D_v2.3.0.7z」をダウンロード。
解凍して得られた <Box2D_v2.3.0> を適当なフォルダに移動。

・Visual Studio 2013 の場合

 

① CMakeでビルド
<Box2D_v2.3.0/Box2D> に <Build> フォルダがあることを確認。
中身は <vs2012> と <xcode5> と <Readme.txt> のはず。
今回はvs2013で用いるので、ここに <vs2013> のフォルダを作成。
CMake(cmake-gui.exe)を起動。
「Where is the source code:」に <Box2D_v2.3.0/Box2D> を指定。
「Where to build the binaries:」に <Box2D_v2.3.0/Box2D/Build/vs2013> を指定。
「Configure」ボタンをクリック。
ここで「Visual Studio 2013」を選択すること。
自分の使用環境とは違うバージョンで生成するとライブラリを生成した後に泣きをみることになる。
Configure done. と出たら、最後に「Generate」をクリック。
<vs2013> の中にいろいろ生成されていることを確認したら次へ。

 

② バッチビルドを行ってライブラリファイルを生成
<vs2013> の中に生成されたソリューションファイルBox2D.slnを開く。
適当なプロジェクト(Testbedがおすすめ)を右クリックでスタートアッププロジェクトに設定して、
ビルド。実行。ちゃんと動くことを確認。
満足したら、ビルドメニューの「バッチビルド」をクリック。
「すべて選択」を選んだ後に「ビルド」をクリック。
すべて処理が終了したらソリューションを閉じる。
このバッチビルドにより、ライブラリファイルが生成されたので、
自分のプロジェクトにBox2Dを組み込むことができるようになる。

 

③ 自分のプロジェクトに導入してみる
Visual Studio 2013 を起動。
Win32コンソールアプリケーションで適当に空のプロジェクトを新規作成。
プロジェクトのプロパティで、
「追加のインクルードディレクトリ」に <Box2D_v2.3.0/Box2D> を設定。
「リンカー」の「入力」のタブの「追加のライブラリファイル」に
<Box2D_v2.3.0/Box2D/Build/vs2013/Box2D/Release/Box2D.lib> を設定。
(vs2013でDebugモードを選択している場合はDebugの方を入力すること)
あとはソースコードで <Box2D/Box2D.h> をインクルードすれば良い。

・Xcode 7.1.1 の場合

 

① Xcodeプロジェクトを作成
Xcode を起動。
新規プロジェクト -> OS X -> Application -> Command Line Tool で次へ。
適切な Product Name を入力し、Language を C++ に設定して次へ。
Source Control のチェックはとりあえず空欄で、
Add to は “Don’t add to any project or workspace” に設定。
どちらもたぶんデフォルトでそうなってるはず。そして “Create” で作成。

 

② XcodeプロジェクトにBox2Dを導入
Finderから <Box2D_v2.3.0/Box2D/Box2D> のフォルダを
Xcodeヒエラルキービューのプロジェクト直下にドラッグ&ドロップ。
なんかダイアログが出るはず。(ここが重要)
“Copy items if needed” と “Create groups” と “Add to targets” のところにチェックを入れる。
ここで、必ず “Create groups” にチェックを入れること。
“Create folder references” にチェックを入れるとうまくいかない。
そして、ヒエラルキービューでプロジェクトを選択し、
Build Settings -> Search Paths -> Header Search Paths に $(PROJECT_DIR)/** と入力。
あとはソースコードで <Box2D/Box2D.h> をインクルードすれば良い。

参考にさせていただいたサイト

・所感
メモをべたっとやっただけなので文字ばかりになってしまいました。そして、ところどころ自分の記述に不安があります。バッチビルドでライブラリファイルが云々のところも自分でよくわかってないところ。不審な点があればご指摘頂けると幸いです。

冬アニメが終わり、季節の移り変わりを感じる今日この頃でした。

Unityエディタ拡張(メニューの追加など)

UnityはCubeとかSphereなどのプリミティブが最初から用意されてて、さくっとなんか試したいときには便利ですよね。しかし3D用のプリミティブはあれど2D用のプリミティブは無い…?Unity2Dでも簡単に使えるプリミティブが欲しい。3Dオブジェクトを置いて2Dのコライダーを入れれば代用できなくもないけどスプライトで欲しいなあ。なんて思って、完全に自分用にSpritePrimitiveなるパッケージを作りました。そのときの備忘録です。


  • Sprite Primitiveのイメージ

SpritePrimitiveのイメージ

図のようにCreate -> 2D Object -> Primitives で形状を選択すれば目当てのスプライトプリミティブを生成できます。超簡単。ためしに Circle を選ぶと…
SpritePrimitiveのイメージ2

Sceneビューの中心に円形のスプライトを持ったゲームオブジェクトが生成されます。Circle Collider 2Dもくっついてます。

ダウンロード(SpritePrimitive.unitypackageをGoogleドライブ上で公開)


  • Sprite Primitiveの構成

構成は次の図の通り。

SpritePrimitiveの構成図

パッケージ中のソースコードはSpritePrimitiveEditor.csのひとつだけ。Spritesフォルダにはプリミティブの見た目の形状となるスプライトを。Resourcesフォルダ以下のプレハブはコライダーもくっつけてそのまま使えるようにしたもの。Createメニューからプリミティブを選択すると、Resourcesフォルダ以下の対応するプレハブを元にオブジェクトが生成されているというわけです。


  • Sprite Primitiveのソースコード
// SpritePrimitiveEditor.cs
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System.Collections;

namespace SpritePrimitive
{
    public class SpritePrimitiveEditor : MonoBehaviour
    {
        // アセットからゲームオブジェクトを生成
        private static void InstantiateGameObject(string path)
        {
            Camera sceneCamera = SceneView.GetAllSceneCameras()[0];                            // Sceneビューのカメラを取得
            Vector3 centerPos = sceneCamera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0f)); // Sceneビューの中心位置をワールド座標で取得

            Object obj = Resources.Load("SpritePrimitives/" + path); // Resourcesフォルダからアセットを取得
            GameObject go = Instantiate(obj) as GameObject;          // GameObjectとして生成
            Selection.activeGameObject = go;                         // 生成したゲームオブジェクトを選択している状態にする
            go.name = obj.name;                                      // GameObject名を設定
            go.transform.position = (Vector2)centerPos;              // Sceneビューの中心に配置
            go.transform.rotation = Quaternion.identity;             // 初期姿勢の設定
        }

        // Createメニューの拡張

        [MenuItem("GameObject/2D Object/Primitives/Box")]
        private static void Box()
        {
            InstantiateGameObject("Box");
        }

        [MenuItem("GameObject/2D Object/Primitives/Circle")]
        private static void Circle()
        {
            InstantiateGameObject("Circle");
        }

        [MenuItem("GameObject/2D Object/Primitives/Triangle")]
        private static void Triangle()
        {
            InstantiateGameObject("Triangle");
        }

        [MenuItem("GameObject/2D Object/Primitives/Pentagon")]
        private static void Pentagon()
        {
            InstantiateGameObject("Pentagon");
        }

        [MenuItem("GameObject/2D Object/Primitives/Hexagon")]
        private static void Hexagon()
        {
            InstantiateGameObject("Hexagon");
        }

        [MenuItem("GameObject/2D Object/Primitives/Star")]
        private static void Star()
        {
            InstantiateGameObject("Star");
        }

    }
}
#endif

自分でも驚くくらい丁寧にコメントが書かれています。過去の自分えらい。
「Createメニューの拡張」以下の部分がそのまんまエディタ拡張部分の記述です。

[MenuItem(“path”)]と書くと、そのpath位置に項目を追加でき、それをクリックしたときに[MenuItem(“path”)]以下の静的メソッドが呼び出されます。この記事タイトルの「メニューの追加」がこの部分のことです。

そして上半分のInstantiateGameObject(string path)がゲームオブジェクトの生成を行っている部分です。ここでやっていることはソースコードのコメントの通り。

特筆しておくことといえば、UnityにおけるResourcesフォルダの振る舞いのことくらい。実はResourcesフォルダはランタイムでアセットを読み込む際などに使うフォルダです。Resourcesフォルダ以下のファイルにはスクリプトからResourcesクラスを介してアクセスすることができるのです。このソースコードでいうと17行目がそれですね。
Resourcesクラスについての詳細は公式のリファレンスでどうぞ。

要するに、エディタに新しいメニュー項目を作って、それをクリックしたらResourcesフォルダにあるアセットをコピーしてオブジェクトを生成。このスクリプトでやってることはこれだけです。


  • スプライトの設定

最後に一つだけ。
プリミティブの基本スケールはちゃんとUnityの1ユニットに合わせたいですよね。例えばScale 1のBoxプリミティブを生成し、Box左下隅をWorld座標(0, 0)に合わせたとき、Box右上隅の点はWorld座標で(1, 1)であってほしいわけです。

そこで重要なのが、スプライトのインポート設定の「Pixels Per Unit」という項目。この項目の意味はその名の通りで、Unityの1ユニットに元画像の何ピクセルをあてるか、というもの。今回はBox用スプライトとして、128×128ピクセルすべて真っ白の画像を用いています。そしてこの一辺を1ユニット相当としたいのでPixels Per Unitを128と設定しています。


 

 

思ったより長くなってしまった。こんなはずでは。

おわりです。デレステやります。

MacでC#プログラミング

MacのターミナルでC#のコンパイル・実行を行う方法のまとめ。
(HelloWorldを行いました)

0. 前提

「HomebrewなどでMonoをインストールしてある」 or 「Unityをインストールしてある」
とりあえずMonoが入ってれば大丈夫かと。

1. 適当なディレクトリで test.cs を作成

// test.cs
using System;

class test
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello, world!");
    }
}

2. mcs というC#コンパイラで test.cs をコンパイル

$ mcs test.cs

もし mcs が not found と言われる場合は、パスがちゃんと通ってない可能性がある。(かくいう自分もそうでした)今回はこのページを参考にしました。Unity経由でMonoを入れた人はUnity.appの中にmcsがあるっぽいので、そこまでのパスを通してあげれば大丈夫。
たぶんmcsは /Applications/Unity/Unity.app/Contents/Frameworks/MonoBleedingEdge/bin/ にあるので(ちゃんと自分でも確認してみてください)、

$ PATH=$PATH:/Applications/Unity/Unity.app/Contents/Frameworks/MonoBleedingEdge/bin/

上記をターミナルで入力すればパスが通って mcs が not found ではなくなると思います。

ちなみに上記コマンドはターミナルを再起動する度に入力をする必要があります。
そんなのめんどすぎて無理って人は、ルートディレクトリにある .bash_profile に下記のものを書き加えておくといいです。(#で始まってる一行はコメント文)

# 'mcs' path
export PATH=$PATH:/Applications/Unity/Unity.app/Contents/Frameworks/MonoBleedingEdge/bin/

書き加えたら、その変更を適用するためにターミナルを再起動してください。改めてパスを通さなくても大丈夫になってるはずです。

3. monoでtest.exeを実行

手順2がうまくいけば test.exe が生成されてるはず。

$ mono test.exe

これで実行できます。
Hello, world! と表示されれば成功。

 

お疲れ様でした。

冷やしあんず、始めました。

すでに年の瀬ですが、ここで暑い夏を思い出してみましょう。

冷やし中華、始めました。というフレーズが思い出されますね。

それとは少し関係無いですが、あんずのうたって最高ですよね。

では「冷やしあんず」なんていかがでしょうか。

 

最高ですね。

というわけで、冷やしあんず、始めました。