芋出し画像

【プロゞェクトNeith】みんなの考えた最匷スキル䜜成〜みんなで䜜るゲヌム制䜜【5/3 16日目】

■今回やった事

・ネむトのスキルピックシステム䜜成

・スキルシステム完成

・アルカステラの埅機モヌション完成


■募集䞭のアむディア
①「暹海線」で発生しそうなむベント
䟋森の䞭、クマさんに出䌚った。お化けず遭遇 など
※期限はありたせん皆さんの自由でナニヌクな発想をお埅ちしおいたす。

② 䞻人公・ネむトの「スキル」無期限
䟋ファむアボヌル / 射皋2マス先の䞀䜓 / 効果察象に小ダメヌゞ
※王道からちょっず笑えるネタスキルたで、
どんなアむディアでも倧歓迎です


こんにちは、たる。です

気が付けば、この䌁画の期限も残りあず2週間ずなりたした。


ペヌスずしおはギリギリ  
いや、正盎かなり厳しい状況ではありたすが、今はずにかく前ぞ進むのみ


そしお今回は、珟圚募集しおいるアむディアの䞭から、
぀いにネむトがスキルを獲埗するようです😳


皆さんず䞀緒に育おおきたネむトちゃんの勇姿を、
どうか最埌たで芋届けおください


それでは、進撃の開発16日目  開幕です



二人の茶番

🎧今日の䜜業甚BGM

10月の圗星、キミず出䌚う。䜜線曲 フリヌBGMチャンネル Unique Gear
【フリヌBGM】10月の圗星、キミず出䌚う。

ポマむラ自称ネむトの䜿い魔

「よお、お前らオレだよ、ポマむラ様だ
最近、めちゃくちゃ暑くねぇか
今幎も倏がやっお来るのが早ぇ気がするぜ
お前らも熱䞭症には気を付けろよな」

ネむト幻の星の粟霊

「 すごいなぁ」

ポマむラ自称ネむトの䜿い魔

「あん   おいネむト
お前、オレ様が今、有難い話をしおるのに無芖しおX旧Twitter芋おるずは良い床胞じゃねぇか」

ネむト幻の星の粟霊

「ふふ、ごめんなさい。
぀い、タむムラむンに流れおきたゲヌム開発者さんの動画が面癜くお」

ポマむラ自称ネむトの䜿い魔

「党く、お前は24時間ずっずゲヌム開発のこず考えおるよな 
それで、どんな動画なんだよ」

ネむト幻の星の粟霊

「いっぱいあるわよ。
私ず同じようにSRPGを自䜜しおいる方から、アクション、RPG  ずにかく沢山」

ポマむラ自称ネむトの䜿い魔

「最近、ゲヌム開発者増えた気がするよな 
やっぱ、生成AIで気軜に䜜れるようになったからか」

ネむト幻の星の粟霊

「確かに、それは䞀番倧きいわね。
むンディヌゲヌム開発が掻気づくのは良いこずだわ」

ポマむラ自称ネむトの䜿い魔

「おいおい、ネむトさんよ。
ちょっず暢気のんきすぎだぜ
気軜に䜜れるっおこずは、それだけラむバルが増えるっおこずじゃねぇか。
珟に、今のお前より凄そうなゲヌム䜜っおるや぀なんおごたんずいるぞ」

ネむト幻の星の粟霊

「ふふ、そうね。
でもね、ポマむラ。
私、どうしおかそれが嬉しいのよ」

ネむト幻の星の粟霊

「みんながこれだけ凄いゲヌムを䜜れるなら、
私にもただ可胜性があるっおこずでしょ

それにね、どうしおか本圓に奜きな分野では、
自分より凄い䜜品を芋おも『悔しい』っお気持ちより『凄いなぁ』っお感想しか䞍思議ず出ないのよ」

ネむト幻の星の粟霊

「私、本圓は結構負けず嫌いなのに  なんでだろうね」

ポマむラ自称ネむトの䜿い魔

「  たぁ、それだけゲヌム開発がお前にずっお楜しいものなんだろ。
勝ち負けじゃなく、単玔に奜きなものだから。
いい䜜品を愛しちたうんだろうな」

ネむト幻の星の粟霊

「あら、今日は珍しく良いこず蚀うのね。
よしそれじゃ、そんな倧奜きなゲヌム開発を始めおいきたしょうか」



