オブジェクトの回りに動的なGUIを配置する。
UnityのGUIは動かないというイメージがありますが、実際には毎フレームごとに座標を与えてグリグリ動かすことができます。
今回は戦国無双みたいなゲームとかで、よく敵キャラクターの頭の上にある体力ゲージとか名前をイメージしたスクリプトをやってみました。
以下はデモです。Shiftキーを押しながらドラッグすることで動かせます。
でもなぜか私の環境のmacでは、safariだとライトがおかしいとかchromeだとそもそも動かないです・・・。
ワールド座標をスクリーン座標に変換する。
まず、ゲームオブジェクトのワールド座標をスクリーン座標にするためには、カメラオブジェクトのメソッド、WorldToScreenPoint(Vector3)を使います。
Vector3 ScreenPosition = camera.WorldToScreenPoint(target.position);
これをカメラオブジェクトにつけます。
ちなみにスクリーン座標をワールド座標にするのはScreenToWorldPoint(Vector3)です。
オブジェクトの回りに動的なGUIを配置する。
流れとしては、Update関数でオブジェクトの座標(Vector3)を取得してスクリーン座標に変換し、その変数のXとYの数値をOnGUI関数のRectの引数に渡しています。
using UnityEngine;
using System.Collections;
public class LookATGUI_C : MonoBehaviour {
public Transform GUIWatchPoint;
private Vector3 ObjectPoint;// オブジェクトのワールド座標
private Vector3 ObjectPointPlus;// オブジェクトのちょっと上の座標
private Vector3 GUIScreenPoint;// オブジェクトのスクリーン座標
private float ScreenHeight = Screen.height;
void OnGUI () {
GUI.Box(new Rect(GUIScreenPoint.x-60,ScreenHeight - GUIScreenPoint.y + 40,120,40),"Hello!");
}
void Update () {
// Objectの座標を代入
ObjectPoint = GUIWatchPoint.position;
ObjectPointPlus = new Vector3(0,0,0) + ObjectPoint;
GUIScreenPoint = camera.WorldToScreenPoint(ObjectPointPlus);
}
}
注意点としてオブジェクトのY座標は、上に上がるとプラス、下に下げるとマイナスなのに対して、GUIのRectの引数のY座標は上に上がるとマイナス、下に下げるとプラスになるところです。
あとスクリーン変換した座標をそのままいれればよいというわけではなく、最初にスクリーンの高さを取得してそれにマイナスしてやる・・・もう書いててワケわからないのでスクリプトを参照のこと。
これだけのためにかなり時間かかりました・・・。
UnityのC#でXMLを読み込む。
xmlデータを取得して内容を読み込むことができると、例えばTwitterのタイムラインを表示させたりブログの記事を読み込んだりと、様々なWEBアプリケーションと連携することができて夢が広がります。
javascriptならxmlを簡単に読み込める形にしてくれる外部jsを読み込むか、C#ならxmlクラスがあるのでそれを使います。で、javascriptだと日本語の情報が無いのもありなかなかうまくいかないので、どうせならということでC#でやってみました。
Twitterのタイムラインのxmlについて
読み込むxmlはTwitterのタイムラインの方が今っぽいですかね。
以下のアドレスで@motar_24のTweet(20件)がXML形式で取得できます。ブラウザのアドレスに直接打っても確認できますが、safariだと改行されずそのまま表示されます。Chromeだと整形して表示してくれますね。
http://twitter.com/statuses/user_timeline/motar_24.xml
XMLの記述内容についてはここでは省略しますが、タグで囲まれているTweetテキストがあるのがわかると思います。このテキストを引っ張ってきて表示させるわけです。
注意点として、ローカルからならTwitterのAPIにアクセス(XMLを取得)できますが、Unityのプロジェクトがウェブに公開される場合(webプレーヤー)はクロスドメインの関係で取得できないようです。flashの場合はphpをかましてできるみたいですが、Unityはわかりません。
(http://d.hatena.ne.jp/nakamura001/20110730/1312044175)
XMLを取得するC#
Macでやりたい場合は、Monoをインストールする必要があります。
mono
Windowsの場合、7やVistaなら問題ないですが、XPなら.NET Frameworkをインストールする必要があるかもしれません。
内容をコメントしてあるので参考にしてください。
using UnityEngine;
using System.Collections;
using System.IO;// 追加で記述
using System.Xml;// 追加で記述
public class XMLLoder : MonoBehaviour {
// TwitterのxmlデータのURL
string XMLFilePath = "http://twitter.com/statuses/user_timeline/motar_24.xml";
XmlDocument doc;// XMLオブジェクト
XmlNodeList nodeListtext;//テキストの配列
void Start () {
doc = new XmlDocument();// XMLオブジェクトを生成
doc.Load(XMLFilePath);// XMLのファイルを読み込む
// 全部配列
nodeListtext = doc.SelectNodes("statuses/status/text");// テキストの配列のできあがり
// あとは配列を読み込むだけ
Debug.Log(nodeListtext[0].InnerText);
}
}
上記のスクリプトをコピペしてGameObjectとかに貼りつけてプレビューすれば、ConsoleにTweetが表示されているはずです。
実際に使うときにはGUI.Labelに入れたりします。できてしまえば簡単ですね!
UnityでWindowsのソフトを立ち上げる。C#
EXE形式のWindowsUnityアプリから、Windowsのソフトを立ち上げるやり方。ブラウザ向けにビルドしようとするとエラーになりました。Macはもちろん不可。
当初はそんなことができるか見当もつきませんでしたが、Facebookで質問したところ教えていただきました。
スクリプトはC#です。WindowsのコマンドやC、C++も入力できるようですが、そちらはUnity Proにする必要があります。
using UnityEngine;
using System.Collections;
using System.Diagnostics;
public class OpneExcel : MonoBehaviour {
void OnGUI ()
{
if(GUI.Button(new Rect(10,10,150,120),"Open Explorer"))
{
System.Diagnostics.Process.Start("EXPLORER.EXE","C:¥¥Documents and Settings¥¥アカウント¥¥My Documents");
}
}
}
上記の例では単純にボタンを押すとエクスプローラーが立ち上がります。
今回はC#なので色々とインポートしてMonoBehaviourを継承してから記述します。
まずはSystem.Diagnosticsを読込んで、後はSystem.Diagnostics.Process.Start関数で読込むだけです。
System.Diagnostics.Process.Start("アプリケーション","ファイルのパス");
注意する点として、ファイルのパスに使う¥マークは2つ必要です。C#の仕様で、多分バックスラッシュがどーのっていう理由だと思います。
あまりWindows用のEXEファイルを起動させる機会はあまりないと思いますが、業務用であれば需要がありそうです。
ということで久しぶりの投稿でした。
Unityのワークショップやりました。

9月4日にUnityの初心者向けワークショップ、「スクリプトの「ス」から始めるUnityワークショップ」をやりました。
内容は午前中に基本的な使い方と物理演算のワークショップ、午後からはスクリプトの概念と、ウォークスルーのワークショップをやったのですが、配布したデータが古かったせいでウォークスルーがうまくできず、ちょっとグダってしまったのが悔やまれます。
またスクリプトの話に関してはできるだけ分かりやすく説明したつもりですが伝わったかどうか・・・。
またワークショップやるのであれば資料をしっかり用意するのはもちろん、やっぱり助手の方が欲しいですよねぇ・・・。色々準備するのに一人でやると時間かかりますし、しゃべる内容のことばっかり考えててATNDの確認とか写真撮るとか記録を残しておくなどの細かい所まで気が回りませんでした。
また参加してくださった皆さんありがとうございました。中には神奈川から来てくださった方もいたのに内容がアレで申し訳ない気分ですが、色んな方に出会えてよい機会になったと思います。
次回は・・・あるのかっ!?でもその時は今よりかなりスキルアップしてるはず(本もあるし仕事で使ってるし)なんでもっと質問に的確に答えられるはず。でもなにより準備が大切だなと痛感しました。
さて、上の画像がワークショップで使ったモデルの素材だったんですが、前ばりをしているの「MB」っていう、「QB」にかけたまぁその・・・ネタだったのですけど・・・うん、もっとボキャブラリーのセンスも磨かないとなぁ。
C3D勉強会で発表したかき氷Unityアプリ
7月31日(日)に行われたC3D勉強会に参加してきました。
事前に出されていた宿題は「夏」をテーマだったので、私は「夏」といったらやはりかき氷なので、Unityの物理演算を使ってかき氷マシーンを再現してみました。(実際には勉強会に間に合わなかったので調整してあります)
画面をクリックするとインスタンスとして生成されたCubeが器に入って・・・いかない、散らばりまくるアプリです。削られる氷の大きさや散りばり方、スクリプトはかなり力技です。ブラウザでも思ったよりはスピードが出てる印象ですが、低スペックのマシンだと厳しいと思います。
簡単なアプリですが、これが簡単にAndroidアプリに移植できるんですからスバラシー。
またUnityに関しても色々と発表させていただきました。どんなソフトか〜からunity Remote、アニメーションのやり方などなど。
今まで散々Unityいいよ〜って言いふらしてきたのに全く作品を作っていなかったので、やっとまともな発表ができて一安心です。
9月あたりにUnityの初心者向けワークショップとかやりたいな〜と思っていますが、名古屋で需要あるのかな・・・。Unityの場合3Dソフトの知識も必要なので、全てにおいて初心者の人はついていけないような・・・。

