01. 作成開始、ボールを動かす

1. 何を作るか

さて、何を作るかという話ですが、今回はゴルフゲームでも作ってみようかなと思います。もちろん完成するかわかりませんが、、。

今回はUnityというゲームエンジンでゲームを作成していきます。

 

2. 作成開始

この何もない空間にいろいろ作っていきますよ。

こんな感じで適当にボールとなるものと地形となるものを配置してみたり。

いろいろしないといけない設定はありますが、まずは、ボールに対してマウスで引っ張るとボールを打つことができる機能でも作ってみましょう。

3. ボールショット機能

まずはこれを作らないとゴルフといえないので、ボールを打つ機能を作っていきます。
とはいっても、どうやってコードを書くのか難しいので、YouTubeで動画を探したり、AIに聞いてみたりして作ってみます。

まずは、”BallController”という、ボールの操作を記述するスクリプトを作成します。

そしたら、この”BallController”にボールを引っ張るとその反対方向に対し、ガイドラインが表示され、離すとボールが飛ぶようにコードを書いていきます。

コードを書くこと約1時間半、、、。以下のコードが完成しました。

    
using System.Runtime.CompilerServices;
using UnityEngine;

public class BallController : MonoBehaviour
{
    private Rigidbody rb;
    private Vector3 dragStartScreenPosition;
    [SerializeField] private float forceMultiplier = 5f;    //ボールに加える力の係数
    private bool canShoot = true;   //ボールを打つことができるかどうか

    //ガイドラインの変数
    private LineRenderer lineRenderer;
    [SerializeField] private float maxGuidelineLength = 10f;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        rb = GetComponent();
        lineRenderer = GetComponent();

        if(lineRenderer != null)
        {
            lineRenderer.enabled = false;
        }

        canShoot = true;
    }

    void OnCollisionEnter(Collision collision)
    {
        //ボールが地面に衝突した時点で操作可能
        if (collision.gameObject.CompareTag("Ground"))
        {
            canShoot = true;
        }
    }

    void OnMouseDown()
    {
        Debug.Log("Mouse Down Detected!");
        if (canShoot)
        {
            dragStartScreenPosition = Input.mousePosition;

            if(lineRenderer != null)
            {
                lineRenderer.enabled = true;
                lineRenderer.SetPosition(0, transform.position);
            }
        }
    }

    void OnMouseDrag()
    {
        if(canShoot && lineRenderer != null && lineRenderer.enabled)
        {
            Vector3 currentDragScreenPosition = Input.mousePosition;
            Vector3 dragVectorScreen = currentDragScreenPosition - dragStartScreenPosition;

            Camera mainCamera = Camera.main;

            Vector3 cameraRight = mainCamera.transform.right;
            Vector3 cameraForward = mainCamera.transform.forward;

            cameraForward.y = 0;
            cameraForward = cameraForward.normalized; // 正規化

            Vector3 launchDirection = (cameraRight * dragVectorScreen.x + cameraForward * dragVectorScreen.y).normalized;

            float dragDistance = Mathf.Min(dragVectorScreen.magnitude / Screen.width, 1f) * maxGuidelineLength;
            Vector3 guidelineEndPoint = transform.position + (-launchDirection * dragDistance);
            lineRenderer.SetPosition(1, guidelineEndPoint);
        }
    }

    void OnMouseUp()
    {
        if (canShoot)
        {
            Vector3 dragEndScreenPosition = Input.mousePosition;
            Vector3 dragVectorScreen = dragEndScreenPosition - dragStartScreenPosition;

            Camera mainCamera = Camera.main;

            Vector3 cameraRight = mainCamera.transform.right;
            Vector3 cameraForward = mainCamera.transform.forward;

            cameraForward.y = 0;
            cameraForward = cameraForward.normalized; // 正規化

            Vector3 launchDirection = (cameraRight * dragVectorScreen.x + cameraForward * dragVectorScreen.y).normalized;

            //画面の幅で正規化し、ドラッグの感度を調整
            float dragMagnitude = dragVectorScreen.magnitude / Screen.width;
            float actualForceMagnitude = dragMagnitude * forceMultiplier; // ForceMultiplierで最終的な力の強さを調整

            //力の計算
            Vector3 launchForce = -launchDirection * actualForceMagnitude;

            //ボールに力を加える
            rb.AddForce(launchForce, ForceMode.Impulse);

            canShoot = false;

            //ショット後にガイドラインを非表示
            if(lineRenderer != null)
            {
                lineRenderer.enabled = false;
            }
        }
    }
    // Update is called once per frame
    void Update()
    {  

    }
}

    

このスクリプトをボールにくっつけて動かしてみる。

動いた。いい感じ。

4. まとめ

今回は手始めに、ボールの動きを加えてみました。これほんとに完成するのかな。週2ペースで投稿したいですねこれから。

次回はたぶんカメラ関係をやると思います。