ノートPC「ThinkPad X250」のセットアップと同期設定

というわけで、先日購入したノートPC「ThinkPad X250」のセットアップや設定に関するお話です!
結構つまづいた点が多いので書いておきます!

Windows10(64bit版)のインストール

自分が購入した「ThinkPad X250」の初期OSはWindows7の32bitです。
元々は64bitの8.1をダウングレードしたものらしく、10の64bitを入れることもできるようです。
以下の記事を参考にさせて頂きました!

http://tripleh128.blog.jp/archives/1036568246.html

当然64bitの方がいいので再インストールします。
32bitだとメモリ(4GB)全てを使えないのでなおさらです。

メインPCはCドライブの他にXドライブを作成し、開発系のデータはXに置くようにしてあります。
メインに合わせてパーティションを作成しようとしたところ、何故かエラーとなってしまい、Cドライブが認識されなくなってしまいました。

再インストールもダメ、復元も修復もダメなので、一度HDDを初期化してOSから入れ直すことに。
コマンドプロンプトからdiskpartを起動し、clean allを実行。
・・・軽い気持ちで行いましたが、これすごく時間が掛かるようです。
自分の場合、500GB弱のHDDが7時間経っても終わりませんでした。
しびれを切らしてプロンプト上でEnterを押したところ、何故かクリーン完了と言われ逆に戸惑うことに。

その後windows10のインストールを試したら上手くいったので、結果オーライでしょうか。
(マイクロソフトのサーバー側でPC情報を保管しているため、一度アップグレードしたPCの場合プロダクトキーは聞かれないらしいです)
怖いのでパーティションは分けずに使うことにしますorz

同期設定

デスクトップPCとノートPC間でプロジェクトデータを同期させたいところです。
Windowsの「同期センター」を使うことで、同一ネットワーク上のパソコン間の同期が簡単にできるとか。
共有フォルダの発展のようなものらしいです。

まず共有フォルダにアクセスできるようにします。
デスクトップ側の共有するフォルダに共有設定を行い、ノート側で \\[デスクトップのPC名]\[フォルダ名] にアクセスするわけですが・・・。
ここでデスクトップのPCにアクセスできず詰まってしまいました。

結論から言うと、ノートPCの無線LANの接続先がよろしくなかったようです。
自宅はNECのルーターを使っていますが、接続先にプライマリとセカンダリがあり、セカンダリの方に接続していたため、デスクトップPCと通信ができない状態になっていました。(ping等で確認)
プライマリの方に接続し直したら問題なくアクセスできました!

あとは同期設定。
\\[デスクトップのPC名]\[フォルダ名] を右クリックし、「常にオフラインで使用する」を選択。
これで同期センターの「オフラインファイルの管理」に追加されます。
自分はPCログオン時に同期し、外部電源未使用時は同期しないように設定を変更しました。

まとめ

ということで、ノートPCが最低限開発ができる(であろう)環境になりました!
流石にUnityを起動すると重くなりますが、少し見せるくらいなら問題なさそうです。

ノートPC「ThinkPad X250」を購入しました!

というわけで、タイトル通りノートPC「ThinkPad X250」を購入しました!

CIMG1378

前々からノートPCは1台欲しいなーと思っていたところです。
X260が出たためか、X250がかなり安価になっていたので購入。
他にも候補はありましたが、スペックと画面サイズ・重量のバランスが一番良かったので選択しました!

用途としてはサブPC&持ち運び用PCといった感じです。
既にデスクトップPCはあるので使う機会は多くはなさそうですが、外出時や出張時に持ち運べるので需要はあります。
特に県外のセミナーや研修はノートPCが必須となることが多いので、なおさらですね。

そんなわけで、さくっとセットアップしてしまいます!
まずは開封から。

CIMG1377

主に入っているものは本体とバッテリーパック、電源ケーブルだけ。
自分の買ったところでは付属でマカフィーが付いてきましたが・・・たぶん使わないと思われます。

画面サイズは12.5インチ、重要は1.5kg程です。
概ね理想通りの手頃な大きさです。
その他スペックは価格.comに載っているものそのままです。

http://kakaku.com/item/K0000742778/spec/#tab

ノートPCでUnityの動作環境を満たせるかがすごく心配でした。
公式にも超ざっくりとした推奨スペックしか載っていません。
DirectX9.0以上なら動くようなので、オンボでも行けるとは思います。

ひとまずWindows7から10にアップデートするわけですが、WindowsUpdateがとにかく長い!
「これ動いてるのか?」というレベルで、結局寝るまでに間に合わず後日持ち越しにorz
「Windows7 SP1」の更新プログラムを入れてからやり直したところ、2時間ほどで完了しました。

CIMG1379

Windows10も入ったところで、UnityとBlenderをインストールします。
インストール過程でVisualStudioも入れます。
適当にプロジェクトを作って動作確認し、問題なく動かせることを確認しました!

ノートPCでも割と問題なくいけそうです。
Windows10に慣れていないので、それ以前の問題だったりもしますが・・・。
8系よりは使いやすそうなので、早めに慣れてしまいたいです。

まとめ

そんなわけで、ThinkPad X250の購入とUnityの動作確認をしてみました!
「ちょっと誰かにゲーム見てもらいたい」といった時、持ち運んでその場で修正したりできるのは便利です。

デスクトップPCで開発しているものと同期したいので、そのあたりもどうするか考えていきたいところです。
そもそもOSが32bitだったりするので、64bitに入れ替えたい感じでもあります。

【Unity】iTween実行時のエラー「Material doesn’t have a color property ‘_Color’」について

