rn.log

備忘録など

【5000兆円で覚えるPhotoshop】白い部分を透明にする

はじめに

最近、5000兆円が流行っていますね。

f:id:r-ngtm:20170606192548p:plain



ちなみに5000兆円の元ネタはこちら。



この5000兆円ですが、ダウンロードしてみると白い部分が透明になっていません。


今回はPhotoshopを使って白い部分を透明にしたいと思います。

STEP1. Photoshopで5000兆円を開く

Photoshopへ5000兆円をドラッグアンドドロップすれば5000兆円が開かれます。

f:id:r-ngtm:20170606192239p:plain

STEP2. マジック消しゴムツールで白い部分を消す (完成)

画面左のツールパネルからマジック消しゴムツールを選択します。 消しゴムのアイコンを右クリック。

f:id:r-ngtm:20170606195510p:plain:w256



白い部分をクリックすれば完成です。

f:id:r-ngtm:20170606195655g:plain:h300



5000兆円欲しい! in Unity

f:id:r-ngtm:20170606200232p:plain:w256

【Unity】内側からじわじわ光りだすアニメーションを作ってみた。

Photoshop + Unityで遊んでたら以下のようなアニメーションができたので作り方をまとめてみました。 

f:id:r-ngtm:20170601002644g:plain:h256

Photoshopでテクスチャを作る

256 * 256 でキャンバスを新規作成します。

1. 円形グラデーションのレイヤー作成

まずはレイヤー白く塗りつぶし、グラデーションオーバーレイをかけます。

  1. レイヤーをダブルクリック.

f:id:r-ngtm:20170601003155p:plain:h200

  1. グラデーションオーバーレイをクリックして、赤枠で囲んだ部分を設定します。

f:id:r-ngtm:20170601003554p:plain:h300

グラデーションは以下のように設定します。

f:id:r-ngtm:20170601003623p:plain:h256

設定が終わると以下のような見た目になるはずです。

f:id:r-ngtm:20170601003055p:plain:h128

キャンバスの外側をちょっと暗くするのがポイントです。

2.雲のレイヤー作成

Ctrl + Shift + Nでレイヤーを新規作成します。

メニューの 「フィルター」 -> 「描画」 -> 「雲模様1」を選んで雲を描画させます。

このとき、ブラシの色が白と黒になってないと色がおかしくなるので注意。

f:id:r-ngtm:20170601003934p:plain:h128

雲を描画させたらレイヤーをハードライトにします。

f:id:r-ngtm:20170601004340p:plain:h200

途中経過

f:id:r-ngtm:20170601004318p:plain:h128

3. ハードミックスな白いレイヤーを作成 (完成)

レイヤーを新たに作成して、真っ白に塗りつぶします。レイヤーの塗りの数値を下げて、ハードミックスにします。

f:id:r-ngtm:20170601005009p:plain:h256

完成です。

f:id:r-ngtm:20170601005139p:plain:h128

シェーダーを書く

