名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

HumanoidのIKを使ってみる3

こんにちは。

SAT-BOXカピバラさんです。

今回も、前回同様、UnityHumanoidIKの機能を紹介したいと思います。

前回の記事はこちらからどうぞ。
sat-box.hatenablog.jp
sat-box.hatenablog.jp


毎度お馴染み、白い人型のモデルに登場してもらいたいと思います。


相変わらず今回も哀愁を漂わせております…ん?
何かを見てますね。
f:id:sat-box:20170612181244g:plain


一体何を見ているんでしょうか。
こ、これは!


f:id:sat-box:20170612181406g:plain

ハ、ハンバーガー…!
と、茶番は置いておいて、今回はこのハンバーガーが足元に移動してきた時に足が上に乗るように設定していきたいと思います。

まずは現状。

f:id:sat-box:20170612181911g:plain

こんな感じで、足元に物を置いても足がハンバーガーの中に埋まって、足を乗せられてないですね。

前回のソースコードを若干修正しつつ、足元のコライダーに合わせて足のポジションをセットする処理を追加して行きたいと思います。

using UnityEngine;
using System.Collections;

public class IKController : MonoBehaviour
{

	[Header("HandIK")]
	[SerializeField]
	public Transform rightHandAnchor = null;
	[SerializeField]
	public Transform leftHandAnchor = null;

	[Header("LookIK")]
	[SerializeField, Range(0.0f, 1.0f)]
	private float lookTotalWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float bodyWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float headWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float eyeWeight = 0.0f;
	[SerializeField]
	private GameObject lookTarget;

	[Header("FootIK")]
	[SerializeField]
	private bool isFootIK;


	private Animator animator;

	void Start()
	{
		animator = GetComponent<Animator>();
	}

	void OnAnimatorIK()
	{
		//アニメーターが無いときは処理しない
		if (!animator)
			return;

		//右手を固定
		if (rightHandAnchor != null)
		{
			SetIkWeight(AvatarIKGoal.RightHand, 1.0f, 1.0f);
			SetIk(AvatarIKGoal.RightHand, rightHandAnchor.position, rightHandAnchor.rotation);
		}

		//右手を固定
		if (leftHandAnchor != null)
		{
			SetIkWeight(AvatarIKGoal.LeftHand, 1.0f, 1.0f);
			SetIk(AvatarIKGoal.LeftHand, leftHandAnchor.position, leftHandAnchor.rotation);
		}

		//ターゲットの方向を向くように
		if (lookTarget != null)
		{
			animator.SetLookAtWeight(lookTotalWeight, bodyWeight, headWeight, eyeWeight);
			animator.SetLookAtPosition(lookTarget.transform.position);
		}

		if (isFootIK)
		{
			Vector3 rightPos = animator.GetIKPosition(AvatarIKGoal.RightFoot);
			Vector3 leftPos = animator.GetIKPosition(AvatarIKGoal.LeftFoot);
			Vector3 diffR = Vector3.zero;
			Vector3 diffL = Vector3.zero;
			RaycastHit ray;

			Debug.DrawLine(rightPos, rightPos  + Vector3.down);

			if (Physics.Raycast(rightPos + Vector3.up * 0.3f, Vector3.down, out ray))
			{
				diffR = (rightPos - ray.point) - Vector3.up * 0.1f;
				SetIkWeight(AvatarIKGoal.RightFoot, 1.0f, 1.0f);
				SetIk(AvatarIKGoal.RightFoot, -diffR, Quaternion.identity, true);
			}
			if (Physics.Raycast(leftPos + Vector3.up * 0.3f, Vector3.down, out ray))
			{
				diffL = (leftPos - ray.point) - Vector3.up * 0.1f;
				SetIkWeight(AvatarIKGoal.LeftFoot, 1.0f, 1.0f);
				SetIk(AvatarIKGoal.LeftFoot, -diffL, Quaternion.identity, true);
			}

			animator.bodyPosition += Mathf.Max(diffR.y, diffL.y) * Vector3.down;
		}
	}

