kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

敵の目線の動きをUnityで実装する <ゼルダの伝説シリーズ>

かずまです。

前回まではPlayerの動きを実装していました。



blog.kazumalab.com

ちなみにSwitchのゼルダの伝説の動きが気になる方はこちら。

ゼルダの伝説 ブレス オブ ザ ワイルド

テーマ

今回のテーマは"敵の動き"です。
敵がいないと始まらないですからね。

考察


敵の動きを見てみます。

気づかれると注目して見られる

音に気づく

目線があうと気づかれる

隠れると見失う

ココらへんが結構重要だと思います。
この章では歩くことはあとで実装します。

Enemyを追加

EnemyをPlayerと同じものを作ります。
前回作ったCharactorControlをつけます。

今度はEnemy.csを作ります。


気づいたときのアクション

EnemyにつけるNoticeObjectを作ります。

気づいたときのびっくりマークとはてなマークをPhotoShopとかIllustratorで作ります。
[びっくり]
f:id:kazumalab:20170331001612p:plain
[はてな]
f:id:kazumalab:20170331001727p:plain

両方背景透明なので白く見えますがあります。

Notice.csを作成

先程用意した画像をSpriteにして、SpriteRendererで表示します。
その時につけるスクリプトです。

以下のように設定します。
f:id:kazumalab:20170331002330p:plain

WarningはHatenaのSpriteを入れて、
DiscoveryはBikkuriのSpriteを入れます。

これをPrefab化して、その後、NoticeObjectに入れます。

ここからは重要な部分だけを取り上げて解説していきたいと思います。

Playerとの距離

Unity C#では

Vector3.Distance (Vector3 a, Vector3 b)

で距離を求めますが、今回は簡単なので実装してみます。
PowはC++でもライブラリがあるみたいなので、ちょっと意識して...

// Enemy.cs
Vector3 dv = player.transform.position - transform.position;
return Mathf.Pow ((dv.x * dv.x + dv.y * dv.y + dv.z * dv.z), 0.5f);

unitylab.wiki.fc2.com
いや、ここのサイトのように正規化したほうが良さそう。

EnemyはPlayerを探す

EnemyにはSearchメソッドがあって、そこの中でPlayerを探しています。

検索方法としては、

目線

Enemy.cs内でenum設定している

  • Warning

これは気づくか気づかないかを表します。
はてなマークのアイコンを使います。

  • Discovery

これは気づいたときを表します。
ビックリマークのアイコンを使います。

距離

これは先程、使ったメソッドを使って距離を測っています。
次の足音が小さければ距離が近くても気づかれないです。

足音

今回のゼルダから導入されました、足音の機能です。
気づかれず、回り込めば不意打ちを噛ませます。

これを実装します。

入力の力に合わせて足音を実装する

今回はXbox Controllerのスティックを使っているためGetAxisを使うことができます。

float dx = Input.GetAxis ("Horizontal");
float dy = Input.GetAxis ("Vertical");

WalkVolume = (Vector3.right * dx + Vector3.up * dy).magnitude;
getWalkVolumeStatus ();


Player.cs内のこの部分でmagnitudeで入力の加減を取っています。
これを足音としています。
スティックを強く押し込むと足音が大きく、軽く押し込むと小さくなります。


VolumeのStatusでどの動きか、を取ることができます。

  1. Quiet
  2. Small
  3. Loud

f:id:kazumalab:20170331013058g:plain

こんな感じ。
これに音をつければそれっぽくなります。

後半へばってしまいましたが、今回はこんな感じです。

f:id:kazumalab:20170331013805g:plain
デザインとかも実装したいですがうーん笑


コードのデザインもうまくいかないのでそこまで手が回らなそう。
もっとこうしたらいいよ、みたいなのがありましたら言ってください...!

カメラワークとプレイヤーの動きをUnityで実装する Part2 <ゼルダの伝説シリーズ>

かずまです。
前回の記事はこちら。

blog.kazumalab.com

そう、ゼルダの伝説です。

テーマ

今回のテーマはゼルダの伝説のプレイヤーの動きとカメラの動きを再現します。
しかし、昨日試行錯誤したのですが、ちょっと違うっぽい動きになってしまいました。
そのうち改善します。

考察

リンクの動きはカメラの方向が正面になります。
なので、動いている時にカメラを回転させたらその方向に移動する感じですね。

Playerを実装

まずはPlayerを動かします。
今回は拡張性を踏まえてCharactorControllerを使わないで自分で実装します。

上記スクリプトを書きます。
CharactorControllerではisGroundがあったので、それも実装してしまいます。

  1. Raycastで距離を測る
  2. Colliderでのあたり判定

この2つによって実装されます。
Colliderだけだと天井などに当たったときに反応してしまうのでRaycastも使います。


