スーパー空箱

ノンプログラマーの開発日誌や雑記

【Unity】ShaderForgeのノードの説明を訳してまとめた(Mainノード編)

f:id:ponkotsu0:20151015105150p:plain

ゲーム開発で様々な表現をするのにシェーダーは必要不可欠なものです。しかし自前でコーディングするにはシェーダー言語は中々に難易度が高い。

そこで、ノードの組み合わせでシェーダーを自作できるUnityのアセット「ShaderForge」を使ってみました。

がしかし、チュートリアル動画をみても自分のオリジナルを作るには勉強が必要そうです。

なので、とりあえず各ノードの役割を覚えるために、公式サイトの説明をGoogle翻訳で訳してまとめてみました。

量があるので、今回はまずはMainノードからどうぞ

続きを読む

ノンプログラマーでもアプリをリリースできた話 その1

GooglePlayでアプリをリリースできました

AppStoreは申請中です。

CAVE JET 無料没頭系アクションゲーム - Google Play の Android アプリ

f:id:ponkotsu0:20151006113405p:plain

開発期間は3週間ほど。

といっても、このアプリは2年ほど前にUnityを触り始めたころに作ったものがベースで、その時は一応完成してAppStoreに申請まではしたもののリジェクトされて心が折れて止めてしまったものなんですよね。

続きを読む

【Blender】UVスクロールエフェクト用モデルをつくる

ゲームエフェクト勉強会に参加してきました。

そこでドーナツ型のモデルにUVスクロールさせたエフェクトを紹介されていたので、モデルをつくってみましたが、かなり苦戦したので備忘録としても書き留めておく。

togetter.com

 

ツールBlenderを使います。

f:id:ponkotsu0:20150723134801j:plain

planeを配置し、UVを展開します。"ドーナツ状に成形する前にUVを展開する"のがポイントです。理由は後述。

f:id:ponkotsu0:20150723134731j:plain

次に、モディファイアのArrayを使い、Countを20にします(20じゃなくても大丈夫ですが、ここの数値が後にUVの歪みを左右するポイントのひとつです)

f:id:ponkotsu0:20150723135117j:plain

モディファイアのSimpleDeformを使い、黒いタブを"Bend"に、Deformを"360"にするとドーナツ状になります。最初は↑画像よりも輪が大きい状態だと思いますが、モデル自体を移動すると穴が縮まります。

このとき気を付けるのは、Arrayモディファイアの"Marge"にチェックを入れておくことです。これをやっておかないとモディファイアをApplyした後に重なった頂点が結合されず、分割面でバラバラの状態になります。

両モディファイアをApplyしたら気を付けることは、Margeにチェックをしていても一辺だけは頂点が結合されていないので、手動で行ってください。

f:id:ponkotsu0:20150723140025j:plain

この後、UVをみてみると分割面の数だけ重なった状態になっています。

そして各面のUVを細長くして、モデルの面と同じ順番で並ばせます。

f:id:ponkotsu0:20150723135641j:plain

この作業が一番手間です。私はまず順番がわかるようにバラバラに並べて、Shift + Tabで他頂点にスナッピングしてきれいに並ぶようにしてますが、もっと楽な方法があればご教授いただきたいです。

UVを並ばせたら、内と外の円以外のエッジを選択し、Ctrl + E ⇒ Subdivideで、左下に表示されるパネルで分割数を決めます。

f:id:ponkotsu0:20150723140512g:plain

ここが一番のポイントです。画像のように細長い線状のテクスチャを使う場合、モデルの密度が歪みを大きく左右します。密度が高いほどテクスチャもちゃんとまっすぐになります。今回の苦戦はこのことを理解していなかったためでした。

今回は線状のテクスチャを使いましたが、まだら模様など指向性のないテクスチャであれば、むしろ歪みがいい塩梅になったりすることもあるので、密度はテクスチャに合わせるのがいいでしょう。

最後に、内側と外側の円を頂点カラーで黒く塗って、エフェクトにしたときにフチがはっきりとでないようにしてモデルは完成です。

f:id:ponkotsu0:20150723141116g:plain

Unityでモデルを使ってアニメーションさせました。

左が密度の高いモデル、右が低いモデルです。テクスチャは同じなので、線の歪みがわかりやすいと思います。

これを覚えると表現の幅もぐんと広がるので、エフェクト作りが捗りますね。

【Unity】他のオブジェクトのスクリプトを参照する

タイトル部分のことでちょっと詰まってましたがなんとか解消。

やりたかったことして

フリック → 攻撃フラグtrue → 敵に触れていたら敵がダウンモーション

ということでしたが、基本的なことですがちょっと詰まってました。

SAMPLE

 難しい部分ではありませんが、こちらのサイトがわかりやすく解説してくれていました

www.cho-design-lab.com

 

あとは

・ゲームの制限時間

・敵の生成

を実装すればとりあえず遊ぶだけならできる形にはなりそうです。

【Unity】フリックでオブジェクトが向いている方向に飛ばす

こつこつとユニティちゃんアクションゲームを進めてます。

このゲームの攻撃方法としてフリック操作でキャラをスライディングをさせたいので、実装してみました。