	//IKの重みを設定する
	void SetIkWeight(AvatarIKGoal _goal, float _posWeight, float _rotWeight)
	{
		animator.SetIKPositionWeight(_goal, Mathf.Clamp(_posWeight, 0.0f, 1.0f));
		animator.SetIKRotationWeight(_goal, Mathf.Clamp(_rotWeight, 0.0f, 1.0f));
	}

	//IKを指定して固定させる
	void SetIk(AvatarIKGoal goal, Vector3 _pos, Quaternion _rot, bool isAddIKPosition = false)
	{
		if(isAddIKPosition)
			_pos +=	animator.GetIKPosition(goal);

		animator.SetIKPosition(goal, _pos);
		animator.SetIKRotation(goal, _rot);
	}
}


こんな感じです。
ちょっと段々長くなってきましたね。。。

やっていることとしては左右の足元の少し上辺りからレイを地面に向かって飛ばして、何かコライダーに当たったらそこに足を設定する、という感じです。詳しいことはソースコードを見てください(丸投げ)

無事、ハンバーガーの上に足をのせることに成功しましたね!

f:id:sat-box:20170612182351g:plain

今回は簡単にのせるだけにしましたが、いろんな方が地面の形に合わせて足の角度を変えたりなどソースコードを公開されているので、もっと細かく設定したい人はそちらを参考にどうぞ!

gametukurikata.com

tips.hecomi.com


では(^^)/

鵜飼いを見に行った話

こんにちわ!SAT-BOXのペンギンです。

先週の土曜日、6月3日に愛知県犬山市木曽川鵜飼いを見に行きました!

 

実際には鵜飼いだけではなく、犬山城や城下町も見てきました!

どれも初めての体験でしたが、一番はやはり鵜飼いが感動しました!

 

かがり火とかも幻想的で感動するあまり、

「おおお~!すごいな~!」しか声が出ませんでした(笑)

 

体験していない方は一度は体験しても良いかもしれませんね~!

では失礼します!

 

鵜飼いを見に行く話

こんにちは、SAT-BOXのコアラです。

ブログでペンギンさんが紹介していましたが、先日フットサルがありまして、いやー、体力の衰えを感じてしまいました。

まだ若いんですが。本当に若いんですが。



SAT-BOXではフットサルのような社内イベントが定期的に行われていますが、今週末は鵜飼いを見に行きます。

鵜飼いってなに?って方のために五七五で説明を考えたので聞いてください。

鵜飼いとは 鵜でアユをとる 漁法だよ


らしいです。調べたので間違いないです。

アユ料理も食べれるので、個人的にすごく楽しみにしています。



何を隠そう、コアラはアユが好物なのです。(本当のコアラって魚食べれるのでしょうか、気になります)

好きな魚ランキングでは1位かもしれません。ウナギがライバルですね。

好きな食べ物ランキングだと圏外ですね。ウナギは35位です。



話がそれましたが、コアラはウナギが好きだということを最後にお伝えします。おいしいからね!

では、行ってきます!

HumanoidのIKを使ってみる2

こんにちは。

SAT-BOXカピバラさんです。

前回はHumanoidのIKの機能を使ってHumanoidのモデルの手を左右の棒に固定しました。今回はその続きです。

今回は、Humanoidモデルが何か物を『見る』という処理を作ってみたいと思います。という事で今回も前回と同様白い人型のモデルに登場してもらいたいと思います。

はい。
相変わらず今回も哀愁を漂わせております。

f:id:sat-box:20170424191056g:plain

IKの設定については前回のIKの記事を参考に設定してください。
sat-box.hatenablog.jp


まず、見る対象のオブジェクトを作成します。
今回は、このアセットを拝借。

f:id:sat-box:20170522171003j:plain
http://u3d.as/Mh3:FREE Food Pack

…おいしそう。

この中から、おにぎりを頂戴してとりあえず配置。
今回はこのおにぎりを人型モデルが見るように設定していきます。
その後、この人型モデルの目の前に持ってきます。