つけるコンポーネントは以下の通りです。
RigidbodyをつけてFreeze Rotationをすべてチェックいれます。
これをしないと物に当たった時に制御できなくなります。

f:id:kazumalab:20170328195415p:plain

次にPlayer.csを実装します。

これをPlayerのオブジェクトにくっつけます。
前回のブログでもちょこっとかきましたが、それにすこし付け足します。

UnityでXboxOneコントローラを使う…前に | 蒼玉亭
ここを参考にして、Playerの動きはXbox Controllerの左スティック、カメラの動きは右スティックを使って制御します。

Edit -> Project Settings -> Input
からMouse XとMouse Yがあるとおもうので、以下のように変更してあげます。
これでInput.GetAxis("Mouse X")でOKになります。

f:id:kazumalab:20170328200927p:plain

MacXbox Controllerを使う

Driverが必要だそうです。
github.com

ここからdmgを落としてくるなりでOKです。
再起動されます。

結果

ホントはこれ、カメラ動かしてないときはPlayerも回転させてかったけど...だめだった。
そのうち他のところ実装しながら思いついたらやり直します。

カメラワークをUnityで実装する Part1 <ゼルダの伝説シリーズ>

かずまです。

Switchが発売され、スプラトゥーンの試射会も行われ、
ようやく落ち着いた感じがします。

あいかわらずSwitchは台数が少ないみたいで、品薄みたいですね。
ちなみに沖縄のゲオは数台ありました。

今日日曜日も入荷するとか...


さて、今日からシリーズで書いていきたいと思います。

テーマ

今回のシリーズは今流行りの「ゼルダの伝説」を取り上げていきます。
もちろん、開発の方です。

僕はゲームの中で一番と言っていいほどゼルダが大好きなのですが、
何と言ってもゲーム性と操作性、全てに置いて素晴らしいですね。

僕もゼルダの開発に携わりたい、というのが一生の夢ですが、もしかするとゲーム開発が手軽になった今、自分でも近いものが実装できるのでは?
と思ったわけです。(無謀)

今回のお題

"プレイヤーを写すカメラの動き"です。
これはゲームに置いて結構重要なのではないでしょうか。

考察

まずは実際に見てみます。
もちろん僕は実際にプレーもしました。

れいなカメラワークですね。
プレイヤーが中心でその周りをカメラが移動していますね。
常にプレイヤーに向いている感じ。
あとは上下の限界を決めてますね。

実装部分

今回実装する部分の詳細は以下になります。

スティックを倒した時にカメラの回転と高さの変更

天井が低い場所に行った場合のカメラの位置を下げる

カメラワークのリセット

3つになります。
ほんとは移動の常に倒した方向に移動するところとかまで行きたかったけど仕方なく、次回です。

プログラミング & ゲーミング

やりつつ、コード書きつつと言った形でやってみました。

f:id:kazumalab:20170326075502g:plain

こんな感じです。

実装

はじめ、カメラを子オブジェクトにして、それを回転させればできそう!と思って作ってたのですが、高さを変更する時とかバグったため、それは諦めました。

ただし、構造は同じです。
f:id:kazumalab:20170326080057p:plain

カメラに空の親オブジェクトをくっつけて、その親は常にPlayerの座標に位置するというものです。

上のスクリプトをMain Cameraにアタッチします。
そのあとPlayer.csを作成します。
これはPlayerのゲームオブジェクトにくっつけます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {


	public float HeightToRoof = 0f;
	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		HeightToRoof = getHeadHeight ();
	}


	public float getHeadHeight () {
		RaycastHit hit;

		if (Physics.Raycast (transform.position, Vector3.up, out hit)) {
			print ("Found an object - distance: " + hit.distance);
			return transform.position.y + hit.distance;
		}
		return 100f;
	}

これでInspectorのところでターゲットとなるPlayerと、親を入れてあげればOK!

解説

CameraではLookAtを使ってPlayerの方向を向かせています。
これはまぁこれでいいかと思います。

回転部分

回転部分は三角関数を使って計算しています。
入力はGetAxisを使ってますが、場合に合わせて変更してください。

参考はこちら
r-dimension.xsrv.jp

とある角度a(float)に対してのSinはy座標、Cosはx座標となるので半径をrとするととある座標pは

x = r \bullet cos(a)
y = r \bullet sin(a)

これで座標pのx,yが求まりますね。
Cameraは子オブジェクトなのでこの座標をローカル座標に入れて上げることで円形を書いて回転します。

上下の位置を変更する場合は、Verticalの値をそのまま高さにかけてあげます。

自動カメラ下げ

Player.csではRaycastを書いたと思います。
体から上方向にRayを飛ばして、天井との高さを返しています。
あとはカメラのグローバル座標をその高さにするだけです。

リセット

スペースを押せばリセットされるようになっています。
ここの値は強制...してますです。

まとめ

