2014年10月31日金曜日

エクリプスの文字化け対応。デフォルトをUTF8にする

開発環境を再構築したところフォルダにエラーマークが。。
ソースを開いてみたところ日本語が文字化けしていました。
プロジェクトごとに文字コードを設定するのは面倒なのでエクリプスの設定ファイルを編集しました。

対応策

エクリプスのeclipse.ini
-Dfile.encoding=utf-8
と追記する。
eclipse.exe -clean.cmdを実行。
バッチが無い場合は-cleanを自動時の引数にしてください。

以上でデフォルトの文字コードを設定できます。

2014年10月26日日曜日

Unity Remote4 USB接続からのタッチパネル操作

スマホ用のUnity Remoteアプリを使用することで、実機にインストールせずにタッチパネルのテストができます。

Unity Remote使い方



Unity Remote USB
  1. UnityのメニューバーのEdit(Fileと表示されるバージョンもある)>Project settings>Editerを選択
  2. インスペクタウインドウのRemoteをAndroidまたはIOSにする
  3. Unity再起動(新しいプロジェクトごとに設定しなおす必要あり)
  4. スマホのUnity Remoteアプリを起動する。
  5. Unityの実行ボタンを押すとゲーム画面がスマホに映り、操作ができる。

Unite Remoteアプリのバージョンは使用しているUnityと合わせてください。

2014年10月25日土曜日

Unity バージョンアップ方法

数ヶ月ぶりにUnityをバージョンアップしてみました。
最新版はUnitySetup-4.5.5です。

Unityはアプリケーションからのアップデートには対応していません。
Unityを新規にインストールした際と同じ手順でアップデートします。

  1. Unityの本体を公式サイトからダウンロード。
  2. ダウンロードしたセットアップファイルを実行。

以上でバージョンアップされます。
あらかじめUnityをアンインストールする必要はありません。
インストールフォルダを同じにすればOK。
設定情報や履歴は引き継がれます。

注意点

セットアップが実行されるまで数分かかります。※ファイルが大きいため展開とウイルスチェックに時間がかかる。
サンプルのインストールのチェックは外してかまいません。
VistaにインストールをしたらXXX.exe初期化できませんでした。エラーメッセージがブラクラのようにインストールが終わるまで表示されました。正常にインストールはされていました。

2014年10月24日金曜日

Unity Error while importing package: Couldn't decompress package

パッケージをインポート使用としたところ以下のエラーが発生。
Error while importing package: Couldn't decompress package
どうやらパッケージ名に日本語を使っていたためのようです。
※全角文字を含めたパッケージをインポートできる事がある。
半角英数を使えばエラーが解消されます。

他にもエクスポート機能には不具合があるような気がします。
エクスポート項目が全て表示されないことがあるので注意を。
対応策はアセットをフォルダで管理して、エクスポート時にルートに近いフォルダが存在するかを確認するなど。

Unityはバグがあってもバージョンアップは面倒なので放置しがちです。
※UnityのUpdateは1ギガ以上のファイルをダウンロードしてインストールし直す必要がある。

2014年10月23日木曜日

Unityボタンでのジャンプ力の調整と空中での移動

アクションゲーム用のジャンプ制御を改良してみました。

  • ジャンプボタンを押しっぱなしでジャンプ力が増します。
  • 空中で左右へ移動できます
  • 二段ジャンプはできません。
  • 横移動して落下中もジャンプはできません。

接地判定は以下の記事を参考にしてください。
キャラクターコントロールクラスと地面判定の記事はこちら