ほら、おにぎりだよー!
f:id:sat-box:20170522171331g:plain

このままだと、勿論見ないですよね。

前回のソースコードに追加して、見る処理も書いていきます。

using UnityEngine;
using System.Collections;

public class IKController : MonoBehaviour {

	[Header("HandAnchors")]
	[SerializeField]
	public Transform rightHandAnchor = null;
	[SerializeField]
	public Transform leftHandAnchor = null;

	[Header("LookWeight")]
	[SerializeField, Range(0.0f, 1.0f)]
	private float lookTotalWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float bodyWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float headWeight = 0.0f;
	[SerializeField, Range(0.0f, 1.0f)]
	private float eyeWeight = 0.0f;
	[SerializeField]
	private GameObject lookTarget;

	private Animator animator;

	void Start()
	{
		animator = GetComponent<Animator>();
	}

	void OnAnimatorIK()
	{
		//アニメーターが無いときは処理しない
		if (!animator)
			return;

		//右手を固定
		if (rightHandAnchor != null)
		{
			animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
			animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
			animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandAnchor.position);
			animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandAnchor.rotation);
		}

		//右手を固定
		if (leftHandAnchor != null)
		{
			animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
			animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
			animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandAnchor.position);
			animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandAnchor.rotation);
		}


		//敵が自分の方向を向くようにする
		if (lookTarget != null)
		{
			animator.SetLookAtWeight(lookTotalWeight, bodyWeight, headWeight, eyeWeight);
			animator.SetLookAtPosition(lookTarget.transform.position);
		}
	}
}


こんな感じです。
前回に比べて調整する項目が増えました。

f:id:sat-box:20170522172248p:plain

上から説明していくと

LookTotalWeight…全体の重み。
BodyWeight…体の重み
HeadWeight…頭の重み
EyeWeight…目の重み
LookTarget…見る対象

で、重みと表現しているのはどれだけ見る対象に向けるか、のような意味です。1を100%、0を0%と考えてもらい、何パーセントくらい見る対象に向けるか、という感じです。

とりあえず実際にやってみるのが分かりやすいと思うので、ちょっとやってみましょう。

全て1にした状態
f:id:sat-box:20170522173336g:plain

BodyWeight だけ1にした状態
f:id:sat-box:20170522174739g:plain

HeadWeight だけ1にした状態
f:id:sat-box:20170522174837g:plain

EyeWeight だけ1にした状態
f:id:sat-box:20170522174937g:plain

あっ
この人型のモデル、目が無い…。
目だけ動く感じは分からなかったと思いますが、BodyWeightだけ1の時は、体で見る方向を向く感じで、HeadWeightだけ1の時は頭だけ、その方向を向く感じだったと思います。


こんな感じで調整できるようになるので、「人の感じ」を出すときは見るという調整がいると思うので、ぜひ使ってみてください!

では(^^)/

次の記事
HumanoidのIKを使ってみる3 - SAT-BOX BLOG


前回の記事
UnityでHumanoidのIKを使ってみる1 - SAT-BOX BLOG

「VoxelShotVR」が配信開始!更に「VRSports」がアップデート!

こんにちは、カピバラさんです。

ニコニコ超会議のVRブースでも大好評だったあのVoxelShotVRが遂に配信開始されました!リリース記念のセール中で、今なら25%OFFで遊べます!ご興味を持たれた方は、是非ダウンロードしてプレイして下さい!

【Steamのリンク】
store.steampowered.com

「どんなゲームなの?」と思う方もいらっしゃると思うので、少しご紹介したいと思います。

f:id:sat-box:20170519172752j:plain

ざっくり説明

周りから、ボクセル調のゾンビがたくさんやってくるので、それをいろんな武器を使って倒していきます!

ゾンビを倒すと得点が入って、得点を競い合います。ヘッドショットを狙うと点数が高かったり、他のオブジェクトを撃つと得点が入ります!。ワールドランキングで全世界の人と戦いましょう!