スキルピックシステムを䜜成䜜業時間玄3時間

ネむト幻の星の粟霊

「今日は、これたでみんなから頂いた私のスキル案を実装しおいくわよ」

ポマむラ自称ネむトの䜿い魔

「぀いにか 
それで、どの案を採甚するんだ」

ネむト幻の星の粟霊

「䜕蚀っおるの、ポマむラ。
そんなの『党郚』採甚するに決たっおるじゃない」







ポマむラ自称ネむトの䜿い魔

「はぁあああああああああああああああ
党郚ゥ お前、正気か
倧䜓、それ前にゞェンスパヌクさんに止められただろうが」

ネむト幻の星の粟霊

「そうね。」

ポマむラ自称ネむトの䜿い魔

「そもそも、ゲヌムバランスおかしくなるだろ
それに、スキル組み䞊げようずも実装の手間やバグのリスクもあるし 
無茶だぜ、そんなの。
新しい機胜を远加するんじゃなくお今は仕䞊げる時期だぜネむト」

ネむト幻の星の粟霊

「あら、ゞェンスパヌクさんの蚀葉そのたんたじゃない」

ポマむラ自称ネむトの䜿い魔

「 ずにかく
オレ様は反察だからな
倧人しく䞉぀くらいにしおおけっお」

ネむト幻の星の粟霊

「私も、この決断はかなり無茶をしおいるず思っおるわ。
 でもね」

ネむト幻の星の粟霊

「私の暩胜『䞖界を線み䞊げる力』は、画面の向こうにいるみんなず私を繋ぐ、倧切な力なの。
私はこの自分の胜力に誇りを持っおいるわ。
だから、みんなのアむディアは䞀぀も無駄にしたくないの」


※暩胜ずは
アルカステラが個別に持぀特別な力。
ネむトの暩胜『䞖界を線み䞊げる力』は、異なる䞖界の声を力に倉えお、
䞖界のルヌルを曞き換えるずいう匷力な力なのだ。

ポマむラ自称ネむトの䜿い魔

「 お前にずっお、その暩胜はプロゞェクトが砎綻するリスクを冒しおでも守りたいものなのかよ」

ネむト幻の星の粟霊

「ええ。」

ポマむラ自称ネむトの䜿い魔

「だったら、オレ様はもう止めねぇよ。
思う存分、その䞖界っおや぀をみんなの力で線み䞊げおやれネむト」

ネむト幻の星の粟霊

「 ふふ、ありがずう。ポマむラ。」



スキルピックシステムを䜜成

ポマむラ自称ネむトの䜿い魔

「それで、ゞェンスパさんに逆らうからには算段はあるんだろうな」

ネむト幻の星の粟霊

「そうね。
たずは、これを芋おもらおうかしら」

■ネむトのスキルピックシステム䜜成 動画


ポマむラ自称ネむトの䜿い魔

「お、おいおい マゞかよ。
もう組み䞊げちたっおる」

ネむト幻の星の粟霊

「たぁ、ほずんどがClaudeさんのお陰だけどね
今回は前回の反省を掻かしお、しっかりず指瀺を出しながら䞀぀ず぀確認しお実装しおいったわ」

ポマむラ自称ネむトの䜿い魔

「 ずころで、これはどんな仕様のシステムなんだ」

ネむト幻の星の粟霊

「ノァンサバVampire Survivorsのような、ロヌグラむク系のベヌシックなスキル獲埗システムね。

獲埗しおいないスキル䞀芧の䞭からランダムに3぀抜遞しお、そこからスキルを䞀぀獲埗するシステムよ。
スキルには『重みWeight』ずいう倀があっお、匷いスキルほど出にくい仕様になっおいるの」

・実際の抜遞凊理のコヌドNateSkillPool.cs

// NateSkillPool.cs
// 抜遞察象ずなる党スキルを管理する ScriptableObject。
//
// 【䜿い方】
//   1. Unity メニュヌ → Assets → Create → TrainingGame → NateSkillPool でアセット䜜成
//   2. Inspector の skills リストに NateSkillData アセットを登録する
//   3. NateSkillManager の skillPool フィヌルドにこのアセットをアサむンする
//
// 【抜遞の重み付け】
//   各 NateSkillData の weight フィヌルドが倧きいほど出やすくなる。
//   䟋: 通垞スキル weight=10、レアスキル weight=3

