10 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 12

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

[Unity]ポケガストーリー、ポケガに動画いれてみたよ。動画見終わったあとの画面回転は自分で対応してね!by あどふりくん 

おはようございます。坂内です。

今週末にはポケットガールストーリー Vol1リリースしようかと思っております。
もちろんAndorid版だけ。
IOSはそこから審査なげるっす。

ポケガストーリー、ポケガ本編共にリワード広告を入れてみました。

意外とサクッと入りましたね。

で、1点困ったのが画面回転です。

ポケガストーリーは横持ちで作成してたんですが、動画が流れた後は勝手にオートローテーションになってしまうってやつ。
あ、ちなみに動画はアドフリくんです。
よく見たらマニュアルにも書いていたし、問い合わせでも「変わっちゃうから、コールバックで固定し直してあげてね」ってきました。

ってことで、コールバックにて対応。
ちなみに再生処理された時に、準備できていなかった場合の処理も加えてみた。

    public void MovieRewardCallback(ArrayList vars) {
int stateName = (int)vars[0];
string appID = (string)vars[1];
string adnetworkKey = (string)vars[2];
AdfurikunMovieRewardUtility.ADF_MovieStatus state = (AdfurikunMovieRewardUtility.ADF_MovieStatus)stateName;
switch(state) {
case AdfurikunMovieRewardUtility.ADF_MovieStatus.StartPreload:
break;
case AdfurikunMovieRewardUtility.ADF_MovieStatus.PrepareSuccess:
break;
case AdfurikunMovieRewardUtility.ADF_MovieStatus.FailurePreload:
adfuriUtil.reloadMovieReward();
break;
case AdfurikunMovieRewardUtility.ADF_MovieStatus.StartPlaying:
break;
case AdfurikunMovieRewardUtility.ADF_MovieStatus.FinishedPlaying:
Screen.orientation = ScreenOrientation.LandscapeLeft;
// ここにリワード的ななにかを

break;
case AdfurikunMovieRewardUtility.ADF_MovieStatus.FailedPlaying:
adfuriUtil.playMovieReward();
break;
default:
return;
}
}

IEnumerator StartMovie() {
while(!adfuriUtil.isPreparedMovieReward()) {
yield return new WaitForSeconds(0.5f);
}
adfuriUtil.playMovieReward();
}


これで、準備終わってない時は終わるまで待ってから動画再生されるはず!


ってことで、ポケガストーリーのリリースと共に、Android版のポケガではリワードを入れてゲームの難易度をちょこっとだけ下げてみます!
ゲーム中のお金たまんないよー (/д\)ふぇぇ って方に朗報です!

では、週末をまたれい ノシ
スポンサーサイト

Category: 開発日記(Unity)

tb 0 : cm 2   

【Unity】パスを取得後の保存とかギャラリー反映とか…先週の続き 

こんにちは。
大坂です。

なんとなく先週の記事の続きです。
はい!ネタがなかったからです!orz

サンプルです。
「StreamingAssets」フォルダの中のファイルを書き出してます。
#if UNITY_ANDROID
string path;
// 保存パスを取得
using(AndroidJavaClass environment = new AndroidJavaClass("android.os.Environment"))
using(AndroidJavaObject exDir =
environment.CallStatic("getExternalStoragePublicDirectory",
environment.GetStatic("DIRECTORY_DCIM"))) {
path = exDir.Call("toString");
}

// StreamingAssetsのファイルを取得
string tmpPath = "jar:file://" + Application.dataPath + "!/assets/test.jpg";
WWW www = new WWW(tmpPath);

while(!www.isDone) {
yield return null;
}

string fileName = path + "test.jpg";
// 書き込み
System.IO.File.WriteAllBytes(file, www.bytes);

// ファイル保存のために1フレーム待つ
yield return new WaitForEndOfFrame();