SAMPLE

まずフリックの実装ですが、最初はEasyTouchを使おうと思ったんですが、よくわからなかったので自前でそれっぽいものをつくりました。

内容としては「画面をタッチしてから指を話すまでの時間がX秒以下」「タッチした位置から指を話した位置のmagnitudeがY以上」という実装です。

void Update () {
//画面をタップしたら
if (Input.GetMouseButton (0)) {
        //時間計測開始
	tapTimer += Time.deltaTime;
    
	Vector3 currentTapPoint = Input.mousePosition;
	mag = (currentTapPoint - tapPoint);
	if (mag.magnitude > 5.0f) {
		//ここにはフリックしないときの挙動をかく(割愛)
	 }
}
//指を離したら
if (Input.GetMouseButtonUp (0)) {
    //フリック条件。時間経過は0.5以下でmagnitudeが10以上なら
	if(tapTimer <= 0.5f && mag.magnitude >= 10f){
        //モーションをスライディングへ
		Anicon.SetTrigger("p_sliding");
        //フレイヤーの正面ベクトルを取得し、Z方向に10を掛ける
		Vector3 pv = player.transform.forward *10;
        //プレイヤーのrigidbodyに↑の数値分だけ力を加える。
		player.rigidbody.AddForce(pv,ForceMode.VelocityChange);
	}
    //アニメーションのステートの初期化(待機状態へ)
	Anicon.SetBool ("p_walk", false);
	Anicon.SetBool ("p_run", false);
    //最後にタイマーを初期化
	tapTimer = 0f;
}

すぐできるかなーと思ったんですが、意外と苦戦したのが「オブジェクトの正面方向ベクトルの取り方」なんですが、transform.forwardで取れると分かった後はすぐでした。
こちらの記事が参考になりましたojisan-puroguramu.seesaa.net

まだスラいディングモーションへの繊維に時間がかかってる感じがあるので、ここは要調整ですね。
次は敵をだして当たり判定をつけるとこをやる予定~

【Unity】Humanoid系のモーションを使いまわしてみた

f:id:ponkotsu0:20150508000037j:plain

あまりモーションについては触ったことがなかったんですが、Unityでは人型のモーションはモデルが違ってもある程度使いまわすことが簡単にできるので、色んなモーションで試してみました。

続きを読む

【Unity】キャラクターをドラッグ操作で動かしてみた

f:id:ponkotsu0:20150427015027j:plain
アクションゲームをつくるときの練習がてら、スマホでグリグリキャラを動かせるようにしてみた。

サンプル

たぶんCharacterControllerやバーチャルパッドを使えば簡単にできるっぽいんですが、コーディングの練習なので全部自分で書いてみました。

void Update () {
	if (Input.GetMouseButtonDown (0)) {
        //押下した位置を取得
		tapPoint = Input.mousePosition;            
	}
	if(Input.GetMouseButton(0)){
		Vector3 currentTapPoint = Input.mousePosition;
        //指をずらしたときのベクトルを取得
		Vector3 mag = currentTapPoint - tapPoint;
        //指を動かしたときのみキャラを操作する       
		if(tapPoint != currentTapPoint){ 
            //動かした指の位置から角度を計算         
			float rad = Mathf.Atan2(currentTapPoint.y - tapPoint.y,currentTapPoint.x - tapPoint.x);
			float rot = (rad *180/Mathf.PI)+90;
            //キャラクターの向きを決定    
			player.transform.rotation = Quaternion.Euler(0f,rot*-1,0f);
			player.transform.Translate(0f,0f,playerSpeed);
             //一定以上画面をドラッグしたときは移動速度を上げる
			if(mag.magnitude < 120f){                  
				Anicon.SetBool("p_walk",true);
				Anicon.SetBool("p_run",false);
				playerSpeed = 0.02f;
			}else
			if(mag.magnitude >= 120f){
				Anicon.SetBool("p_run",true);
				playerSpeed = 0.05f;
			}
		}
	}
	if (Input.GetMouseButtonUp(0)) {
			Anicon.SetBool("p_walk",false);
			Anicon.SetBool("p_run",false);
	}
}

指の動きが2Dに対してキャラクターが3Dなので、指の動きとキャラの向きを同期させるのに苦労しました。
Mathf.Atan2()は2点間の角度をラジアン値で返してくれるので、それを (rad *180/Mathf.PI)+90のところで角度に変換しています。

  1. 90をしてるのは、この式の場合2Dなので指を真上に動かすと90°が返ってきますが、キャラクターは後ろ(180°)を向いてほしいからです。

またQuaternion.Euler(0f,rot*-1,0f)で-1をかけてるのも同じように、左に引っ張るとキャラは「自分からみて左」を向いてしまうので
この画面の場合は「向かって左」にするために左右を反転させています。

このやり方は結構無理やりやっているので、たぶんもっときれいなやりかたがあると思いますが、意外とググってもみつからなかったんですよね。
Nexsus5にいれてみましたが、無事グリグリ動いてくれました。感動!これで簡単なアクションゲームならつくれそうです。


ところで

ルクラスを買ってみました。
これ、上を向いたときにスマホが倒れるのなんとかならないのかな....