using System.Collections.Generic;
using UnityEngine;

namespace TrainingGame
{
    [CreateAssetMenu(menuName = "TrainingGame/NateSkillPool", fileName = "NateSkillPool")]
    public class NateSkillPool : ScriptableObject
    {
        [Tooltip("抜遞察象のスキル䞀芧。weight が倧きいほど抜遞されやすい。")]
        public List<NateSkillData> skills = new List<NateSkillData>();

        /// <summary>
        /// 重み付き抜遞で重耇なく count 件のスキルを返す。
        /// 既所持スキルを陀倖しおから抜遞する。
        /// プヌル内の候補が count 未満の堎合は候補を党件返す。
        /// </summary>
        /// <param name="ownedSkillIds">既に所持しおいるスキルIDのセット陀倖察象</param>
        /// <param name="count">抜遞件数通垞は3</param>
        /// <returns>抜遞されたスキルのリスト</returns>
        public List<NateSkillData> DrawRandom(HashSet<string> ownedSkillIds, int count = 3)
        {
            // 候補を絞る未所持スキルのみ
            var candidates = new List<NateSkillData>();
            foreach (var skill in skills)
            {
                if (skill == null) continue;
                if (string.IsNullOrEmpty(skill.skillId)) continue;
                if (ownedSkillIds != null && ownedSkillIds.Contains(skill.skillId)) continue;
                candidates.Add(skill);
            }

            var result = new List<NateSkillData>();
            int draw = Mathf.Min(count, candidates.Count);

            for (int i = 0; i < draw; i++)
            {
                // 総重みを蚈算
                int totalWeight = 0;
                foreach (var c in candidates)
                    totalWeight += c.weight;

                if (totalWeight <= 0) break;

                // ランダムに1件遞ぶ
                int roll = Random.Range(0, totalWeight);
                int cumulative = 0;
                NateSkillData chosen = null;
                foreach (var c in candidates)
                {
                    cumulative += c.weight;
                    if (roll < cumulative)
                    {
                        chosen = c;
                        break;
                    }
                }

                if (chosen == null) break;

                result.Add(chosen);
                candidates.Remove(chosen); // 同じスキルが重耇しお出ないよう陀倖
            }

            return result;
        }

        /// <summary>skillId から NateSkillData を怜玢しお返す。芋぀からなければ null。</summary>
        public NateSkillData FindById(string skillId)
        {
            if (string.IsNullOrEmpty(skillId)) return null;
            foreach (var skill in skills)
            {
                if (skill != null && skill.skillId == skillId)
                    return skill;
            }
            return null;
        }
    }
}
ネむト幻の星の粟霊

「獲埗しおいないスキルの䞭からランダムに3぀抜遞するの。
そのスキルは、重みっおいう倀があっお匷いスキルほど出にくい仕様になっおるのよ。」

ネむト幻の星の粟霊

「リストに茉るアむテムは、い぀もの『ScriptableObjectスクリプタブルオブゞェクト』で管理しおいるわ。

これをスキル単䜍で现かく蚭定しお、さっきのリストに远加しおいくのよ。
  スキルの䜜り方は話すず長くなっちゃうから、たた今床にさせおね」

ネむト幻の星の粟霊

「あず、それぞれのスキルにはアむコンを甚意したわ
背景の色やフレヌムの豪華さで、レアリティや効果内容を䜕ずなく分類させおるの。
ずは蚀え、党郚生成AIに䜜成しおもらったから雰囲気の統䞀感は  あたりないのだけど」


ネむト幻の星の粟霊

「『宎』からスキルピック画面を呌び出しお、この画面からスキルをチョむスするのよ。
そうしたら、私がスキルを獲埗しおたた宎のアドベンチャヌパヌトに戻るっお仕組み」


ネむト幻の星の粟霊

「あず、私のステヌタス画面にも獲埗したスキルを衚瀺するように改修したわ
ちなみに、頂いたアむディアのスキルは党郚実装したから、
远加のアむディアをただただ埅っおるわよ」

ポマむラ自称ネむトの䜿い魔

「  本圓に党郚䜜りやがったよ。
実装、苊劎しただろうに。ネむト、お前の執念は筋金入りだな」

ネむト幻の星の粟霊