// メディアスキャン
using(AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using(AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity"))
using(AndroidJavaObject context = activity.Call("getApplicationContext"))
using(AndroidJavaClass mediaScannerConnection = new AndroidJavaClass("android.media.MediaScannerConnection")) {
mediaScannerConnection.CallStatic("scanFile", context, new string[] { fileName }, new string[] { "image/png" }, null);
}
#endif

サーバにファイル置いて取りたい時なんかはWWWで指定しているのをURLにすればとれますし、
画面キャプチャが良ければ、ファイルの取得と書き込み部分を消して
「Application.CaptureScreenshot("../../../../DCIM/" + test.jpg);」とかってすればできますね。

何かに使えれば幸いです。

では、また来週ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

ハルシオンシステムの動向と、宴使ってみたけどマニュアルがしっかりしてて書くことないよ?の巻 

はい、こんにちは。
ハルシオンの小さくて金髪のおっさんの方です。

最近のハルシオンの活動についてちょっと。

現在は、ポケットガールのアドベンチャーゲームを作っています。
ほんと、ゲームというか読み物ですね。
タイトルは「ポケットガールストーリー ~永久の中のひと時~ Vol.1」です!
ポケットガールをやって頂いた方にはポケガのストーリーがちょっと分かると思うのですが、主人公の錬金術師は500歳とかそれ以上とか生きている、”永久の錬金術師”と呼ばれる人物。
ホムンクルスの生成に成功し、一緒に暮らすようになった二人。
その中の日常なんかをストーリー形式で読み物にしてみました。

もちろん最後まで読んで頂いた方にはクリア特典も!

あと、タイトル通りVol.1なんですよね。

Vol1は一番初めの初期娘が中心です。
評判良ければ成長した娘のストーリーを作っていく予定です。
連載アプリとしてやっていけたらなーという感じです!

こちらのリリース予定は12月初旬の予定です。

それと、もちろんポケットガール2も制作中です。
早ければ1月中にはリリースします!
こちらは1の~永久の錬金術師~とは打って変わって、王道ファンタジー的な感じの予定。
キャラもストーリーもイベントも全て作り直し中。
1とは遠い世界の話。(同じ世界だよ)
冒険とか色々と手を入れてます。

1を楽しんでくれた方も、2からの方でも楽しめる1作にしたいと思います!

んでは、開発についてのお話。

ポケガストーリーではUnityのアセットである”宴”を使用してみました。
慣れればすぐに色々と使えますね!

1点だけ、宴の外から宴のオートセーブをする方法。
まぁ宴内でクイックセーブボタンを押した時と同じことをさせたんですけど。

    IEnumerator AutoSave() {
yield return new WaitForEndOfFrame();
//セーブ用のスクショを撮る
utageEngine.SaveManager.CaptureTexture = letterBoxCamera.CaptureScreen();
//クイックセーブ
utageEngine.QuickSave();
}


そのまま外から、「utageEngine.QuickSave();」ってやるとエラーが出ちゃったんですよね。
スクショのデータがないっていうエラー。

なので、宴の中でスクショ取ってるのと同じコードを外部でもつけてあげたって感じです。
一応これで、オートセーブできたー
宴の仕様で、ページ送りするたびにオートセーブの準備はされているんだけど、たぶんバックキーを押してアプリを終了させた時しか実際の保存はされていないのかな?って感じです。(何か勘違いしてるかもしれませんが)

一度宴から外の処理(別画面等)に移った時なんか、バックキーで宴のバックキー処理が走らないので、このタイミングでアプリ落とされるとオートセーブされなかったんですよね。
ってことで、上記の処理を宴外で呼び出して、宴のオートセーブを実装してみました。
使い機会あったらどうぞw

ってことで、今日はこんなところです。

あでゅ~ノシ


Category: その他日記

tb 0 : cm 0   

【Unity】ネイティブなしでAndroidのSDカードのパスを機種依存しないで取得 

こんにちは。
大坂です。

もう11月も後半に差し掛かりましたね…。
あっという間に年末になりそうですorz

さて今週も小ネタです。
まぁ使えるか使えないかは別としてタイトルの通りです。
ネイティブ使ってますけど、iOSでカメラロールに絵を置きたい時なんかはこっちの記事に書いてますので、ご参考にどうぞ。

早速コードと結果を。すごく短いですけど。
#if UNITY_ANDROID
using(AndroidJavaClass environment = new AndroidJavaClass("android.os.Environment"))
using(AndroidJavaObject exDir = environment.CallStatic("getExternalStorageDirectory")) {
Debug.Log(joExDir.Call("toString"));
}
#endif
Debugで出るログはXperiaZ4の環境で「/storage/emulated/0」がでてきますね。

ついでにあんまり変わりませんが、「DCIM」フォルダを直接取りたい時はこんな感じ。
#if UNITY_ANDROID
using(AndroidJavaClass environment = new AndroidJavaClass("android.os.Environment"))
using(AndroidJavaObject exDir =
environment .CallStatic("getExternalStoragePublicDirectory",
environment .GetStatic("DIRECTORY_DCIM"))) {
Debug.Log(exDir.Call("toString"));
}
#endif
結果は「/storage/emulated/0/DCIM」ですね。
何かアクセスしたくてパスがほしい時はこんな感じで取れますよってことで!

あ、読み書きしたい時は「AndroidManifest.xml」に以下のパーミッションが必要ですかね?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

では今週もこれでノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

デジゲー博2015いってきたんだよ。なかなか面白かったんだよ。って話し(技術ネタなくてすいません 

こんつわ!坂内っす!
TVで言ってたんですが、例年より今の時期の温度が高いということでした。
それより温度差が結構激しいですよね。皆さん風邪に気を付けて下さいまし。

ってことで、昨日はデジゲー博2015いってきましたよっと。
そのあと3次会まで飲んでたら、途中で電車なくなったよっと。

デジゲー博とは。
http://digigame-expo.org/
はい、こちら参照。

デジゲー博って3回目だったんですね。
僕は今回初参加でした。え?もちろん客側で。

感想としては、色々なゲームがあって楽しかったけど、同人色が強いかなって。いうか、同人のイベントですもんね。
コミケとかは全然興味なくていったことないんですが、同じ感じなんすかね。
あ、でもすごく良さそうなゲームも一杯ありましたよ。あんまり社交的じゃないんでプレイさせて貰うってのはやらないので、基本は遠くから見てるだけなんすけどね。

とりあえず知り合いのブースが何個かあったので、挨拶できて良かったです!

room6さんブースはTGSの時と同じく華があってお客さん絶えなかった感じでした!さすがまさしはんやわ~

あと気になったのが、ブースはあるんだけど席でずーっとぼーっとしてたり、スマホいじっててお客さんを呼び込みもしようとしない方いました。
せっかくブースを開くという行為まで頑張ったのに、そのあとがもったいないなーって感じた。まぁ1日ずっとスマホいじってたわけじゃないだろうから、ちょうど見たタイミングかなと思ってますが。

いや、ブース開くアクティブ性があるだけ、うちよりは良いとは思うんですよ!ただもったいないなーって思っただけなんですけどね。

ってことで、せっかくデジゲーいったので、簡単な感想なんかを書いて本日のブログは逃げたいと思います。



アデュ~ノシ

Category: その他日記

tb 0 : cm 0   

【Unity】Xcodeの作業をちょっとでも減らしたい 

こんにちは。
大坂です。

最近ずいぶん寒くなって気がします。
今年は暖冬らしいですが雨が多くてひんやり感じるときが多いと何かで言ってました。
どっちやねん!って感じです(笑)

さて本日の小ネタ。
以前、Unity5にした時のXcodeの対応でこんな対応してますよって書いてたやつです。
この記事ですね。
まぁ簡単な話が、Compile Sourcesに「-fno-objc-arc」つけないといけないmmファイルがあるよって話です。
こいつですね。


これいつの間にか?Unity側でつけられるようになってたんですね。
気づいたのは最近なのでUnity5.2.2の時です・・・。いつからあったんでしょうか。
対象のファイルをクリックするとInspectorにこんなのが出るので赤枠のところに「-fno-objc-arc」を書いてあげるだけです。


小ネタなのでこれだけです!
ではまた来週ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

昨日ベーマガのイベントいってきたんよ。おもろかったんよ。んで、エディタ拡張初心者編2巻なんよ。 

こんにちは!坂内っす。

昨日はベーマガのイベントいってきたんですよ。
ベーマガしってます?
マイコンBASICマガジンっていう雑誌なんですけどね。
これこれ ↓
http://basicmagazine.wix.com/aabm

いやー 面白かった!普段は全然こういうイベントとか行かないんですけどね、「PC=高価なゲーム機」って感じで中学校の時から触ってたので、すごい懐かしい感じ一杯でした。
9割以上がおっさんというイベントでしたが、面白いトークが聞けて良かったっすよ。


ってことで、よーし!エディタ拡張2回目!

今日も初心者っぽいのをやってくよ!

前回はint、string、enumの値をInspectorで入れる時にラベルでわかりやすくするってことやりましたけど、今回も引き続き、ラベルで見やすくする編。

今回はスライドバーでintの範囲を決めさせたり、boolのチェックボックスとかも置いたりしてみました。

Step1.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Step1 : MonoBehaviour {
public int testNo;
public string testName;
public enum USE_COLOR {
RED,
BLUE,
GREEN,
WHITE,
};
public bool bossFlg;
public int enemyHP;
public Vector2 initPosition;
public Color enemyColor;

public USE_COLOR useColor;

public Text txtNo;
public Text txtName;
void Start() {
txtNo.text = testNo.ToString();
txtName.text = testName;
}
}


Step1Editor.cs
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Step1))]
public class Step1Editor : Editor{
public override void OnInspectorGUI() {
var obj = target as Step1;
EditorGUILayout.ObjectField("クラス",(Step1)obj,typeof(Step1),true);
obj.testNo = EditorGUILayout.IntField("なにかのNO", obj.testNo);
obj.testName = EditorGUILayout.TextField("なにかの名前", obj.testName);
obj.useColor = (Step1.USE_COLOR)EditorGUILayout.EnumPopup("使用する色",obj.useColor);
obj.txtNo = (UnityEngine.UI.Text)EditorGUILayout.ObjectField("UI-ナンバー", obj.txtNo,
typeof(UnityEngine.UI.Text), true);
obj.txtName = (UnityEngine.UI.Text)EditorGUILayout.ObjectField("UI-名前", obj.txtName,
typeof(UnityEngine.UI.Text), true);
EditorGUILayout.Separator();
EditorGUILayout.LabelField("敵情報");
obj.bossFlg = EditorGUILayout.Toggle("ボス", obj.bossFlg);
obj.enemyHP = EditorGUILayout.IntSlider("敵のHP",obj.enemyHP,0,10000);
obj.initPosition = EditorGUILayout.Vector2Field("敵の初期位置", obj.initPosition);
obj.enemyColor = EditorGUILayout.ColorField("敵の色",obj.enemyColor);
}
}


