コード
GitHubにPublicで公開しています。
*Readmeをいじる時間はありませんでした。ユルシテ。
https://github.com/TakeruYufune/pinBallKyotoHackathon
ピンボールテストプレイ
WebGL で Github Pages に デプロイしました。
https://takeruyufune.github.io/pinBallKyotoHackathon/
WebGL build
WebGLでビルドすると
- reset が効かない。
- 重すぎる。
- Plateau データを入れると重すぎて GitHub Actions のビルドが通らない。
大人しく Unity room を使いましょう。
キーコンフィグ
スペースキー:ボールを弾く
R:ボールを初期位置に戻す
→:右フリッパーの作動
←:左フリッパーの作動
ピンボールゲームロジック
ボールを動かす
Input.GetKeyUp (KeyCode.Space)
で スペースキーを取得。
その時にピンボール台の傾きに合わせてベクトル計算した上で、RigidBodyに力を加えます。
Input.GetKeyUp (KeyCode.R)
で r キーを取得。
ボール座標を初期位置に戻します。
*スニペット効かないのかよ!
/*
import や 初期化は割愛
*/
void Update()
{
if (Input.GetKeyUp (KeyCode.Space)) {
// デバックログの表示
Debug.Log ("x,y=" + xVector(angle) + "," + yVector(angle));
// ピンボール台の傾き(20度)に合わせたベクトルを計算
Vector3 Pos1 = new Vector3 (xVector(angle), yVector(angle) ,0f);
// ボールに力を加える
ballRigidBody.AddForce (Pos1*pinPower*105f);
}
//reset
if (Input.GetKeyUp (KeyCode.R)) {
ball.transform.position = new Vector3(-1.55f,4.41f,-8.85f);
ballRigidBody.velocity = Vector3.zero;
}
}
private float yVector (float angle) {
// 角度(angle)に対する、y軸のベクトルを計算します。
float y = (float)Math.Sin(angle * (Math.PI / 180));
return y;
}
private float xVector (float angle) {
// 角度(angle)に対する、x軸のベクトルを計算します。
float x = (float)Math.Cos(angle * (Math.PI / 180));
return x;
}
}
フリッパーを動かす
玉を弾くフリッパーを動かします。
こいつがちょっと曲者。
Hinge Joint という Component を用いて、
2 つの リジッドボディ をグループ化し、互いにヒンジで連結されているかのように制約します。
ドアや鎖や振り子などのモデル化でよく使われるやつです。
こんな感じで軸を基準に動く角を制御できるようになります。
コードはこんな感じ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Flipper : MonoBehaviour
{
// Inspecterで値を変更する
public float spring = 400;
public float openAngle = 80; // 開く角度
public float closeAngle = 0; // 閉じる角度
// Hinge Joint
private HingeJoint hjL; // axisL
private HingeJoint hjR; // axisR
// JointSpring
private JointSpring jL; // axisL
private JointSpring jR; // axisR
void Start()
{
// AxisLとAxisRを探す
GameObject flipperL = GameObject.Find("axisL");
GameObject flipperR = GameObject.Find("axisR");
// HingeJointを受け取る
hjL = flipperL.GetComponent<HingeJoint>();
hjR = flipperR.GetComponent<HingeJoint>();
// Springを受け取る
jL = hjL.spring;
jR = hjR.spring;
}
void Update()
{
// ←を押す
if (Input.GetKey(KeyCode.LeftArrow))
{
jL.spring = spring;
jL.targetPosition = openAngle;
hjL.spring = jL;
}
// →を押す
if (Input.GetKey(KeyCode.RightArrow))
{
jR.spring = spring;
jR.targetPosition = -openAngle;
hjR.spring = jR;
}
//すぐさま戻す
if (Input.GetKeyUp (KeyCode.LeftArrow) || Input.GetKeyUp (KeyCode.RightArrow)) {
jL.spring = spring;
jL.targetPosition = closeAngle;
hjL.spring = jL;
jR.spring = spring;
jR.targetPosition = closeAngle;
hjR.spring = jR;
}
}
}
ゲームBGM『古都に駆ける』
和楽器を用いて京都をイメージさせ、ミニゲームらしいアップテンポでシンプルな曲にしました。
https://youtu.be/bZYd0mMtEnE?si=YTzi2EaVmFiB298u
3Dデータ/テクスチャ
UnityのPlateauSDKv1.1.6.1を用いてフィールドデータを作っています。
本来は洛中すべてを舞台として使いたいと思って、
QGISを用いてLOD1モデルを出力したりもしたが、
これがかなり時間の無駄だった。
せめてテクスチャとして国土交通省の航空写真を貼り付けるなどしないとステージの床の様子が伝わらない。
あと1日あれば・・・
- スコア加算判定
- バンパー的な跳ね返り値が高いオブジェクトの作成
- Gameマネージャーを用いたゲームの開始・終了判定について
- オブジェクトの破壊演出(パチンコみたいな)