Unityで「3Dのミニサッカーゲーム」のプロトタイプを作成するPart2です。Part2では「キャラクターの移動・ボールのドリブル・シュート」をスクリプトで実装していきます。
はじめに
前回の続きのPart2を作成していきます。Part1は下記から。
Part1では簡易的な画面を作成しました。
作成開始
Part2ではスクリプトを利用して「キャラクターの移動・ドリブル・シュート」を実装していきます。
プレイヤーの移動
Playerに「Add Component」から「Rigidbody」、「PlayerInput」を追加します。

「Projects」フォルダ内に「Scripts」フォルダを追加してスクリプトを追加します。スクリプトの名前は「Player_Controller」にします。

スクリプトの中身を下記に変更します。
using UnityEngine;
using UnityEngine.InputSystem;
public class Player_Controller : MonoBehaviour
{
[SerializeField] private float movespeed;
private Rigidbody rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 movement = new Vector3(moveInput.x, 0, moveInput.y) * movespeed *
Time.fixedDeltaTime;
rb.MovePosition(transform.position + movement);
transform.LookAt(transform.position + movement);
}
void OnMove(InputValue movementValue)
{
moveInput = movementValue.Get<Vector2>();
}
}
スクリプトをPlayerに追加します。Movespeedに好きな値を入力します。

実行して下記の様にプレイヤーを動かすことが出来ればOKです。

PlayerInputについて、詳しくは下記で書いています。
ボールのドリブル
次にボールのドリブルを実装します。プレイヤーがボールに触れたとき、ボールを足元にくっつけます。Playerに「AddComponent」から「CapsuleCollider」を追加、パラメータを変更してキャラクターのサイズに合わせます。

Playerの配下に「CreateEmpty」を追加して名前を「DriPos」に、ポジションを変更します。ドリブルする時のボール位置になります。

Ballに「Ball」Tagを追加して、Rigidbodyを追加します。

スクリプトに下記を追加します。ボールに触れたときにボールの位置を足元に固定しています。
using UnityEngine;
using UnityEngine.InputSystem;
public class Player_Controller : MonoBehaviour
{
[SerializeField] private Transform Ball;
[SerializeField] private Transform DriPos;
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball"))
{
Ball.GetComponent<Rigidbody>().isKinematic = true;
Ball.position = DriPos.position;
Ball.transform.SetParent(this.transform);
}
}
}
ボールとドリブル位置をセットします。

実行して下記の様にボールに触れた後ドリブルすればOKです。

シュートの実装
同じようにシュートを実装していきます。Playerの配下に「CreateEmpty」を追加して名前を「ShootPos」に、ポジションを変更します。シュートした時の狙う場所になります。

スクリプトを下記に変更します。最終的な全てのスクリプト内容です。
using UnityEngine;
using UnityEngine.InputSystem;
public class Player_Controller : MonoBehaviour
{
[SerializeField] private float movespeed;
[SerializeField] private float kickforce;
[SerializeField] private Transform Ball;
[SerializeField] private Transform DriPos;
[SerializeField] private Transform ShootPos;
private Rigidbody rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 movement = new Vector3(moveInput.x, 0, moveInput.y) * movespeed *
Time.fixedDeltaTime;
rb.MovePosition(transform.position + movement);
transform.LookAt(transform.position + movement);
}
void OnMove(InputValue movementValue)
{
moveInput = movementValue.Get<Vector2>();
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball"))
{
Ball.GetComponent<Rigidbody>().isKinematic = true;
Ball.position = DriPos.position;
Ball.transform.SetParent(this.transform);
}
}
void OnJump()
{
Ball.transform.SetParent(null);
Ball.GetComponent<Rigidbody>().isKinematic = false;
Vector3 direction = (ShootPos.position - transform.position).normalized;
Ball.GetComponent<Rigidbody>().AddForce(direction * kickforce, ForceMode.Impulse);
}
}
「OnJump」はSpaceに対応しています。スペースを押した時にシュートポジションの位置に目掛けて力を加えています。
シュートポジションをセットします。

ボールを保持している時にスペースキーを押したときにシュートすればOKです。

実際はスクリプトに修正する部分が多く、見た目も変更する必要があります。とりあえず最低限のプレイヤーを動かす、ボールをドリブル、シュートする機能を作成したプロトタイプの完成です。