「ふふん、私の諊めの悪さを甘く芋おもらったら困るわ」


スキルシステムの䜜成埅機モヌション8時間くらい

ネむト幻の星の粟霊

「 よし、仲間のスキルも完成。
あずは、戊闘シヌンにこのスキルのコマンドを反映させおいくだけね」


■スキルシステム完成動画


ポマむラ自称ネむトの䜿い魔

「こうしおみるず、この二日間で戊闘システムも倧分良い感じになっお来たな」

ネむト幻の星の粟霊

「そうね。
ずは蚀え、ただ私たちのタヌンの凊理ばかり䜜成しおるからやるこずはいっぱいあるのだけどね」

ポマむラ自称ネむトの䜿い魔

「スキル効果凊理は 䜜業時間8時間くらいか。
やっぱ結構倧倉だったのか」

ネむト幻の星の粟霊

「そうね  AOE範囲攻撃の凊理ず、䞀郚の特殊なスキルの凊理呚りを実装するのは倧倉だったわ。

どうしおも自分を攻撃するような動きになっちゃったりしお  。

ちょっず、スキル呚りの凊理はかなり耇雑になっおきたから、
出来ればもう二床ずコヌドを読みたくないわ  」

ポマむラ自称ネむトの䜿い魔

「ずは蚀え、ここたで出来たらあずは殆どのスキルは䜿いたわしでいけるんだろ」

ネむト幻の星の粟霊

「たぁ、ただ状態異垞の数も少ないし、思い぀く限りでは他にも実装したい効果凊理はあるのだけどね  。
ずはいえ、ベヌスのシステムずしおは倚分これで倧䞈倫  な、はず」

ポマむラ自称ネむトの䜿い魔

「おいおい、そんなに匱気で倧䞈倫か」

ネむト幻の星の粟霊

「うぅ  だっお、本圓に色んなスクリプトファむルを芋なきゃいけないから、耇雑すぎお自信ないのよ」

ポマむラ自称ネむトの䜿い魔

「たぁ、现かい調敎は眮いずいお 
今は動いたこずを喜がうぜ」

ネむト幻の星の粟霊

「そうね
これでやっず次に進めるわ」


埅機モヌション䜜成

ポマむラ自称ネむトの䜿い魔

「そう蚀えば䞀぀気になったんだが、ナニットが動くようになったんだな」

ネむト幻の星の粟霊

「そうなの ず蚀っおも、ただ埅機モヌションだけだけどね。
でも、これで少しはSRPGらしくなっおきたんじゃないかしら」

ポマむラ自称ネむトの䜿い魔

「確かに動きがあるず臚堎感が違うぜ
それで、どうやっお䜜ったんだ」

ネむト幻の星の粟霊

「たず、Gemini先生にスプラむトシヌト圢匏アニメヌションのコマ割り画像で、埅機モヌションのドット絵を描いおもらったわ」


ネむト幻の星の粟霊

「フレヌムコマ数は倚い方が滑らかに動くんだけど  
そうするず、䞊手く意図した画像が生成されないパタヌンが倚かったから、今回は3フレヌムにしたの」


ネむト幻の星の粟霊

「そしお、出力された画像を『GIMP画像線集゜フト』を䜿っお现かく分割したわ」

■ ナニットを動かすスクリプトUnitAnimator

// UnitAnimator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TrainingGame.Battle;

namespace TrainingGame.View
{
    public class UnitAnimator : MonoBehaviour
    {
        [Header("フレヌム間隔秒")]
        [SerializeField] private float _frameInterval = 0.3f;

        private SpriteRenderer _spriteRenderer;
        private Sprite[] _frames;
        private Coroutine _idleCoroutine;

        private void Awake()
        {
            _spriteRenderer = GetComponentInChildren<SpriteRenderer>();
        }

        /// <summary>
        /// BattleViewManager.SpawnUnit() からナニットデヌタを枡しお初期化する。
        /// unitSprite をフレヌム0ずしお、idleFrames をその埌に続ける。
        /// </summary>
        public void Initialize(UnitBaseStats stats)
        {
            var frameList = new List<Sprite>();

            if (stats.unitSprite != null)
                frameList.Add(stats.unitSprite);

            if (stats.idleFrames != null)
                frameList.AddRange(stats.idleFrames);

            _frames = frameList.ToArray();

            // フレヌム0を初期衚瀺
            if (_frames.Length > 0 && _spriteRenderer != null)
                _spriteRenderer.sprite = _frames[0];
        }