以下がサンプルソースです。
public float speed =   9.0f;
public float jumpspeed = 5.0f;
private float JAMP_SPEED = 6.5f;
public float gravity = 9.0f;
private Vector3 idou =  new Vector3();
public void Start()
{
//kyo.jimen = false;//地面判定は自作しないと
}
public void Update()
{
//地面判定
if (kyo.jimen) { idou = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxisRaw ("Vertical"));
idou = transform.TransformDirection (idou);
idou *= speed;
if (Input.GetButton ("Jump")) {
idou.y = jumpspeed;
}

} else {//空中でも移動
idou.x = Input.GetAxis ("Horizontal") * speed;
if (Input.GetButton ("Jump")) {
jumpspeed= jumpspeed/2;
idou.y += jumpspeed;
}
}
idou.y -= gravity * Time.deltaTime;

rigidbody.velocity = idou;//直接加速度を設定すつ
}
//地面判定
void OnCollisionEnter(Collision collision)
{
kyo.jimen = true;
jumpspeed = JAMP_SPEED;

}
void OnCollisionExit(Collision collision)
{
kyo.jimen = false;
}

やっつけ仕事ですみません。操作性はゲームの要なので、まだまだ改良していく予定です。
シフトや論理演算を使うなど処理速度を改善できればと思います。

2014年10月22日水曜日

Unity衝突させない当たり判定イベント

ColliderのIsTriggerをOnにするとオブジェクトをすり抜けることができます。

その際の衝突イベント(当たり判定)
private void OnTriggerEnter(Collider other)
private void OnTriggerStay(Collider other)
private void OnTriggerExit(Collider other)
ColliderのIsTriggerをOnにすると呼び出される。

普通の衝突イベント
private void OnCollisionEnter(Collision collision)
private void OnCollisionStay(Collision collision)
private void OnCollisionExit(Collision collision)
オブジェクト同士が衝突して止まるか押される。

衝突イベントの種類

Enter

オブジェクトと接触した瞬間に呼ばれるメソッドです。
接触時に一回呼ばれます

Stay

オブジェクトと触れている間に呼ばれるメソッドです。
接触中は毎フレーム呼ばれます。

Exit

接触していたオブジェクトから離れた瞬間に呼ばれるメソッドです。
接触時に一回呼ばれます。

Unity開発環境用MacPCスペック検証2014

Unity開発で使用するPCスペックを調べて新型のMacとの相性を調べてみました。
Unityはトライアンドエラーでの開発に向いているのでデバッグに重点を置いて考えます。
GPUよりCPUを重視します。ただし、内蔵グラフィックだと性能が低いためCPUとの性能バランスが悪いこともあります。

iMac 2014

コストパフォーマンス悪し
クアッドコアモデルなら性能十分。
ディスプレイを持っていない人向け。

Mac mini 2014

廃価モデルはコストパフォーマンスが優秀。
メモリを交換できないのでメモリ4GでMac OS Xをそのまま使うには難がある。BootcampでWindowsを入れたほうが良い
i5-4260U 1.4Gも上位モデルのi5もCUPの値段がほぼ同じ。キャッシュもシェーダ数も変わらない。
消費電力と静音性と排熱はディスクトップ最高レベル。ファンが油圧ベアリングになった。

Mac mini 2012

コストパフォーマンス優秀。
クアッドコアモデルにメモリを増設すればiMac2014よりも優れているはず。
グラフィック性能と排熱が弱い。

Mac Book Air 2014

コストパフォーマンスは普通。
PCを持ち運ぶ人向き。Macノートはバッテリーのもちが良い。
SSDなのでメモリが少なくても問題はない。
SSDなので容量が少ないため、Bootcampを使うなら外付けHDDが必要。
開発に使うなら外部ディスプレイがほしい。

Mac Book Pro 2014

コストパフォーマンスは普通。
お金に余裕があるならAirよりもProのRetinaモデルを買ったほうが画面が広くて良い。

結論

廃価版Mac miniにWindowsを入れて開発をしよう・・・
何よりWindowsのほうが慣れていますし、Win8のパッケージ版は安い。
MacはiOSのビルド環境です。