って感じにすると、こうなります。


まだ凄さが分からない!エディタ拡張の神髄はどこにあるの!
また来週勉強してみます!

ではアデュ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【Unity】iOSで広告位置指定メモ - アドジェネ編 - 

こんにちは
大坂です。

朝から打ち合わせで外に出ていたので疲れました(ぇ
日頃外に出ないのですぐ疲れてしまいます。

なんてことはない話なんですけど、iOSでアドジェネの広告をX,Yの座標で指定するときのメモ。
普段iOS触らないので、忘れないように書いておきます。

中央とか、一番上一番下に出したい時はAndroidと同じ指定ができる
「IsIOSEasyPosition」オプションを有効にすればいいのでそちらを使えばいいんですけどね。
「IsIOSEasyPosition」をTrue指定すれば、Androidと同じ「Horizontal」と「Vertical」の指定で広告が配置されます。

ほとんどの場合はこれでいいんですけど、レクタングルとかで中央とかからちょっとずらして出したい時とかは
「Margin」がAndroidのみの指定なので、同じ設定だとうまくいきませんね。
そんな時はX,Yの座標を指定してあげる必要があります。

基本的な話からでX=0,Y=0を指定するとこんなイメージで出ますね。
スクリーンショットじゃないのはちょっと毎回コンパイルに時間がかかるのでイメージ図で…orz

指定した座標に広告の左上がくる感じですね。
で真ん中の座標を指定した場合はこんな感じ。
 
指定した位置から広告が出るので当り前ですね。
そして、真ん中の指定方法はディスプレイの仕様によって変わるんですよね。
ディスプレイの使用はこの辺を参考に。
iPhone/iPad解像度(画面サイズ)早見表
座標指定で気にする項目はRetinaところですかね。

それぞれ真ん中の指定方法は
Retina1 の場合:「X=Screen.width / 2」、「Y=Screen.height / 2」
Retina2 の場合:「X=Screen.width / 4」、「Y=Screen.height / 4」
Retina3 の場合:「X=Screen.width / 6」、「Y=Screen.height / 6」(?)
Retina3はiPhone6Plusとか持ってないので確認できてませんが・・・orz
誰か知ってたら教えてくださいまし。

あとは広告をちょうどいい位置に置きたいので、広告のサイズでずらしたい分を引いてあげます。
横は真ん中で縦はやや下に置きたい場合は、アドジェネのレクタングル広告のサイズが「300x250」なので
Retina1 の場合:「X=Screen.width / 2 - 150」、「Y=Screen.height / 2 - 50」
Retina2 の場合:「X=Screen.width / 4 - 150」、「Y=Screen.height / 4 - 50」
Retina3 の場合:「X=Screen.width / 6 - 150」、「Y=Screen.height / 6 - 50」(?)
とかって指定をしてあげるとこんなイメージで表示されますね!
 

広告位置の指定で何回もコンパイルしなおして確認すると結構な時間を取られるのでメモです。
あ、あと機種?の判定って皆さんどうやってやってるんですかね。
今回の対応するときは上で紹介した早見表のピクセル使って判定したんですけど…。
SystemInfoの項目とか使う方法もありますかね…?
この辺は機種がいっぱいあればそれぞれで出力されるの確認してできそうですけど。

こんな方法がいいよ!っていうのがあったらその辺の判定も教えてもらえると助かります!
何せ手持ちのiOSの機種が一台しかないので、なかなか確定した方法がつかみにくいです!

自分にしか役立たないメモかもしれませんけどこの辺で!
また来週ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【Unity】先週月曜Twitterに絵がつかないって件は、案の定俺のせい!えでぃたーかくちょーさわってみたよ? 

10月が終わり11月になってしまいましたね。
今年もあと2カ月です。

クリスマスも近づいてきました。
また一人でクリスマスかぁ 彼女ほしいなぁ。

はい!バンナイです。

一気に寒くなってきましたねー 風邪にお気を付け下さいまし。

あ、先週Twitterに絵がつかねーー!って言ってたのですが、原因判明しました。

AndroidManifestのせいでした。

具体的に何かというと、AndroidでTwitterに絵を張り付ける場合、2クッションの処理が必要になります。

<先週の記事抜粋>
path = "jar:file://" + Application.dataPath + "!/assets/icon.png";
WWW www = new WWW(path);
yield return www;
path = Application.persistentDataPath + "/icon.png";
File.WriteAllBytes(path, www.bytes);


①WWWでアプリから絵のデータを取り出し、Application.persistentDataPathの場所に書きだす。
②Application.persistentDataPathの場所から絵を取り出してTwitterに付ける。
の2つです。

この①の"Application.persistentDataPathの場所に書きだす"で失敗していました。
(エラーだしてくれよなぁ・・・出てたのかなぁ DDMS見てたと思ったんだけど・・・)

原因はAndroidManifestに、<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />を書いていたものの、書いている場所がおかしかったためでした・・・・・まぁよくあるミス?

ってことで、AndroidManifestに気を付けよう!!!

話しは変わるんですが、Unityのエディター拡張って便利って聞きますよね!

全然使ったことはないんですが、どんなことできるのかなー程度でも見て見ようかと思い、ちょっと触ってみました。
エディター拡張初心者オブ初心者が送る、エディター拡張こんなことできるよ!第一弾はこちら。

using UnityEngine;
using System.Collections;

public class Step1 : MonoBehaviour {
public int testNo;
public string testName;
public enum USE_COLOR {
RED,
BLUE,
GREEN,
WHITE,
};
public USE_COLOR useColor;

public Text txtNo;
public Text txtName;

void Start() {
txtNo.text = testNo.ToString();
txtName.text = testName;
}
}

こんな感じでコードを書くと、こうなります。


まぁ、変数名とか見ればわかるようにするのは普通なんですが、もっとわかりやすくするために、エディター拡張で味付け!



日本語でわかりやすくInspectorを出すことに成功!!!

EditorフォルダにStep1Editor.csを作って以下を書くだけ!!

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Step1))]
public class Step1Editor : Editor{
public override void OnInspectorGUI() {
var obj = target as Step1;
obj.testNo = EditorGUILayout.IntField("なにかのNO", obj.testNo);
obj.testName = EditorGUILayout.TextField("なにかの名前", obj.testName);
obj.useColor = (Step1.USE_COLOR)EditorGUILayout.EnumPopup("使用する色",obj.useColor);
obj.txtNo = (UnityEngine.UI.Text)EditorGUILayout.ObjectField("UI-ナンバー", obj.txtNo, typeof(UnityEngine.UI.Text), true);
obj.txtName = (UnityEngine.UI.Text)EditorGUILayout.ObjectField("UI-名前", obj.txtName, typeof(UnityEngine.UI.Text), true);
}
}




・・・




う、うん。

これさ、たとえばtestNameの行書かないと、Inspectorにさえ出てこなくなるんだよね・・・・・
100個変数あったら100行コードを別に書かないといけないってこと?

めんどくせーーーーーーーー よくわからん!

なんか、まだエディター拡張触ってみた感じ、便利なのか全然分かりません!

今後もちょこちょこエディター拡張に手出してみようかな・・・・

ってことで、今日はこれでおしまい!

アデュ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0