さて、今回はUnityでカメラワークを実装してきました。
本家の方はどうなってるんでしょうね、気になりますが、それなりに上手く行ったと思います。

たぶん、これだとターゲットの部分を変更すると自動的にターゲット変更できるかも...
あと

www.asset.techmatome.com

dtweenとかと組み合わせるといいですね。

次回はプレイヤーの移動に関しての記事を書こうとおもいます。

品テク meetup Vol.05に参加してきました。

かずまです。
一昨日からついに東京に引っ越ししました。

元徳島、大阪2年、沖縄2年と渡り歩いて、次は東京です。
今回は何年いるかは不明です。笑

品テクとは?

f:id:kazumalab:20170315170503j:plain

品川駅港南口でテクノロジーと未来をテーマに、お酒を飲んで食事をしながら、気になる話題を聞いたり話したり体験もできる交流会です。品テクマルシェ2016において開催された「品テクFUNFAN meetup!」のスピンオフ企画

お仕事帰りにぴったりの時間ですので、美味しい食事とともにお酒を飲みながら、テクノロジートークを楽しみましょう。


と言うもので、技術、技術というよりも生活をより良くするために技術を使って良くしてみました!というお話ですね。
なのでエンジニアじゃない人達も気軽に参加できるイベントです!と言うよりエンジニアよりも住んでる人が重要だったり...笑

peatix.com

参加したイベントページはこちらになります。

内容

今回はざっくりしか覚えてないですが、

保育所を探せるサービスを作った!

品川でもハロウィンイベントをやったよ!

PETSを海外に持っていったよ!

オープンデータを使うとこんなにおもしろい!

地方の行政とお仕事をするには!

みたいな、このタイトルは僕が主観でつけたものです。
どうしてもエンジニアが集まると、技術のお話でサービスが置き去りになってしまったりしちゃうのでほんとに必要なのは何か、みたいなのがいいですね。

その中で幾つか気になったのを紹介します。

保育所の情報は意外と見つからないらしい

インターネットが普及して探せるんじゃないかなーと思っていたのですが、ほんとに見つからないらしいです。
あとほしい情報が乗ってなかったり、地区ごとに書かれててサイトを多数開く必要があったりとか、来たばっかの地域で近所からの情報もないし...みたいな。
ハロウィンイベントの話もこれにつながってます。近所の間のコミュニケーションを作ることができるのでローカルな情報をゲットできるとか。

オープンデータ

行政が様々なデータを公開しているそうです。
例えば1年間で事故が起こった場所のデータであれば、起こった場所の分布図みたいなのを作って、可視化できるようにすると、ここらへんは事故が多いから小学生とかの登下校時に大人を配置しよう!みたいなのが今までは「あそこ、事故多いらしいよ」と言った曖昧なことでしたが、データを見ることによって確信に変わるわけですね。

PETSの海外進出

PETSって?

プログラミング脳を養うためのロボットですね。

f:id:kazumalab:20170315170535j:plain

ここで本PETSのサイトから引用します。

PETS」(ペッツ)は、いろいろな方向のブロックを背中に挿し込んで、命令された通りに動くプログラミング学習用のロボットです。マス目の書かれたシートの上を、スタートからゴールまで、時には障害物をよけながら目指します。

いままでは日本各地でワークショップを開催していましたが、この度海外に進出されたそうです!
僕も実際やってみました。

わかりやすい

差し込んで、ボタンを押すだけで動き出すのですぐにフィードバックが返ってくるのでトライ・アンド・エラーが身につく。

意外と難しい

力技のトライ・アンド・エラーで繰り返して行けばそのうちゴールにたどり着くかもしれないけどそれでは莫大な時間がかかってしまうため、事前に頭の中で考える力が身につく。

プログラムを書くよりも楽しいので子どもも飽きないというのがいいですね。

まとめ

今回はこんな感じでした。
雰囲気の写真とかは撮り損なったのでまた次回行った時にとりたいかなーと思ってます。
けど結構laughな感じです笑

徳島を紹介するサイトを設立しました。

かずま@徳島です。


Ansibleやったり、Haskellちょっと書いてみたりしていますが、その隙間で徳島を紹介するサイトを立ち上げました。

tokushima.sinariovr.com

今回は登録制ではなく、完全にブログ形式です。
ぜひ自由に見て回ってください。

今回はA-frameを使ってまたもや360度画像に挑戦してみました。
ただ、今回は埋め込みを行っています。

サンプルはこんな感じです。

tokushima.sinariovr.com
RailsのViewの中に埋め込む感じにしました。

名前募集中

サイト名がまだついておりません。
そこでサイト名の募集をします!

採用させて頂いた方には気持ち分ではありますがAmazonギフト券1000円分を差し上げます。

目指すもの

このサイトを見て徳島に行きたい!と思えるものにしたいと思っております。