ハードウェア的にはHDDがボトルネックです。上位モデルを選択するのならフュージョンドライブよりもPCIe接続のSSDがおすすめです。
Mac mini2014の分解画像を見る限りではPCIeポートが存在するようですが形状が独自になっています。





2014年10月19日日曜日

Unity バーチャルジョイスティックとボタンを作成

アセットストアのユニティテクノロジーが無料で配布しているバーチャルジョイスティックとボタンをプロジェクトに追加しました。

https://www.assetstore.unity3d.com/jp/#!/content/14474
アセット名 Sample Assets (beta)
その中からインポートするフォルダ Cross Platform Input
インポート完了後はアセットのSample Assets/Cross Platform Input/Prefab/Mobile Single Stick Control Rigをヒエラルキーウインドウにドラックアンドドロップするだけです。
※ビルドセッティングをスマホにしないとバーチャルスティックが表示されません
バーチャルジョイスティック画像

ジョイスティックの使用方法

Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxisRaw("Vertical"));
Vector3(CrossPlatformInput.GetAxisRaw("Horizontal"),0,CrossPlatformInput.GetAxisRaw("Vertical"));
に書き直すことでタッチしたジョイスティックの入力を拾えます。

バーチャルボタンの使用方法

Input.GetButton ( "Jump")
CrossPlatformInput.GetButton ( "Jump")
に書き直すことでボタンのタッチを拾えます。


ゲームエンジンの比較まとめ

ゲームエンジン

自分はゲームエンジンにUnityを選びました。
理由は以下のとおりです。
  1. 情報量の多さ
  2. 統合開発環境
  3. マルチプラットフォーム
  4. 利用できる言語
  5. ネイティブプログラムの組み込み
 Unityは利用者数が多く、ほかのゲームエンジンの10倍以上の人口です。
そのため日本語の情報も多く、アセットストアを通じてプログラムや3Dモデルの開発者も数多くいます。
 アセットストアを通すことで様々な部品を利用することができ、素材を集めるのが楽になります。
 個人で3Dゲームを開発するならばUnity一択かもしれません。

2014年10月18日土曜日

MacでUnity開発に必要な最低スペック

Mac miniやMacBookAirでどのくらいUnityでゲーム開発ができるか調べてみました。
必要な最低スペック

PCスペック

Intel Core i5 1.4G
メモリ DDR3 1600 4G

現在販売されているMacの最低スペックです。

結果

重そうなデモプロジェクトも普通に動作します。
テスクチャを拡大縮小しても問題なし。
個人で開発をする分には最小構成のMacで十分です。
Macは起動するだけでメモリを5ギガくらい大量消費しますが、
内3ギガはメモリの高速化をするためキャッシュです。
実際は1.5ギガ程度のメモリ消費と考えて問題ありません。
メモリは大いに越したことはありませんが開発効率を考えると以下になります。

Macで開発を始めようと考えている方は以下の優先度でハードを選ぶといいです。
  1. 20インチ以上のディスプレイ
  2. SSD
  3. メモリ8G以上
  4. GPU GForce X50以上
  5. CPU Intel クアッドコア

ノートPCで開発をするのなら最低でもディアルディスプレイと外付けキーボードはほしいところです。

Unity オブジェクトを移動させる方法色々

オブジェクトの移動にはtransform.positionを使う方法がありますが他にも


があります。

velocityはオブジェクトの速度を設定します。
AddForceはオブジェクトに力を加えます。
動かしてみると分かりますがvelocityは速度を直接指定しているので摩擦がかからずに一定速度になります。一方AddForceは地面では摩擦で動きが遅いですが、ジャンプさせると加速し続けます。

具体的な使用方法は以下のサンプルソースを参考にしてください。
リジットボディも必要です。
using UnityEngine;
using System.Collections;