www.youtube.com

様々なギミックのステージ

舞台は、
「City(街中)」
「Airport(空港)」
「Desert(砂漠)」
「Base(軍事基地)」
と多彩なステージがあります!それぞれ、違ったギミックがあり特徴的なステージが多いです。ヘリコプターが攻撃してきたり、巨大なボスゾンビが襲ってきたり、色んなギミックを楽しんでください!「エンドレス」では時間制限がなく、ライフがなくなるまでプレイできます!
思う存分にゾンビを撃ち倒しましょう!初心者が分かりやすいようにチュートリアルもあります!

f:id:sat-box:20170519181752j:plain

色々な武器を使いこなせ!

武器の種類も色々あり、
・ハンドガン
・ショットガン
・ガトリング
・ロケットランチャー
・スナイパーライフル

等々。

武器は両手で持つことが出来て、二丁拳銃にすることが出来ます!ステージに使い捨ての武器と、リロードできる武器があり、それぞれの切り替えが高得点を取るポイント!使い捨ての武器は時間が経つと元あった場所にまた出てきます!

f:id:sat-box:20170519181327p:plain

モバイル版も配信開始!

Steamで配信されているのは、HtcVIVEOculus Riftで遊べるのですが、お持ちのAndroidiPhoneで遊べるモバイル版も配信しています!モバイル版の方は、コントローラーの代わりに視線を向けて撃ったり、銃を持ち替えたりとスマホのVR向けに作られています。

モバイル版の方は、Cardboard等にスマホを入れて遊べます!

リンクはこちら
GooglePlay
play.google.com

iOSも順次リリースされるので、少しお待ちください。

VRSportsにカートが追加!

VRSportsがアップデートされました!

7競技だったのが、「カート」が追加されて8競技になりました!
8競技の中で唯一の座ってできる競技です!

VRSportsをまだプレイしていない人は
この機会にプレイしてみてはいかがでしょうか!

Steamのリンクはこちら
store.steampowered.com

f:id:sat-box:20170519183235p:plain

社員交流会

こんにちは!SAT-BOXのペンギンです。

 

SAT-BOXでは、社員交流会があり、色々なスポーツや社員旅行などなど行われております!

 

なんと今週の土曜日にはフットサルがあります!

フットサルは苦手ですが、運動不足を解消できるチャンスです!(翌日の筋肉痛が怖いですが...(笑))

 

社内の方々だけでなく、社外に出られている方々も参加されるので、積極的にコミュニケーションを取っていきたいと思います!

 

今日はプログラム的なことではありませんでしたが、

これで失礼させていただきます。

 

以上、ペンギンでした!

Unityのちょっとした機能(入力フィールド編)

こんにちは、SAT-BOXのコアラです。

皆さん、ゴールデンウィークはどうでしたか、楽しかったですか。

僕は楽しかったです、来年もあるといいなぁ



さて、気持ちを切り替えてやっていきましょう!

まずこちらをご覧ください!

f:id:sat-box:20170508171154p:plain

今回はこのTransform・・・ではなく、その中の入力フィールドでできることを少しご紹介したいと思います。


この入力フィールド、中で四則演算ができること、皆さんご存知でしたか?

試してみましょう!

f:id:sat-box:20170508175850p:plain

1+2*3を入れてみました、正しく計算されれば、9!ではなく7になるはずです。

f:id:sat-box:20170508180025p:plain

見事!7になりました。

しかし、これだけではありません。

%を使った余り計算もできますし、^を使ったべき乗の計算もできます!

( )の入った計算式も、正しく計算してくれます。

ただし、べき乗の計算は、0乗ならちゃんと答えが1になりますが、-1乗などマイナスのべき乗はできないみたいです。

余りとべき乗は使う機会はあまりないですが、覚えていて損はないですね。

四則演算ができるのは、Transformの入力フィールドに限らないので、いろいろなところで使えます。

便利な機能なので、是非使ってみてください!