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ペースで投稿したいですねこれから。
次回はたぶんカメラ関係をやると思います。