        /// <summary>
        /// HandleTurnChanged から呌ぶ。このナニットがアクティブかどうかを枡す。
        /// </summary>
        public void SetActiveUnit(bool isActive)
        {
            if (isActive)
                StartIdleAnimation();
            else
                StopIdleAnimation();
        }

        private void StartIdleAnimation()
        {
            if (_idleCoroutine != null) StopCoroutine(_idleCoroutine);
            // フレヌムが1枚しかない堎合はアニメヌション䞍芁
            if (_frames == null || _frames.Length <= 1) return;
            _idleCoroutine = StartCoroutine(PlayIdle());
        }

        private void StopIdleAnimation()
        {
            if (_idleCoroutine != null)
            {
                StopCoroutine(_idleCoroutine);
                _idleCoroutine = null;
            }
            // フレヌム0通垞立ちに戻す
            if (_frames != null && _frames.Length > 0 && _spriteRenderer != null)
                _spriteRenderer.sprite = _frames[0];
        }

        private IEnumerator PlayIdle()
        {
            int index = 0;
            while (true)
            {
                _spriteRenderer.sprite = _frames[index];
                index = (index + 1) % _frames.Length;
                yield return new WaitForSeconds(_frameInterval);
            }
        }
    }
}
ネむト幻の星の粟霊

「あずは、ナニットの差分コマごずの画像をこの子に登録すれば、
行動可胜なナニットの埅機モヌションアニメヌションは完成よ」


private IEnumerator PlayIdle()
        {
            int index = 0;
            while (true)
            {
                _spriteRenderer.sprite = _frames[index];
                index = (index + 1) % _frames.Length;
                yield return new WaitForSeconds(_frameInterval);
            }
        }
ネむト幻の星の粟霊

「特にこの郚分で、フレヌムごずにスプラむトを順番にコマ送り衚瀺させおいるの」

ポマむラ自称ネむトの䜿い魔

「なるほどなぁ。 ちなみに、攻撃ずか他のモヌションも䜜るのか」

ネむト幻の星の粟霊

「䜜りたいけど  今は埌回しにしおるわ。
だっお、モヌションを䞀぀増やすごずに、党ナニット分の差分画像を䜜成する必芁があるでしょ
今の開発スケゞュヌルじゃ、時間的に少し厳しいのよ」

ネむト幻の星の粟霊

「ずはいえ 戊闘モヌションはSRPGの華よね
たずは戊闘システムの構築を完了させお、少し萜ち着いたらスキルの゚フェクトずいった挔出面ず合わせお必ず怜蚎しおみるわ」


最埌に

かくしお、進撃の開発16日目は幕を閉じた。


読者の皆様から寄せられた倧切なアむディアは、
詊行錯誀の末、無事に「スキルピックシステム」ずしお実装され、ネむトの新たな力ずなった。


8時間にも及ぶコヌドずの死闘の末、
範囲攻撃や特殊効果ずいった耇雑な凊理を乗り越え、぀いに戊闘の芁であるスキルシステムが産声を䞊げたのである。

さらに、ドット絵に呜を吹き蟌むこずで、戊堎に立぀キャラクタヌたちは「埅機モヌション」ずいう確かな錓動を手に入れた。


止たっおいた画面の時間が動き出し、
SRPGずしおの茪郭がたた䞀぀、色濃く浮かび䞊がっおきたのだ。


だが、安堵しおいる暇はない。


䌁画のタむムリミットは、残りわずか2週間。
次なる詊緎は敵ナニットの思考凊理か、それずも立ちはだかる未知のバグか。


ネむトたちの埀く手には、ただただ険しい開発の道が続いおいる  。


果たしお、期限内にゲヌムは完成するのか


次回も、どうぞ乞うご期埅

#プロゞェクトNeith #HorizonNotes #ゲヌム制䜜 #個人開発 #Unity #開発日蚘 #読者参加型 #毎日note

いいなず思ったら応揎しよう

たる。 よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおのゲヌム開発に䜿わせおいただきたす ※チップず共にやっお欲しい事があったら蚀っおください 可胜な範囲であれば頑匵りたす