Shader "Custom/Bright" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _EmissionColor ("Emission Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _EmissionTex ("Emission (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        _Brightness ("Brightness", Float) = 0.0
        _BrightnessOffset ("Brightness Offset", Float) = -1.0
        _BrightnessModifier ("Brightness Modifier", Float) = 1.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex; 
        sampler2D _EmissionTex; // 発光用のテクスチャ

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        fixed4 _EmissionColor; // 発光の色
        half _Brightness; // 発光の値 (これをAnimationClipから操作させます)
        half _BrightnessOffset; // 発光値の基準値
        half _BrightnessModifier; // 発光値の係数

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_CBUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_CBUFFER_END

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            fixed4 e = tex2D (_EmissionTex, IN.uv_MainTex);
            o.Albedo = c;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
            o.Emission = max(0.0, e * _Brightness * _BrightnessModifier + _BrightnessOffset) * _EmissionColor;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

マテリアルの作成

マテリアルを作成して、上記のシェーダーを割り当ててやります。

マテリアルの設定は以下のようになりました。

f:id:r-ngtm:20170601010702p:plain:h400

正しく設定できていれば、マテリアルのBrightnessの値によって光具合が変わると思います。

f:id:r-ngtm:20170601011655p:plain:h128

アニメーションをつける

上記のマテリアルを3DモデルにくっつけてAnimationをつけます。 AnimationでマテリアルのBrightnessを変化させるようにすれば完成です。

f:id:r-ngtm:20170601011007p:plain:h128

1秒周期で 0 ~ 0.64を往復するように設定しました。

完成

f:id:r-ngtm:20170601002644g:plain:h256

Unity1週間ゲームジャム「転がる」に参加しました。

f:id:r-ngtm:20170530114546p:plain:h256

Unity1週間ゲームジャムに参加してみました。

Unity 1週間ゲームジャム | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

完成までに右往左往したので、忘れないうちに記事に書き起こしたいと思います。

今回やりたかったこと

面白いパズルゲームを作りたいというのが今回やりたかったことです。

テトリスとかルミネスとか大好きなので、それに匹敵するような面白さの 新しいパズルゲームが作りたいというのが本心でした。 目標高すぎたかも。

作ったゲームについて

今回は「オセロール」というゲームを作りました。 オセロ (白黒) + ロール(転がる)= オセロール

f:id:r-ngtm:20170530013228g:plain

https://unityroom.com/games/otheroll/webgl

上から迫ってくるレーザーに追い付かれないようにキューブを転がしつつ下を目指すパズルゲームです。 

【最初の一歩】とりあえず何か作ってみる

「キューブを転がして、足元の色が変わったらゲームになるんじゃないかなぁ」

と最初に思いつきました。

そして作ったものがこちら。

f:id:r-ngtm:20170529231237g:plain:h256

感想: なんだか面白くないなぁ

ゲーム性も何もないですね。つまらない。

【仕様を一部変更する!】 とりあえず積みあげられるようにしてみよう

「キューブを積みあげられるようにしたら何か面白いものができるかも」

そう思って作ったものがこちら。

f:id:r-ngtm:20170529231342g:plain:h256

感想: やっぱり面白くない

【仕様を一部変更する!】 輪郭を表示させてみよう

「プレイヤーを目立たせたら、何が起きているのかわかりやすくなって面白くなるかも」

そこで、デプスバッファを利用した輪郭表示を実装してみました。

f:id:r-ngtm:20170529232103g:plain:h256

感想 : 「分かりやすくなったけど、やっぱり面白くない

【仕様を一部変更する!】とりあえず色を分けてみよう

「キューブ自身の色を分けてみたら、面白くなりそう。そんな気がする」

そう思って実装したものがこちら。

f:id:r-ngtm:20170529234002g:plain:h256

感想 :「ゲームとしてはつまらないけど、色分けされたキューブを転がすのはちょっと面白いかも」

ここで「色分けしたキューブを転がす = 面白い」 という事実に気が付いたので、ここを詰めていこうと考えました。

ゲームデザインパズルゲームの面白さについて考えてみる

パズルゲームの面白さ ≒ 意外性

パズルゲームの面白さのベースにあるもの。それは意外性なのではないかと気が付きました。

面白いパズルゲームには、以下のような構造が存在しているような気がします。

「何か操作をする」 -> 「変化が起きる」 -> 「あいまいな情報が明確になる」 = 「意外な変化が起こる」 = 「意外性が生まれる」

テトリスを例にとってみる

テトリスのゲームプレイの中には以下のような構造が存在していると考えています。

「テトリミノを落とす」-> 「空間の空き領域が狭くなる」 -> 「残った隙間にどのテトリミノを入れるとぴったり一列埋まるのかがより明確になる

「より明確になる」は言い換えると以下のようになります。

「残った隙間にどのテトリミノを入れるとぴったり一列埋まるのかがより明確になる」= 「あいまいな情報が明確になる」 = 「意外性が生まれる」

テトリミノを落とすというゲームプレイの中にも意外性が存在すると言えそうです。

テトリスの面白さも意外性

テトリスをプレイしているとテトリミノを落とすたびに、「残った隙間にどのテトリミノを入れるとぴったり一列埋まるかがより明確になる」という環境の変化が発生し続けます。

それがテトリスの面白さのキモなのではないか、と思いました。

このゲームの面白さ

ここで話が戻りますが、このゲームが持っている、
「色分けしたキューブを転がせる・マップには色のついたキューブが置かれている」 という構造にも意外性があるということに気が付きました。

「キューブを転がす」 -> 「キューブの色の配置が回転する」-> 「キューブの色が他のキューブと合うかどうかが明確になる


上記の、「明確になる」の部分が意外性にあたるのではないかと思いました。

「キューブの色が他のキューブと合うかどうかが明確になる」 = 「あいまいな情報が明確になる」= 「意外性が生まれる」

個人的に、キューブを転がしたときに色の配置がどう変化するか人間は直感的には予測できないだろうと考えています。

なので、転がしてみたときに初めて色が合うかどうかを理解することができる。 

そこに意外性が出て面白さが生まれるのではないかと思いました。

【仕様を一部変更する!】同じ色のキューブを消してみよう

パズルゲームの面白さがなんとなくわかった気がしたので実装に戻ります。

このとき以下のようなことを考えていました。

「キューブを転がして色を合わせる面白さを残しつつ、ゲームにするにはどうすればいいだろうか。」


そして以下のようなことを思いつきました。

「同じ色のキューブを消してみたらどうだろう」

そして作ったものがこちら

f:id:r-ngtm:20170530234301g:plain

感想 : 「ちょっと面白くなった。 けど物足りないなぁ」

【仕様を一部変更する!】コンボシステムを入れてみよう

このパズルゲームのルールは単純だなというのを薄々感じていました。

単純なパズルゲームはじっくり考えさせても面白くないというのが個人的な意見なので、急がせるシステムを入れたら面白くなりそうだと思って「コンボシステムを入れよう!」と思いつきました。

そして実装したものがこちら

f:id:r-ngtm:20170530234716g:plain

感想 : 「ちょっと面白くなった。 けどちょっと疲れちゃう」

コンボシステムを入れることによって、

状況の把握 -> どう行動するか計画 -> 操作 -> 状況が変化 -> 状況の把握 -> …

というサイクルを作ることができて、ゲームらしさが出せたんじゃないかというのが感想でした。

繰り返しプレイするとだんだんと先が読めるようになるので上達感もあって悪くない。

ただ、少しの間プレイしたら疲れてしまいました。

【問題点】ゲーム画面の情報量が多すぎる

現状のゲームの特徴として以下のようなものが考えられました。

  • マップにはたくさんのキューブが置かれており、それぞれが4つの色を持っている。
  • 自分自身も4つの色を持っている。
  • 回転させると4つの色の配置が変化する。

これは情報が多すぎるなと思いました。 自分自身の4つの色を把握するのは少し疲れる。 転がすたびに把握する必要があるので疲れてしまいます。 また、キューブをその場で置くことも移動させることもできてしまうので選択肢も多すぎました。 

どういう行動をとるのが正解なのかがすぐに判断できず、嫌気がさしてしまいます。

ゲームはどう行動するのが正解なのかがある程度簡単に見通せないとつまらないのかもしれません。

【仕様を一部変更する!】 色がないキューブを入れてみる

情報量を減らすにはどうすればいいかを考えた時、以下のようなことを考え付きました。

「色を持たないキューブを混ぜてやれば、消せるキューブが少なくなって選択肢が減らせるんじゃない? 」

それを実装したものが以下になります。 キューブの色もすべて黒に統一して情報量をさらに削りました。

f:id:r-ngtm:20170531000446g:plain

感想 : 「プレイしやすくなった」

どのような行動をとるべきかがぱっと見で判断しやすく、遊びやすくなったなぁというのが率直な感想です。

色がついたキューブがマップに点在しているので、自分自身はそこへ移動させることだけに集中すればいいので疲れが少ない。

情報量を減らすという決断は悪くなかったなと思いました。

【仕様を一部変更する!】 敵を用意してみよう

遊びやすくなったものの、長期的な目標がないのでしばらくプレイすると飽きてしまうという問題がありました。

ここで以下のようなことを思いつきました。

「レーザーを出して、それから逃げるようにしたらいいんじゃない?」

これを実装したものがこちら。

f:id:r-ngtm:20170530011638g:plain:h256

感想 : 「ゲームらしくなった。けっこう面白い」

面白いなったなぁと思って喜んでいたのですが、しばらくプレイしていると

消せるキューブと消せないキューブがあることに気が付いて飽きてしまいました。

【問題点】運の要素が強すぎる

キューブの初期状態によって消せるキューブと消せないキューブが出てしまうという問題があることに気が付きました。

つまり、キューブが消せるかどうかは完全に運頼みです。これでは面白くない。

ゲームは自分で流れをある程度コントロールできないとつまらないと思うのです。

【仕様を一部変更する!】その場で回転できるようにしてみよう

運の要素を減らすにはどうすればいいかを考えていた時、

「プレイヤー自身がその場で回転できれば、どのキューブでも消せるようになるよね」

と気が付きました。

f:id:r-ngtm:20170530230203g:plain:h256

感想 : 「だいぶ面白くなった」

「その場で回転できると簡単に消せるようになってクソゲーになるんじゃない?」という心配が今まであったのですが、

上からレーザーが迫ってくるという時間の制約があるので回転させるという行為自体も時間的なロスになる。

ロスが重なりすぎるとレーザーに追いつかれてゲームオーバー。結果としてゲームの面白さにつながったなぁと思いました。

BGMの追加と見た目の調整(完成)

ゲームとしてそこそこ面白いものになったと思ったので、クオリティアップにとりかかります。

まずはBGMを追加。

BGMは以下のアセットを使いました。(有料です。 Money is power.)

Ultimate Game Music Collection
https://www.assetstore.unity3d.com/jp/#!/content/37351

ゲームの見た目もさすがに酷すぎたので、BGMのイメージに合うように色味を調整して完成です。

f:id:r-ngtm:20170530013228g:plain:h256

タイトル画面とか作りこみたいなぁと思っていたのですが、時間が無さ過ぎてタイトル画面とか作る余裕がなかった…(言い訳)

【残った課題】ゲームが単調

現在のゲームのプレイサイクルは

「色が合うようにキューブを転がす」->「キューブを置く」

という作業の繰り返しになっていて、作業がちょっと単調だなぁと思っています。

数回プレイするとやはり飽きが来てしまいます。

解決策として、

・特定の条件で必殺技発動

・アイテムの実装

あたりを考えていましたが、一週間という制限時間もあって実装が間に合いませんでした。(言い訳)

まとめ

ゲームを作り始めたときは、「これは完成するんだろうか?」という不安しかありませんでしたが、なんとか無事に完成させることができて良かったと思います。 普段の1.5倍速くらいの速さで実装したのでだいぶ疲れました。

今回作ったゲームはクオリティアップしてリリースするところまで持って行きたいかも。

着想元

Tall Infinity という、箱を転がす名作パズルゲームから着想を得ました。 (PS Storeアーカイブで買えるはず。 面白いのでおすすめ)

参考URL

輪郭の表示は以下の記事を参考にさせていただきました。

【Unity3D】 デプスバッファを利用する - Qiita http://qiita.com/bokkuri_orz/items/08cbaeae6a34fed7f903

【Unity】ParticleSystemでレーザービームを作る

f:id:r-ngtm:20170529162513g:plain

この記事の環境

Windows 10

Unity 5.6.1f1

Step 1. テクスチャの用意

以下のテクスチャを使います。 ダウンロードしてご自由にお使いください

f:id:r-ngtm:20170529154631p:plain:w128

このテクスチャはPhotoshopで作成しました。

Step 2. マテリアルの作成

新規マテリアルを作成して、Shaderを “Particles/Additive"にしてStep1のテクスチャをアタッチします。 f:id:r-ngtm:20170529154908p:plain

Step 3. ParticleSystemを作成

Step 3-1. Shapeパネルの設定

ShapeパネルのShapeをBoxにします。 BoxX、BoxY、BoxZ をすべて0.1にします。

f:id:r-ngtm:20170529154522p:plain

こうすることで直線状に飛ぶパーティクルエフェクトになります。

f:id:r-ngtm:20170529160509g:plain

Step 3-2. Rendererパネルの設定

Step2 で作成したマテリアルをアタッチします。 f:id:r-ngtm:20170529155404p:plain

ここまでやると以下のような具合になります。

f:id:r-ngtm:20170529155623g:plain

Step 3-3. メインパネルの設定

Start Speedを2にします。 Simulation Speedを10にします。

f:id:r-ngtm:20170529160317g:plain

完成!


メインパネルのStartSizeを大きくすれば極太レーザーとかも撃てちゃいます。 f:id:r-ngtm:20170529161854g:plain

【Visual Studio 2015 Community】d3dx9.hがインクルードできない

筆者はWindows10 (64bit), Visual Studio 2015 Commmunityを使っている。



ある日DirectXを触ろうと思って d3dx9.h をincludeしようとした

f:id:r-ngtm:20160722092712p:plain



ところがコンパイルエラーが出た.  cannot open source file "d3dx9.h"

f:id:r-ngtm:20160722092817p:plain




インクルードディレクトリにd3dx9.hのパスを追加しないとダメらしい

追加するためにはまず、 Project > (Project名) Propertiesを選択
f:id:r-ngtm:20160722093245p:plain




VC++ Directories > Include Directories を開く。 Platformは x64 にしておく
f:id:r-ngtm:20160722093206p:plain




パスを追加。 
f:id:r-ngtm:20160722093924p:plain




エラーがとれた。
f:id:r-ngtm:20160722094040p:plain




Solution Platformをx64にしないとエラーが取れないので注意。
f:id:r-ngtm:20160722094127p:plain




C:\Program Files (x86)\Microsoft DirectX SDK (June 2010) がない場合は下記URLからインストーラーをダウンロードしてきて実行すると良い
Download DirectX Software Development Kit from Official Microsoft Download Center

サブディレクトリ以下の特定の拡張子のファイルをコピーして一か所へまとめるWindowsバッチファイル(*.bat)

Windowsバッチ(*.bat)で特定の拡張子のファイルをコピーする方法を調べて自分なりにまとめてみた。


以下のバッチを実行するとサブディレクトリ以下の*.csファイルがTMPフォルダ直下へコピーされる

SET DIST_DIR=TMP
SET FILE_EXT=.cs

mkdir %DIST_DIR%

FOR /D /R %%D IN (*) DO (
  FOR %%F IN (%%D\*) DO (
    IF /I %%~xF==%FILE_EXT% copy %%F %DIST_DIR%
  )
)



IFの後にNOTを入れると*.csファイルを除いたファイルがコピーされるようになる

SET DIST_DIR=TMP
SET FILE_EXT=.cs

mkdir %DIST_DIR%

FOR /D /R %%D IN (*) DO (
  FOR %%F IN (%%D\*) DO (
    IF /I NOT %%~xF==%FILE_EXT% copy %%F %DIST_DIR%
  )
)