public class Sousa : MonoBehaviour {

public float speed =   9.0f;
public float jumpspeed = 9.0f;
public float gravity = 20.0f;
private bool jimen = false;

private Vector3 idou =  new Vector3();

public void Start()
{
jimen = true;//地面判定は自作しないと
}

public void Update()
{
if (jimen)
{
idou = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxisRaw("Vertical"));
idou = transform.TransformDirection (idou);
idou *= speed;

if(Input.GetButton ( "Jump"))
{
idou.y = jumpspeed;
}
}
idou.y -= gravity * Time.deltaTime;
//transform.rigidbody.AddForce(moveDirection);//力を加えて移動
rigidbody.velocity = idou;//直接加速度を設定すつ


}
}

2014年10月17日金曜日

Mac mini 性能比較 2012 vs 2014

本日午前2時頃にアップル社の新製品発表がありました。

タブレット指紋認証が付いたくらいの変更です。
一体型デスクトップパソコンはiMac5kディスプレイの映像クリエイター向けバージョンが追加されました。

IOS開発用に期待していたMac miniはというと

旧型と性能はたいし
て変わらなそうです。
クアッドコアモデルが無くなりました。

2年前あたりでCUPやメモリなどPC部品の進歩が止まっているせいです。
来年ならBroadwelやDDR4が期待できたのですが。。
追記。よくみたらメモリがLPDDR3になっていました。性能向上よりもメモリを交換できないのがネックのような。

ベンチマークと比較してみると

Mac mini 2012 intel Core i5 2.5G Mac mini 2014 intel Core i5 1.4G
CPUの処理は旧型、GPUは新型がやや優れていました。ほぼ変わりがありません。
旧型はクアッドコアモデルがあるぶん伸び城が大きい。CPU以外の他のパーツはほぼ同じですし。

2014年10月16日木曜日

Unity キャラクターの移動とジャンプ

スペースキーでジャンプ。矢印キーで移動します。
CharacterControllerクラスを使用したアクションゲームのサンプルソース。
動かしたいオブジェクトにRegitBodyとCharacterControllerと以下のスクリプトクラスを追加して使用してください。

基本オブジェクト以外を動かす場合はCharacterControllerの辺り判定を調整してください。

using UnityEngine;
using System.Collections;

public class ChareIdou : MonoBehaviour {

public float speed =   9.0f;
public float jumpspeed = 9.0f;
public float gravity = 20.0f;


private Vector3 moveDirection =  new Vector3();
private CharacterController controller;

public void Start()
{
controller =GetComponent("CharacterController")as CharacterController;
}

public void Update()
{
//CharacterController.isGroundedキャラクターが地面に接しているか?
if (controller.isGrounded)
{
moveDirection = new 
//TransformDirectionはローカルのTransform情報をワールド座標系に変換します
Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxisRaw("Vertical"));
moveDirection = transform.TransformDirection (moveDirection);
moveDirection *= speed;

if(Input.GetButton ( "Jump"))
{
moveDirection.y = jumpspeed;
}
}
//Time.deltaTimeは前フレームが呼び出されたときからの経過時間を取得出来ます
moveDirection.y -= gravity * Time.deltaTime;

controller.Move (moveDirection * Time.deltaTime);
}
}

2014年10月15日水曜日

Unity MissingComponentException CharacterController

CharacterControllerを使用時のエラーメモ。
スクリプトからCharacterControllerを使う場合は、ゲームオブジェクトのインスペクタからAddComponentボタンを押して物理のCharacterControllerを追加してください。

MissingComponentException: There is no 'CharacterController' attached to the "Sphere" game object, but a script is trying to access it.
You probably need to add a CharacterController to the game object "Sphere". Or your script needs to check if the component is attached before using it.
RoboIdou.Update () (at Assets/)

例:
以下のコードを使用しているスクリプトはCharacterControllerコンポーネントを同じオブジェクトに追加して併用する必要があります。
cc = GetComponent("CharacterController")as CharacterController;

ANDROIDのアクティブバージョン統計情報





バージョン別シェア一覧


