Month: 1月 2012

Inpaintを購入してみた。

App Storeをたまたま覗いていたら、Inpaintという写真のいらない部分を簡単に削除してくれるソフトが85円のセールをやっていたので購入してみました。で、Twitterで反応がよかったので試して見ました。
Inpaintでいらない部分を削除してみた。

う〜ん・・・。photoshopで手でやった方がきれいに仕上がると思いますが、何しろソフトがシンプルで使いやすいので、まぁいいんじゃないでしょうか。85円だし。
ついでにこれは無理だろって画像も試して見ました。
Inpaintで無理やり背景を消してみた。

ですよね・・・。
これは別にInpaintが問題なのではなくて、Photoshopでやっても大して変わらないと思います(比べてませんが)。
Adobeがサンプルで出しているやつは大抵うまくいくような素材を使ってますからね・・・。

App Storeはこういった単機能に絞ったソフトがよく出ていて、しかもたまに安くなっているのでいいですね。

オブジェクトの回りに動的なGUIを配置する。

UnityのGUIは動かないというイメージがありますが、実際には毎フレームごとに座標を与えてグリグリ動かすことができます。
今回は戦国無双みたいなゲームとかで、よく敵キャラクターの頭の上にある体力ゲージとか名前をイメージしたスクリプトをやってみました。

以下はデモです。Shiftキーを押しながらドラッグすることで動かせます。
でもなぜか私の環境のmacでは、safariだとライトがおかしいとかchromeだとそもそも動かないです・・・。

デモ

ワールド座標をスクリーン座標に変換する。

まず、ゲームオブジェクトのワールド座標をスクリーン座標にするためには、カメラオブジェクトのメソッド、WorldToScreenPoint(Vector3)を使います。
[javascript]Vector3 ScreenPosition = camera.WorldToScreenPoint(target.position);[/javascript]
これをカメラオブジェクトにつけます。
ちなみにスクリーン座標をワールド座標にするのはScreenToWorldPoint(Vector3)です。

オブジェクトの回りに動的なGUIを配置する。

流れとしては、Update関数でオブジェクトの座標(Vector3)を取得してスクリーン座標に変換し、その変数のXとYの数値をOnGUI関数のRectの引数に渡しています。

[javascript]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);
}
}[/javascript]
注意点としてオブジェクトの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だと整形して表示してくれますね。
[javascript]http://twitter.com/statuses/user_timeline/motar_24.xml
[/javascript]

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をインストールする必要があるかもしれません。

内容をコメントしてあるので参考にしてください。
[javascript]
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);

}
}
[/javascript]

上記のスクリプトをコピペしてGameObjectとかに貼りつけてプレビューすれば、ConsoleにTweetが表示されているはずです。
実際に使うときにはGUI.Labelに入れたりします。できてしまえば簡単ですね!

© 2017 UXIC.net

Theme by Anders NorenUp ↑