Unity2018.1.5f1
Windows10
□
今回は以前書いた記事の操作方法を整理して紹介します。
【UnityC#講座】ユニティちゃんたちをドラクエっぽく一列に移動や順番変更させる【List、for文、NavMeshAgent】
WS・↑↓キーで前後に移動、AD・←→キーで左右に回転し、ついでにスペースキーでジャンプをするようにしました。
いつものごとくユニティちゃんと床のPlanを出しておいてください。
■AnimatorControllerの設定
AnimatorControllerを出します。
Project > Create > AnimatorController
Stateを出す
まだBlend TreeのState(四角いの)しかありませんが、以下のようになるようにセットしていきます。
罫線上にあるBlend Treeは罫線上で右クリックし、
Create State > From New Blend Tree
で出します。
Jumpはこれも同じようにし、
Create State > Empty
で作り名前をInspector上で変えます。
Blend Treeの設定
次にBlend Treeをクリックしてください。
この画面を作るため、Blend TreeをクリックしInspectorを設定します。
赤枠のところに注意して設定してください。
Motionの欄の右下の+ボタンでアニメーションを入れる欄を3つ作ります。
後ろ歩き、待機、前走行のアニメーションを入れます。
Thresholdの値の編集は下のAutomate Thresholdsのチェックを外すとできるようになります。
後ろ歩きは-1
待機は0
前走りは1
このようにセットしてください。
次に罫線の画面の左上のBase Layerをクリックして戻ります。
Parametersの設定
次はParametersを設定します。
赤枠のParametersになっているかチェックしてから赤枠の+ボタンをクリックしBoolを選びJumpingと入力します。
BlendはBlend Treeを作った時点で勝手になっているはずですが、なければFloatで作ってください。
Transitionを設定する
TransitionはStateをつなぐ矢印です。
まずはBlend TreeからJumpへ向かうTransitionをクリックしてください。
そしてInspectorの設定をしましょう。
Has Exit Timeはチェックが入っているとアニメーションを最後まで流します。
そうするとアニメーションの急な切り替えに対応できないのでチェックを外します。
Conditionsは右下の+ボタンを押し空欄を出したらJumpingを選びます。
Blend TreeからJumpに向かう方のTransitionはTrue、戻す方をFalseにしてください。
スポンサーリンク
Jump Stateの設定
これで最後です。
Motionにジャンプのアニメーションを入れてください。
あと名前の欄をJumpにしてインターを押すと罫線上のStateの名前も変わります。
できたらユニティちゃんのAnimatorにセットします。
■スクリプトを書く
タグを設定する
次はユニティちゃんにアタッチするスクリプトを書きますが、その前にタグをセットしましょう。
今回はPlaneにGroundタグをつけ、ユニティちゃんがそれに接している時だけジャンプができるようになります。
PlaneのInspectorの左上を見てください。
Tagの欄のAdd Tagをクリックします。
Tagの項の+ボタンをクリック、出てきた入力欄にGroundと入力します。
そしてまたPlaneのInspectorでGroundをセットします。
スクリプトを書いてアタッチする
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
//CapsuleColliderとRigidbodyを追加 | |
[RequireComponent(typeof(CapsuleCollider))] | |
[RequireComponent(typeof(Rigidbody))] | |
public class HorizontalRotation : MonoBehaviour { | |
public Vector3 movePos; | |
//移動スピード | |
float speed = 2.5f; | |
//方向転換のスピード | |
float angleSpeed = 200; | |
// | |
//[SerializeField]bool jumpSwitch = true; | |
//足場に接しているかどうか | |
[SerializeField] bool onGround = true; | |
//Animatorを収納する変数 | |
Animator animator; | |
//Rigidbodyを入れる | |
Rigidbody rb; | |
//Capsule Colliderを入れる | |
CapsuleCollider caps; | |
void Start() | |
{ | |
//AnimatorのComponentを取得する | |
animator = GetComponent<Animator>(); | |
//Rigidbodyコンポーネントを取得 | |
rb = GetComponent<Rigidbody>(); | |
//RigidbodyのConstraintsを3つともチェック入れて | |
//勝手に回転しないようにする | |
rb.constraints = RigidbodyConstraints.FreezeRotation; | |
//CapsuleColliderコンポーネントを取得 | |
caps = GetComponent<CapsuleCollider>(); | |
//CapsuleColliderの中心の位置を決める | |
caps.center = new Vector3(0, 0.76f, 0); | |
//CapsuleColliderの半径を決める | |
caps.radius = 0.23f; | |
//CapsuleColliderの高さを決める | |
caps.height = 1.6f; | |
} | |
void Update() | |
{ | |
//WSキー、↑↓キーで移動する | |
float z = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed; | |
//前進の後退 | |
//後退は前進の3分の1のスピードになる | |
if (z > 0) | |
{ | |
transform.position += transform.forward * z; | |
} else | |
{ | |
transform.position += transform.forward * z / 3; | |
} | |
//ADキー、←→キーで方向を替える | |
float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * angleSpeed; | |
transform.Rotate(Vector3.up * x); | |
//zの値によって待機、前進、後退が切り替わる | |
animator.SetFloat("Blend", z * 100); | |
//スペースキーでジャンプ | |
if (Input.GetButton("Jump") && onGround) | |
{ | |
//真上に向かって力を与える | |
rb.AddForce(transform.up * 500); | |
//ジャンプのアニメーションを出す | |
animator.SetBool("Jumping", true); | |
onGround = false; | |
} | |
} | |
//Groundタグのオブジェクトに触れていたら | |
//ジャンプのアニメーションを消す | |
void OnCollisionEnter(Collision col) | |
{ | |
if (col.gameObject.tag == "Ground") | |
{ | |
animator.SetBool("Jumping", false); | |
onGround = true; | |
} | |
} | |
} |
アタッチしたらInspectorでRigidbodyとCapsuleColliderがセットされていることを確認してください。
なかったら下のAdd Componentから自力でセットしましょう。
そして動かすとこのようになります。
操作はWS・↑↓キーで前後に移動、AD・←→キーで左右に回転し、スペースキーでジャンプです。
ちゃんと動かせたでしょうか?
■カメラをマウスで動かすスクリプト
ついでにカメラも軽く動かすことにしましょう。
【UnityC#講座】3D人型モデルを三人称視点で動かす【ユニティちゃん】
こちらで紹介した方法を簡略化したもので、マウスを横に移動させるとそれに合わせて回転します。
あとマウスの中ボタンスクロールで距離が変わります。
まず空のオブジェクトを出してAxisと名付け、以下のスクリプトをアタッチしてください。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class Axis : MonoBehaviour { | |
//Cameraが追うオブジェクトをInspectorで入れる | |
[SerializeField] GameObject target; | |
//Main CameraをInspectorで入れる | |
GameObject cam; | |
//Cameraが回転するスピード | |
[SerializeField] float rotate_speed = 3; | |
//Axisの位置を指定する変数 | |
[SerializeField] Vector3 axisPos; | |
//マウススクロールの値を入れる | |
[SerializeField] float scroll; | |
//マウスホイールの値を保存 | |
[SerializeField] float scrollLog; | |
void Start() | |
{ | |
//Main Cameraを取得 | |
cam = Camera.main.gameObject; | |
//取得したMain Cameraをこのオブジェクトの子にする | |
cam.transform.parent = this.transform; | |
//CameraのAxisに相対的な位置をlocalPositionで指定 | |
cam.transform.localPosition = new Vector3(0, 5, -10); | |
} | |
void Update() | |
{ | |
//Axisの位置をユニティちゃんの位置+axisPosで決める | |
transform.position = target.transform.position + axisPos; | |
//マウススクロールの値を入れる | |
scroll = Input.GetAxis("Mouse ScrollWheel") * 10; | |
//マウススクロールの値は動かさないと0になるのでここで保存する | |
scrollLog += Input.GetAxis("Mouse ScrollWheel"); | |
//Cameraの位置、Z軸にスクロール分を加える | |
cam.transform.localPosition | |
= new Vector3(cam.transform.localPosition.x, | |
cam.transform.localPosition.y, | |
cam.transform.localPosition.z + scroll); | |
//マウスのX方向への移動の値をY軸に入れる | |
transform.eulerAngles += new Vector3( | |
0, | |
Input.GetAxis("Mouse X") * rotate_speed | |
, 0); | |
//Cameraをtargetのオブジェクトの方向に常に向かせる | |
cam.transform.LookAt(target.transform.position); | |
} | |
} |
結果はこのようになります。
今回はこれで終わります。
■関連記事
【UnityC#講座】Cameraをターゲットに向かせる、画面を分割する、切り替える
【UnityC#講座】ユニティちゃんでもっとAnimator Controllerを上手く使いたい
【UnityC#講座】ユニティちゃんの表情を替える【SetLayerWeight】
【UnityC#講座】ユニティちゃんをマウスカーソルの方向に移動させる
この作品はユニティちゃんライセンス条項の元に提供されています
スポンサーリンク