Android 4.4 24.45%
Android 4.1 24.13%
Android 4.2 16.22%





Android 2.3.3 - 2.3.7 13.96%
Android 4.0.3 - 4.0.4 10.09%
Android 4.3 8.41%
Android 2.2 2.10%
Android 3.2 0.31%
Android 2.1 0.14%
Android 3.1 0.09%

2.3がまだ14%ほど使用されています。

2014年10月11日土曜日

WindowsだけでIOS開発 Unity Cloud Build

 WindowsだけでIOS開発ができると便利なのですがMacを使わないとIOSアプリをコンパイルできません。方法がないものかと以前に調べていましたが、結局Macハードが必要と結論がでました。※仮想環境Macはアップデートができないし、安定しない。
 そこで最近サービスが開始された「Unity Cloud Build」について調べてみました。

Unity Cloud Buildは名称どおりサーバでUnityプロジェクトを管理し、アプリをコンパイルしてくれるといったもの。いろいろと登録しないといけません。複数人でプロジェクトを管理するにはいいかも?

とりあえず結論。

WindowsだけでIOSアプリを作れます。Appleストアで公開も可能なはず。
ただし、Unity Cloud Buildサービスは空きがないようで再募集されるまで登録できません。
たぶん、有料になるんじゃ。。

一番安いMac mini 2014でも買おう・・・

2014年10月8日水曜日

色彩感覚テストアプリ

カラー診断画像

色彩感覚テストアプリをリリースしました。

Unityアプリのリリース手順の確認用に作成した簡単なアプリです。
サンプルイメージ色弱テスト

色のついたパネルを並べてグラデーションを作り、
色彩感覚をチェックします。
この手のゲームはいくつかありますが、使用する色の選択や量がいまいちで、
とてもやる気になれませんでした。(忍耐力テストみたい)
そこで、このアプリは素早く色彩感覚をテストできるようにしました。
色彩感覚が弱い方で無ければ1000点取れます。

Unityでの作成について。
GUIの作成が不便です。Unity4.6のリリースが待ち遠しい。
便利な点。アプリ画像は一つ作れば大小は自動で作成してくれます。
UnityでビルドするとJavaで書く40倍の容量に。。最低20M消費?
とりあえず統合開発環境代わりに使えます。

本格的なゲームも設計中です。

2014年10月6日月曜日

Unityのフレームレートとタッチイベント

スクリプトからフレームレートを指定する場合は
Application.targetFrameRate = 10//一秒間に10回描画
と書きます。

プログラムの処理が重い場合にフレームレートを安定させるため、
フレームレートをあらかじめ下げることがあります。
注意点としては、フレームレートと各種イベント(タッチイベントなど)が同じ間隔になってしまうことです。

描画は遅くしたいが、タッチイベントは最速で処理したいときなどは、描画用のスクリプトに制御が必要になります。

初回ビルド時に以下のエラーが発生しました。

Error building Player: UnityException: Bundle Identifier has not been set up correctly
Please set the Bundle Identifier in the Player Settings. The value must follow the convention 'com.YourCompanyName.YourProductName' and can contain alphanumeric characters and underscore.
Each segment must not start with a numeric character or underscore.

バンドル識別子を設定してください。値は 'com.YourCompanyName.YourProductName'規則に従う必要がありますし、英数字とアンダースコアすることができます。
各セグメントは、数字、文字またはアンダースコアで始めることはできません。

解決方法

画面左上のFileを選択してプルダウンリストのBuild Settingを押すと表示されるウインドウのPleyre SettingボタンインスペクタのOther Setteingの項目Bunble Identyfierを入力する。社名とプロダクト名も入力わすれに注意。

例:com.test.test



Unityビルドエラー Error building Player: Win32Exception: ApplicationName zipalign.exe

UnityでBuild & Runを実行したら以下のエラーが表示されました。

