Unityでミニサッカーゲームを作成。Part2.キャラクターの移動・ドリブルとシュート

当ページのリンクには広告が含まれています。

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です。

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

タイトルとURLをコピーしました