※本記事投稿時に使用したiTweenのバージョンは2.0.5です。

shot2ss20160207230450889

というわけで、iTweenでColor系やFade系の関数を使った際、

「Material doesn’t have a color property ‘_Color’」

といったエラーが出ることがあります。
意味はそのままで、「マテリアルに_Colorというプロパティがない」といった感じでしょうか。

その「Color_」ですが、Unity5標準のシェーダーには大抵入っている基本的なプロパティです。
iTween実行時もデフォルトでは_Colorを変化させるようです。
ただし、パーティクル系のシェーダーなどは「_TintColor」となっていたりします。
故に「実行対象のオブジェクトの子にパーティクルがある」といったケースで発生しやすいエラーです。

対処法

エラーが出ても他のマテリアルの変化は正常に行われるわけですが、やはりエラーは嫌なものです。
ということで、iTween.csの該当部分を修正してみました!
バージョン2.0.5版でいくと3338行目付近になります。

for (int i = 0; i < GetComponent<Renderer>().materials.Length; i++) {
    if (gameObject.GetComponent<Renderer>().materials[i].HasProperty(namedcolorvalue.ToString())) {
        colors[i,0]=GetComponent<Renderer>().materials[i].GetColor(namedcolorvalue.ToString());
        colors[i,1]=GetComponent<Renderer>().materials[i].GetColor(namedcolorvalue.ToString());
    }
}

for文でマテリアルの数だけGetColorを実行しています。
その後のGetColor()でエラーが出ているため、その手前でMaterial.HasPropety()で該当のプロパティ(この場合は_Color)があるかをチェックします。
これでプロパティが存在しない場合でもエラーが出なくなります。

もし自作シェーダーなどでプロパティ名が統一されている場合、iTween実行時のパラメータ「NamedColorValue」を指定する手もあります。
これがデフォルトでは_Colorになっているので、文字列でプロパティ名を指定すればOKです。

まとめ

そんなわけで、超さくっとiTweenのエラーについてのお話でした!
その場で直しても時間が経つと忘れてしまったりするので、面倒でも記事にして残していきたいです。

そもそもiTweenのソースって勝手に変えていいものか分かっていなかったりします。
オープンソースだし大丈夫だと思われますが・・・。

【ステージメモ】CharacterMotorを使った滑る床の実装

というわけで、今回はタイトル通り、CharacterMotorを使って「滑る床」を実現してみようと思います!
寒い今日、季節的にもジャストな話題ではないでしょうか。

20160205

ゲーム的にはステージギミックの1つで、特定のブロックの上では滑るような移動になります。
この手のギミックはアクが強すぎると面倒なことになったりするので、過激な設定は避けるように気を付けていきます。
また、ジャンプ中は滑る床の影響を受けません。

滑る床と判定の作成

氷の床の名目で「IceFloor」というCube状のオブジェクトを作ります。
大きさは使用箇所によって変化させ、マテリアルは水色っぽくします。

shot2ss20160205210400610

Cubeを足場として使用するためBoxColliderが設定されていますが、これでプレイヤーとの接触判定を行うのはなかなか厳しいです。
なので「足場としての判定用」と「制御用スクリプトの判定用」の2つのBoxColliderを設定します。
足場用はCubeの形状そのままで、制御用はCenterをY軸に少しずらし、isTriggerにチェックを入れておきます。

CharacterMotorのパラメータ設定

上で作ったIceFloorに制御用スクリプトを付けます。

using UnityEngine;
using System.Collections;

public class IceFloor : MonoBehaviour {

    [SerializeField]
    private float MaxGroundAcceleration;

    private float defaultMaxGroundAcceleration;

    public void OnTriggerEnter(Collider c) {
        if (TagUtility.getParentTagName(c.gameObject) == "Player") {
            CharacterMotor charMotor = c.gameObject.GetComponent<Player>().getCharacterMotor();
            defaultMaxGroundAcceleration = charMotor.movement.maxGroundAcceleration;
            charMotor.movement.maxGroundAcceleration = this.MaxGroundAcceleration;
        }
    }

    public void OnTriggerExit(Collider c) {
        if (TagUtility.getParentTagName(c.gameObject) == "Player") {
            CharacterMotor charMotor = c.gameObject.GetComponent<Player>().getCharacterMotor();
            charMotor.movement.maxGroundAcceleration = defaultMaxGroundAcceleration;
        }
    }
}

予めPlayerクラスにCharacterMotorのgeterを作っておきます。
CharacterMotorの変数をpublicにしている場合は不要です。

肝となるのはCharacterMotorの「Max Ground Acceleration」です。
これはキャラクターが接地している場合の最大加速度になります。

OnTriggerEnterでPlayerクラスからCharacterMotorを取得し、その値をデフォルト値として取得した後、インスペクターから設定した値で上書きします。
これでIceFloorに接地している際にはツルツル滑ります。
どのくらいの値にすれば良いかはオブジェクトの大きさやゲームのスタイルによって変わります。

また、Exit時はしっかりデフォルト値に戻すようにします。
これが抜けているとずっと滑りっぱなしになってしまうので注意します。

まとめ

・滑る床として「IceFloor」を実装
・足場用と制御用のColliderを2つ設定する
・CharacterMotorの「Max Ground Acceleration」を変化させ、滑るような挙動にする

最近実装した要素の中ではサクっと出来た方です。
CharacterMotorもパラメータさえ理解できればいろいろと応用できます。

「敵が滑らない」という問題が残っていますが、Rigidbodyで行うのは難しそう・・・。
物理マテリアルで上手くできそうな気がしないでもないので、暇なときに検証してみます!