Error building Player: Win32Exception: ApplicationName='C:/Android/adt-bundle-windows-x86-2014X/sdk\tools\zipalign.exe', CommandLine='4 "C:\X\X\Temp/StagingArea/Package_unaligned.apk" "C:\X\X\Temp/StagingArea/Package.apk"', CurrentDirectory='Temp/StagingArea'

zipalign.exeが見つからないそうです。

解決方法

SDK/build tools/zipalign.exeを
SDK/toolsへコピーすればよい。

2014年10月4日土曜日

スマホのおすすめのモバイルバッテリー

 予備のバッテリーを用意するよりもモバイルバッテリーがお勧めです。
あいほん
お勧め2014年夏の新製品。
スマホなら5回ほど充電可能。
端末を自動で判断し、最速の電力を供給。
安全対策も完璧。
18ヶ月保障。
LEDライトにもなる

2014年10月1日水曜日

Unityシングルトン。スクリプトやシーン間でのデータ共有

シングルトンで必要な機能。
一つの実体でいつでもどこからでもデータを保持受け渡しできること。
Unityのシングルトンにはいろいろと制約があるのでC#はJAVAに慣れている人でもリファレンスを見る必要があるかも。

以下のC#スクリプトを作成する。
Tukau1 シングルトンデータを使うクラス。どこに実装してもいい。
DataKanri 空のゲームオブジェクトに実装する。(ドラッグドロップ)
Kyouyuu 共有データ置き場。とりあえず変数mojiを共有。


データを実際に使用する場合
using UnityEngine;
using System.Collections;

public class Tukau1: MonoBehaviour {

void Start () {
DataKanri dk = DataKanri.Instance;
Debug.LogWarning (dk.moji");
                dk.moji="Tukau1"; 
       Debug.LogWarning (dk.moji");
}
}

データをゲームオブジェクトに関連付けて保持する
using UnityEngine;
using System.Collections;

public class DataKanri: Kyouyuu<DataKanri> {

void Awake(){
DontDestroyOnLoad (this);//シーン移動でゲームオブジェクトを破棄しない
}

// Use this for initialization

void Start () {

}

// Update is called once per frame
void Update () {

}

}

実際にデータを置く場所。
using UnityEngine;
using System.Collections;

public class Kyouyuu<T> : MonoBehaviour where T : Kyouyuu<T>
{
public string moji ="Kyouyuu";//必要なだけ変数を作ってOK。内部クラスを作っても良い

protected static T instance;
public static T Instance {
get {
if (instance == null) {
instance = (T)FindObjectOfType (typeof(T));

if (instance == null) {
Debug.LogWarning (typeof(T) + "インスタンス無いよ");
}
}

return instance;
}
}

protected bool CheckInstance()
{
if( instance == null)
{
instance = (T)this;
return true;
}else if( Instance == this )
{
return true;
}

Destroy(this);
return false;
}

protected void Awake()
{
CheckInstance();
}

}


適当なソースから使いやすそうなものをチョイスしました。
他にもシングルトンの書き方があるそうです。

Unity内部クラスの多次元配列C#

UnityのC#に慣れていないため配列の宣言と初期化がわかりませんでした。

多次元配列の指定は大かっこ内にカンマです。
INT[][] INT[,]
クラスの配列は一つずつインスタンスを作成しなければいけません。
System.Serializableを宣言することでインスペクタを使うことができます。

//内部クラスでデータ管理
[System.Serializable]
public class Data : Object{
public string namae="";
public float x=0f;
public float z=0f;
}
public Data[,] data = new Data[7,6];

//初期化

for(int i= 0;i<7;i++){
for(int j = 0;j<6;j++){
data[i,j] = new Data();//初期化
}
}
//値を入れる
data[z,i-1].namae= "a"+j+i;
data[z,i-1].x = cube1.gameObject.transform.position.x;
data[z,i-1].z = cube1.gameObject.transform.position.z;