ããããžã§ã¯ãïŒNeithãæŠéããžãã¯äœæãã¿ããªã§äœãã²ãŒã å¶äœã5/1-5/2 14,15æ¥ç®ã
â ä»åãã£ãäº
5/1
ã»ç§»ååŠçãå®è£
â æ»æåŠçå®è£ åç»
â ã¢ã€ãã 䜿çš
5/2
ã»ã»ãŒãåšãã®ãã°ãä¿®æ£
â åéäžã®ã¢ã€ãã£ã¢
â ãæš¹æµ·ç·šãã§çºçããããªã€ãã³ã
ïŒäŸïŒæ£®ã®äžãã¯ãããã«åºäŒã£ãããåããšéé ãªã©ïŒ
â»æéã¯ãããŸããïŒçããã®èªç±ã§ãŠããŒã¯ãªçºæ³ããåŸ
ã¡ããŠããŸãã
⡠䞻人å
¬ã»ãã€ãã®ãã¹ãã«ãïŒâ»ããå°ãå»¶é·ããŸãïŒïŒ
ïŒäŸïŒãã¡ã€ã¢ããŒã« / å°çšïŒ2ãã¹å
ã®äžäœ / 广ïŒå¯Ÿè±¡ã«å°ãã¡ãŒãžïŒ
â»çéããã¡ãã£ãšç¬ãããã¿ã¹ãã«ãŸã§ã
ã©ããªã¢ã€ãã£ã¢ã§ã倧æè¿ã§ãïŒ
â¢ã²ãŒã ã§æµãèäœæš©ããªãŒã®BGMãæããŠãã ãã
ç¡æã®ããªãŒã®BGMãæ¢ããŠãŸãïŒ
ããªãã®ãæ°ã«å
¥ããæããŠãã ããïŒ
ïŒçæAIã§èªäœãããã®ãå¯èœã
ãã®å Žåã¯ãã³ã¡ã³ããDMã§ãç¥ãããã ããïŒ
ããã«ã¡ã¯ïŒãŸããã§ãã
ä»åã®ãã€ãã¡ããã¯ã
æŠéã·ã¹ãã ã®æ§ç¯ãšçŸåšçºçããŠãããã°ãæ¹ä¿®ããããã§ãã
åŸã ã«ã²ãŒã å šäœã®èŒªéãèŠãå§ããŠããå°è±¡ããããŸãð
ããªããé·ææŠã ã£ãã®ã§ä»åã®èšäºã¯ã»ãŒãã€ãžã§ã¹ãã«ãªããŸããâŠã©ããå¿æŽããŠé ãããšå¬ããã§ãïŒ
ããã§ã¯ãæ¿éã®éçº14ã15æ¥ç®âŠã¹ã¿ãŒãã§ãïŒ
äºäººã®è¶çª
ð§ä»æ¥ã®äœæ¥çšBGM
Tipsy_DanceïŒäœïŒç·šïŒæ² ïŒããª
ãæ°æé³æ¥œé¢š/é å Ž/èžããTipsy DanceãããªãŒBGMã

ããããããŸããïŒãªã¬ã ããããã€ã©æ§ã ïŒ
ããŸããã奜ããªãèåã£ãŠäœããããïŒ
ãªã¬æ§ã¯ããã©ãã¯ãµã³ããŒãšæè¿ã§ã¯æ¹æ± å±ã®ã¹ã³ãŒã³ã°ããé£ã£ãŠããïŒ
ãããèŸããããããã ããªïŒã

ããããè¯ããããªãã
ã¡ãªã¿ã«ãç§ã¯ã©ãçŒããšæž©ãããè¶ã®çµã¿åããã奜ããïŒ
ãã£ã±ãããè¶ã«åãåèåã¯æé«ããã

ãããããããã€ãã
ãåã¯ãã°ãã¡ãããïŒ
ãèåã¯å³ãæ¿ããŠãã³ãã®å¹ãããã®ããè³é«ã ãã

ããã°âŠå€±ç€ŒãïŒ
ä»ãç»é¢ã®åããã§å€ãã®äººãæµã«åããããïŒ
ããã«åèåã«å¹Žéœ¢ã¯é¢ä¿ãªãã§ããã

ããŸãã確ãã«åèåãæšãã£ã¡ãæšããã©ãªïŒ
ç³åããã£ããåã£ãŠãé åãããŠè¡ãããïŒã
æŠéã·ã¹ãã ïŒç§»åãæ»æãã¢ã€ãã ãããã«çµäºåŠçïŒ8æéãããïŒïŒ

ãããã§ã仿¥ãäœæ¥ã®æ¯ãè¿ããïŒã

ããããã
æšæ¥ãçµæ§ã¬ãããªãšäœæ¥ã«éäžãããŠããã£ãããããµã¯ãµã¯ãšæµãã解説ããŠããæãã«ããŠããããã

ã5/1(é)âŠéçº14æ¥ç®ã«é²ããå 容ã¯ãããªæããã
ã»ç§»ååŠçãå®è£
â æ»æåŠçå®è£ åç»
â ã¢ã€ãã 䜿çšç¢ºèªåç»

ãããïŒ
æŠéã·ã¹ãã ãçµæ§ã¬ãããªåºæ¥ãŠæ¥ãŠããããããïŒã

ããŸãããã®æ¥ã«ç
§æºãåãããŠã·ã¹ãã èªäœã¯æºåããŠãããããã
ããšã¯ãããåæ ãããæãã ã£ããããå®è£
èªäœã¯ãããªããã£ããã

ããªãã»ã©ãªã
ã§ããçµæ§æéããã£ããã ãïŒã

ããããã
ãŸããæ®ã©ãã¢ã€ãã ã®äœ¿çšã«é¢ããåŠçã§èºããæããã

ãã§ãïŒä»ã¯ã芧ã®éãåé¡ãªãåãããã«ãªã£ããïŒã

ãèŠåŽããç²æããã£ãããªïŒ
ãããããç°¡åã«ã©ãäœã£ãã®ãæããŠãããïŒã
ã³ãã³ãããã«ã®å®è£

ããŸãã¯ããã¬ã€ã€ãŒãéžæããã³ãã³ããã
ãã£ã©ã¯ã¿ãŒãã¡ã®äœåã»è¡åé ã衚ãå
šäœçãªUIãäœæããŠãããã
ãããªæãã§äœã£ãŠã¿ãã®ã


ãUIèªäœã¯ã·ã³ãã«ãªãã ãªã äœããã ãã£ãç¹ãšãã¯ããã®ãïŒã

ããããâŠåºæ¥ãã ãç»é¢äžå€®éšã«UIã眮ããªãããã«ããããšãããã
ã³ãã³ãããã«ã«ã€ããŠã¯ã¡ãã£ãšå€§ããããæ°ããããã©ã
誀æäœãèµ·ãããªãããã«ãã詊ãã§å€§ããã«äœã£ãŠã¿ãã®ã

ããªãã»ã©ãªã ã¡ãªã¿ã«ãä»ã®æç¹ã§èŠããŠã課é¡ãšãã¯ããã®ãïŒã

ããŸããã³ãã³ãã®æ°ãå€ãäºãã
ãããç»é¢ã«å§è¿«æãäžããŠããŸã£ãŠããã¬ã€ã€ãŒã«äžããæ
å ±éãå€ããªã£ãŠãããã
ãã¢ã¹ãã©ã«ã³ãŒãããšããã®ãå¿
殺æãªãã ãã©ã
ããã¯äœ¿ããã¿ã€ãã³ã°ãéãããŠããã®ããã
ã ãããåžžã«è¡šç€ºããŠããã®ã§ã¯ãªããå¿
èŠãªå Žé¢ã§ã®ã¿ã¢ã€ã³ã³ãšããŠè¡šç€ºããŠãè¯ãããç¥ããªããã
ãã®ãããã¯ãã¢ã¹ãã©ã«ã³ãŒããå®è£
ããæã«ãŸãæ¹ããŠæ¹éãèãããã
ç§»ååŠç
â ç§»ååŠçã®åç»

ãæ¬¡ã«ãç§»åã®åŠçãïŒ
ããã¯ããããã¹ã段éã§åãããšã確èªã§ããŠãããã®ã ãããä»åã¯å°ãã ãæŒåºé¢ãã¢ã¬ã³ãžããããšã«çããŠããããïŒã

ããŸããå®ã¯äžé±éåãããããè£ã§ã³ãã³ãäœã£ãŠããããªïŒ
ãã®ãæŒåºé¢ãã£ãŠã®ã¯ã©ããªæãã§åäžãããã ïŒã

ãäž»ã«ãã«ã¡ã©ã¯ãŒã¯ãããã€ã³ãã¯äºã€ãã
äžã€ã¯ãããŠã¹ãã€ãŒã«ã§ã®ãºãŒã åŠçã®ä»ã«ã
å³ã¯ãªãã¯ãæŒããªããããŠã¹ãåããããšã§ã«ã¡ã©ã360床å転ã§ããããã«ããäºã
ããäžã€ãããã£ã©ã¯ã¿ãŒã®ç§»ååŸã«ãã«ã¡ã©ãèªåã§ãã®ãã£ã©ã¯ã¿ãŒã远åŸããããã«ããäºãã

ãå人çã«ãã·ãã¥ã¬ãŒã·ã§ã³RPGã¯ã«ã¡ã©ã¯ãŒã¯ãåœã ãšæã£ãŠããã®ïŒ
ã ã£ãŠãåºå€§ãªæŠå Žã俯ç°ããŠæŠè¡ãçµã¿ç«ãŠãã®ãé¢çœãèŠçŽ ã§ããïŒ
ã ã£ããããã¬ã€ã€ãŒã«ã¯æŠå Žå
šäœãèŠæž¡ããããã«å·¥å€«ãããã£ãã®ãã

ããªãã»ã©ãªïŒ
ã¡ãªã¿ã«ããã®ç§»ååŠçã¯ã©ãããæãã§äœãããŠããã ïŒã

ãçµæ§ãé£ããããïŒ
ãŸãããPathFinderïŒãã¹ãã¡ã€ã³ããŒïŒããšããããã°ã©ã ããç§»åã§ããç¯å²ãèšç®ããŠããã®ã
// PathFinder.cs
// ç§»åç¯å²ã®èšç®ïŒBFSïŒãšçµè·¯æ¢çŽ¢
// GridMap ãåç
§ããŠãã©ãã«ç§»åã§ãããããã©ãç§»åãããããèšç®ããã
// ã¹ããŒããæããªãéçã¯ã©ã¹ãšããŠå®è£
ãããã£ãã·ã¥ã¯å€éšã§æã€èšèšã
using System.Collections.Generic;
using UnityEngine;
namespace TrainingGame.Battle
{
/// <summary>
/// BFSïŒå¹
åªå
æ¢çŽ¢ïŒãçšããç§»åç¯å²ã»çµè·¯èšç®ã¯ã©ã¹ã
///
/// ãèšèšæ¹éã
/// - ã¹ããŒããªãã®éçã¯ã©ã¹ãæ¯ã¿ãŒã³åŒã³åºããŠçµæãäœ¿ãæšãŠãã
/// - ç§»ååïŒmoveRangeïŒåã®ã³ã¹ããŸã§å°éã§ããã¿ã€ã«ããã¹ãŠè¿ãã
/// - æµãŠãããã®ã¿ã€ã«ã¯ãééäžå¯ããšããŠæ±ãïŒåè»ã¯ééå¯ã»åæ¢äžå¯ïŒã
/// </summary>
public static class PathFinder
{
// ================================================================
// ç§»åç¯å²ã®èšç®ïŒBFSïŒ
// ================================================================
/// <summary>
/// æå®ãŠãããã®ç§»åå¯èœã¿ã€ã«äžèЧãè¿ãã
///
/// ãã¢ã«ãŽãªãºã : BFS + ã³ã¹ã管çã
/// åã¿ã€ã«ãžã®æå°ã³ã¹ããèšé²ããªããå¹
åªå
ã§æ¢çŽ¢ã
/// ç§»åã³ã¹ãã moveRange ãè¶
ããã¿ã€ã«ã¯æ¢çŽ¢ãæã¡åãã
/// </summary>
/// <param name="map">ã°ãªããããã</param>
/// <param name="unit">ç§»åãããŠããã</param>
/// <param name="allies">åãé£å¶ã®ãŠãããäžèЧïŒééå¯ã»åæ¢äžå¯ïŒ</param>
/// <param name="enemies">æµé£å¶ã®ãŠãããäžèЧïŒééäžå¯ïŒ</param>
/// <returns>ç§»åå¯èœãªã¿ã€ã«ã®ã»ããïŒåºçºå°ç¹ãå«ãïŒ</returns>
public static HashSet<TileData> GetReachableTiles(
GridMap map,
UnitBattleState unit,
IEnumerable<UnitBattleState> allies,
IEnumerable<UnitBattleState> enemies)
{
int moveRange = unit.BaseStats.moveRange;
// æµã»å³æ¹ã®ã¿ã€ã«ã»ãããäºåã«æ§ç¯
var enemyTiles = BuildTileSet(map, enemies);
var allyTiles = BuildTileSet(map, allies);
// èªåèªèº«ã¯ééå¯èœã«ãã
allyTiles.Remove(map.GetTile(unit.GridX, unit.GridY));
// BFS
// cost[tile] = ãã®ã¿ã€ã«ã«å°éããããã®æå°ã³ã¹ã
var cost = new Dictionary<TileData, int>();
var queue = new Queue<TileData>();
var result = new HashSet<TileData>();
var startTile = map.GetTile(unit.GridX, unit.GridY);
cost[startTile] = 0;
queue.Enqueue(startTile);
while (queue.Count > 0)
{
var current = queue.Dequeue();
int currentCost = cost[current];
// 忢å¯èœãã©ããïŒæµã¿ã€ã«ã»å³æ¹ã¿ã€ã«ã¯åæ¢äžå¯ïŒ
bool canStop = !enemyTiles.Contains(current) && !allyTiles.Contains(current);
if (canStop)
result.Add(current);
// 飿¥ã¿ã€ã«ãæ¢çŽ¢
foreach (var neighbor in map.GetNeighbors(current.X, current.Y))
{
if (!neighbor.IsPassable) continue; // éè¡äžå¯å°åœ¢
if (enemyTiles.Contains(neighbor)) continue; // æµãŠãããã¯ééäžå¯
int newCost = currentCost + neighbor.MoveCost;
if (newCost > moveRange) continue; // ç§»ååãªãŒããŒ
// ããäœã³ã¹ãã§å°éã§ããå Žåã®ã¿æŽæ°
if (!cost.TryGetValue(neighbor, out int existing) || newCost < existing)
{
cost[neighbor] = newCost;
queue.Enqueue(neighbor);
}
}
}
return result;
}
// ================================================================
// çµè·¯ã®ååŸïŒA* / BFS ã§æççµè·¯ãè¿ãïŒ
// ================================================================
/// <summary>
/// åºçºå°ç¹ãããŽãŒã«ãŸã§ã®æççµè·¯ãã¿ã€ã«ã®ãªã¹ãã§è¿ãã
/// å°éäžå¯ã®å Žåã¯ç©ºãªã¹ããè¿ãã
///
/// ãã¢ã«ãŽãªãºã : DijkstraïŒã³ã¹ãèæ
®BFSïŒã
/// å°åœ¢ã³ã¹ããèæ
®ããæççµè·¯ãæ±ããã
/// ãã¥ãŒãªã¹ãã£ãã¯ãªãã® Dijkstra ã§ç¢ºå®ãªæççµè·¯ãä¿èšŒããã
/// </summary>
/// <param name="map">ã°ãªããããã</param>
/// <param name="startX">åºçºX座æš</param>
/// <param name="startY">åºçºY座æš</param>
/// <param name="goalX">ç®æšX座æš</param>
/// <param name="goalY">ç®æšY座æš</param>
/// <param name="moveRange">æå€§ç§»åã³ã¹ãïŒå°éå€å®ã«äœ¿çšïŒ</param>
/// <param name="blockingUnits">ééäžå¯ãŠãããäžèŠ§ïŒæµãŠããããæž¡ãïŒ</param>
/// <returns>åºçºã¿ã€ã«ãå«ãçµè·¯ãªã¹ããå°éäžå¯ãªã空ãªã¹ãã</returns>
public static List<TileData> FindPath(
GridMap map,
int startX, int startY,
int goalX, int goalY,
int moveRange,
IEnumerable<UnitBattleState> blockingUnits = null)
{
var blockingTiles = BuildTileSet(map, blockingUnits);
// åªå
床ä»ããã¥ãŒïŒã³ã¹ãæé ïŒâ SortedList ã§ä»£çš
var openSet = new SortedList<int, Queue<TileData>>();
var cameFrom = new Dictionary<TileData, TileData>();
var costSoFar = new Dictionary<TileData, int>();
var startTile = map.GetTile(startX, startY);
var goalTile = map.GetTile(goalX, goalY);
if (startTile == null || goalTile == null)
return new List<TileData>();
Enqueue(openSet, 0, startTile);
costSoFar[startTile] = 0;
while (openSet.Count > 0)
{
var current = Dequeue(openSet);
if (current == goalTile)
return ReconstructPath(cameFrom, startTile, goalTile);
foreach (var neighbor in map.GetNeighbors(current.X, current.Y))
{
if (!neighbor.IsPassable) continue;
if (blockingTiles.Contains(neighbor)) continue;
int newCost = costSoFar[current] + neighbor.MoveCost;
if (newCost > moveRange) continue;
if (!costSoFar.TryGetValue(neighbor, out int existing) || newCost < existing)
{
costSoFar[neighbor] = newCost;
cameFrom[neighbor] = current;
// ãã¥ãŒãªã¹ãã£ãã¯ïŒãã³ããã¿ã³è·é¢ïŒãå ç®ããŠåªå
åºŠãæ±ºå®
int priority = newCost + GridMap.ManhattanDistance(neighbor.X, neighbor.Y, goalX, goalY);
Enqueue(openSet, priority, neighbor);
}
}
}
return new List<TileData>(); // å°éäžå¯
}
// ================================================================
// å°çšå
ãŠãããã®æ€çŽ¢
// ================================================================
/// <summary>
/// æå®åº§æšããå°çšïŒrange ãã¹ïŒå
ã«ãããŠããããè¿ãã
/// ãã³ããã¿ã³è·é¢ã§å€å®ããã
/// </summary>
/// <param name="map">ã°ãªããããã</param>
/// <param name="originX">æ»æèµ·ç¹ã®X座æš</param>
/// <param name="originY">æ»æèµ·ç¹ã®Y座æš</param>
/// <param name="range">å°çšïŒãã¹æ°ïŒ</param>
/// <param name="targets">察象ãŠãããäžèЧ</param>
/// <returns>å°çšå
ã«ãããŠãããã®ãªã¹ã</returns>
public static List<UnitBattleState> GetUnitsInRange(
GridMap map,
int originX, int originY,
int range,
IEnumerable<UnitBattleState> targets)
{
var result = new List<UnitBattleState>();
foreach (var unit in targets)
{
if (unit.IsDefeated) continue;
int dist = GridMap.ManhattanDistance(originX, originY, unit.GridX, unit.GridY);
if (dist <= range)
result.Add(unit);
}
return result;
}
// ================================================================
// ãŠãŒãã£ãªãã£
// ================================================================
/// <summary>ãŠãããäžèЧããã¿ã€ã«ã®ã»ãããæ§ç¯ãã</summary>
private static HashSet<TileData> BuildTileSet(
GridMap map,
IEnumerable<UnitBattleState> units)
{
var set = new HashSet<TileData>();
if (units == null) return set;
foreach (var u in units)
{
var tile = map.GetTile(u.GridX, u.GridY);
if (tile != null) set.Add(tile);
}
return set;
}
/// <summary>çµè·¯ãåæ§ç¯ããïŒãŽãŒã«ãã蟿ã£ãŠéé ã«ããïŒ</summary>
private static List<TileData> ReconstructPath(
Dictionary<TileData, TileData> cameFrom,
TileData start,
TileData goal)
{
var path = new List<TileData>();
var current = goal;
while (current != start)
{
path.Add(current);
if (!cameFrom.TryGetValue(current, out current))
return new List<TileData>(); // ç°åžžïŒéåžžã¯å°éããªãïŒ
}
path.Add(start);
path.Reverse();
return path;
}
/// <summary>åªå
床ä»ããã¥ãŒãžã®è¿œå ïŒSortedList + Queue ã§ã³ãªãžã§ã³å¯Ÿå¿ïŒ</summary>
private static void Enqueue(SortedList<int, Queue<TileData>> openSet, int priority, TileData tile)
{
if (!openSet.TryGetValue(priority, out var queue))
{
queue = new Queue<TileData>();
openSet.Add(priority, queue);
}
queue.Enqueue(tile);
}
/// <summary>åªå
床ä»ããã¥ãŒããã®åãåºã</summary>
private static TileData Dequeue(SortedList<int, Queue<TileData>> openSet)
{
var first = openSet.Values[0];
var tile = first.Dequeue();
if (first.Count == 0)
openSet.RemoveAt(0);
return tile;
}
}
}
ããªããªãã ããâŠ
ä»ãŸã§ã§äžçªé£ãããã ãã

ãæ¬åœããã®éãã ãšæããã
SRPGã®äžçªé£ããç¹ã£ãŠããã®ãçµè·¯ãå°çšãèšç®ããåŠçãã ãšç§ã¯æã£ãŠããã
ç°¡åã«èšããšãããŠããããå±
ããã¹ãèµ·ç¹ã«ããŠã
ãã®ãŠãããã®ãç§»ååãã®ã¹ããŒã¿ã¹ãã飿¥ãããã¹ãã©ãã©ãèšç®ããŠããã®ã
ããã«é害ç©ãä»ã®ãŠããããããå Žåã¯ããã®ãã¹ãã¹ãããããŠåèšç®ãè¡ããã
çµæãšããŠãç§»åå¯èœãªãã¹ã ããå°ãåºããŠè¿ãæããã
å³ã«ãããšãããªæããããã
â ç§»åçµè·¯


ãç§ãèµ·ç¹ã«ãã©ã®ãã¹ãäœãã¹é¢ããŠãããã衚ããŠãããã
ç§»ååã¯ç§ãæ©ããæ©æ°ãã
ãã€ã³ãã¯ãç§ã¯çŽè§ã«ããåãããšãåºæ¥ããæãã«ç§»åããããšã¯åºæ¥ãªãã®ã
ãããèžãŸããŠãããé£ã«é害ç©ããã£ãå Žåã
ãŸã£ããã«ããç§»åã§ããªãç§ã¯ã©ããã£ãŠ3æ©æ©ãããšæãïŒ
èããŠã¿ãŸãããã

ããã£ãšâŠæãã«ç§»åã§ããªããªããè¿åãããããŠç§»åãããããªãããªã

ããã®éãïŒ
ãããªããšãé åãããåãç§ãç§»åã§ããè·é¢ãå€ãã£ãŠæ¥ã¡ããã®ãã


ãé£ã«å²©ãããããã§ã岩ã®åããã«è¡ããªããªã£ããªïŒã

ãããããããšãã
å®éã«çŸå®äžçã§ãã£ãŠèŠããšçŽæçã«åããããšã ãã©ã
ããã°ã©ã ã®äžçã§ã¯ãããäžã€äžã€èšç®ããŠãããªããšãããªãã®ãã
ãããã«é害ç©ãããããããã®äžã§3æ©æ©ããªãããããçµè·¯ã«ãªããããã£ãŠã
ããããã®é£ããããªã³ãŒãã®äžã§ãã£ãŠããåºæ¬çãªåããã

ããªãã»ã©ãªïŒ
å®éã«å³ã«ããŠã¿ããšæ¡å€ãããããã ãªïŒã
æ»æåŠç
â æ»æåŠçå®è£ åç»

ãæ¬¡ã«ãæ»æã®åŠçãäœæãããã
ããããã£ãã®ãPathFinderãã®å¿çšã§å°çšãèšç®ããŠãããŠããããã
ããšå¿
èŠã«ãªã£ãŠããã®ã¯ããã¡ãŒãžèšç®ããšãåœäžå€å®ãããããŠãHPãæžããåŠçãã«ãªãããã

ããããå®ã¯äºåã«çµã¿ç«ãŠãŠããã ããªïŒã

ããããïŒ
ãŸããé£ãã話ã¯äžæŠçœ®ããšããŠâŠãŸãã¯æŒåºé¢ãã©ãããããã話ããããã
â ãšãã§ã¯ãã®ã¢ã»ãã

ããã¡ãŒãžãåããæã®æŒåºãšããŠããã¡ãã®ããªãŒã¢ã»ããã䜿ãããŠããã ãããã
ããã«ããç§ã«ã¯VFXããŒãããäœæããæè¡ãæéããªããããã
æçããæçã

ãããïŒ
ãããç¡æãªã®ã«ãããã«ãã³ãããšãã§ã¯ããããããå
¥ã£ãŠããªïŒïŒ

ããããïŒ
å®ã¯ãæUnityãè§Šã£ãŠããæä»£ãããã£ãšããŠã³ããŒãã¯ããŠãããã ãã©ãäžåã䜿ã£ãããšããªãã£ãã®ã
ä»åããããæ¥ã®ç®ãèŠãŠå¬ãããïŒã

ããªããªãïŒ ããã¯ãããšãèå¿ã®ãæ»æãã¯ã©ããã£ãŠäœã£ããã ãïŒã

ããããé£ããããïŒ ãã¡ãŒãžèšç®çšã®ã¹ã¯ãªããããèŠãããããã
// BattleCalculator.cs
// ããã«èšç®ããžãã¯ïŒçŽç²ãªéçã¯ã©ã¹ïŒ
// UnityEngine ã«æå°éããäŸåããªããããåäœãã¹ãã容æã
using UnityEngine;
namespace TrainingGame.Battle
{
/// <summary>
/// ããã«ã«ãããåçš®èšç®ãè¡ãéçã¯ã©ã¹ã
/// ã¹ããŒããæãããå
¥åå€ããçµæãè¿ãã ãã®çŽç²ãªèšç®åšã
/// </summary>
public static class BattleCalculator
{
// ================================================================
// 宿°
// ================================================================
/// <summary>ç©çã»éæ³æ»æã®æäœãã¡ãŒãž</summary>
public const int MIN_DAMAGE = 1;
/// <summary>åºæ¬åœäžçïŒ%ïŒ</summary>
public const int BASE_HIT_RATE = 80;
/// <summary>åœäžçã®äžéïŒ%ïŒ</summary>
public const int MAX_HIT_RATE = 100;
/// <summary>ã¯ãªãã£ã«ã«çºçæã®ãã¡ãŒãžåç</summary>
public const float CRITICAL_MULTIPLIER = 1.5f;
// ================================================================
// åœäžå€å®
// ================================================================
/// <summary>
/// æçµåœäžçãèšç®ããã
/// èšç®åŒ: Min(80 + åšçšã, 100)
/// åšçšãã20ã§åœäžç100%ïŒå¿
äžïŒã«ãªãã
/// </summary>
/// <param name="dexterity">æ»æåŽã®åšçšã</param>
/// <returns>åœäžçïŒ0ã100ã®æŽæ°ïŒ</returns>
public static int CalcHitRate(int dexterity)
{
return Mathf.Min(BASE_HIT_RATE + dexterity, MAX_HIT_RATE);
}
/// <summary>
/// åœäžãããã©ãããå€å®ããã
/// </summary>
/// <param name="dexterity">æ»æåŽã®åšçšã</param>
/// <returns>åœäžãããªã true</returns>
public static bool RollHit(int dexterity)
{
int rate = CalcHitRate(dexterity);
return Random.Range(0, 100) < rate;
}
// ================================================================
// ã¯ãªãã£ã«ã«å€å®
// ================================================================
/// <summary>
/// ã¯ãªãã£ã«ã«çºççãèšç®ããã
/// èšç®åŒ: é / 2ïŒ%ãå°æ°ç¹åãæšãŠïŒ
/// </summary>
/// <param name="luck">æ»æåŽã®é</param>
/// <returns>ã¯ãªãã£ã«ã«çïŒ0ã100ã®æŽæ°ïŒ</returns>
public static int CalcCriticalRate(int luck)
{
return Mathf.Clamp(luck / 2, 0, 100);
}
/// <summary>
/// ã¯ãªãã£ã«ã«ãçºçãããã©ãããå€å®ããã
/// </summary>
/// <param name="luck">æ»æåŽã®é</param>
/// <returns>ã¯ãªãã£ã«ã«ãªã true</returns>
public static bool RollCritical(int luck)
{
int rate = CalcCriticalRate(luck);
return Random.Range(0, 100) < rate;
}
// ================================================================
// ç©çãã¡ãŒãžèšç®
// ================================================================
/// <summary>
/// ç©çæ»æã®ãã¡ãŒãžãèšç®ããã
/// èšç®åŒ: Max(ATK - DEF, MIN_DAMAGE)
/// </summary>
/// <param name="atk">æ»æåŽã®ATK</param>
/// <param name="def">é²åŸ¡åŽã®DEF</param>
/// <returns>確å®ãã¡ãŒãžéïŒæäœ MIN_DAMAGEïŒ</returns>
public static int CalcPhysicalDamage(int atk, int def)
{
return Mathf.Max(atk - def, MIN_DAMAGE);
}
/// <summary>
/// ç©çæ»æã®äžé£ã®æµãïŒåœäžâã¯ãªãã£ã«ã«âãã¡ãŒãžïŒãèšç®ããã
/// </summary>
/// <param name="attacker">æ»æåŽã®ããã«ç¶æ
</param>
/// <param name="defender">é²åŸ¡åŽã®ããã«ç¶æ
</param>
/// <returns>èšç®çµæ</returns>
public static AttackResult CalcPhysicalAttack(UnitBattleState attacker, UnitBattleState defender)
{
var result = new AttackResult();
// åœäžå€å®ïŒåšçšãã§åœäžçãäžæïŒ
result.IsHit = RollHit(attacker.BaseStats.dexterity);
if (!result.IsHit)
return result; // ãã¹ïŒãã¡ãŒãžãªã
// â
ä¿®æ£ïŒåºç€ãã¡ãŒãžã®èšç®ã«ããã蟌ã¿ã®ãActualAtkããšãActualDefãã䜿ã
int baseDamage = CalcPhysicalDamage(attacker.ActualAtk, defender.ActualDef);
// ã¯ãªãã£ã«ã«å€å®ïŒéã§ã¯ãªãã£ã«ã«çãäžæïŒ
result.IsCritical = RollCritical(attacker.BaseStats.luck);
if (result.IsCritical)
baseDamage = Mathf.FloorToInt(baseDamage * CRITICAL_MULTIPLIER);
result.Damage = baseDamage;
return result;
}
// ================================================================
// éæ³ïŒã¹ãã«ïŒãã¡ãŒãžèšç®
// ================================================================
/// <summary>
/// éæ³æ»æã®ãã¡ãŒãžãèšç®ããã
/// èšç®åŒ: Max(éå - èéå, MIN_DAMAGE)
/// </summary>
/// <param name="magic">æ»æåŽã®éå</param>
/// <param name="magicDef">é²åŸ¡åŽã®èéå</param>
/// <returns>確å®ãã¡ãŒãžéïŒæäœ MIN_DAMAGEïŒ</returns>
public static int CalcMagicDamage(int magic, int magicDef)
{
return Mathf.Max(magic - magicDef, MIN_DAMAGE);
}
/// <summary>
/// å埩éãèšç®ããã
/// èšç®åŒ: éå à healMultiplierïŒå°æ°ç¹åãæšãŠïŒ
/// </summary>
/// <param name="magic">䜿çšè
ã®éå</param>
/// <param name="healMultiplier">å埩åçïŒäŸ: 1.0f or 1.5fïŒ</param>
/// <returns>å埩é</returns>
public static int CalcHealAmount(int magic, float healMultiplier = 1.0f)
{
return Mathf.FloorToInt(magic * healMultiplier);
}
/// <summary>
/// ã¹ãã«äœ¿çšã®äžé£ã®æµããèšç®ããã
/// â»éæ³æ»æã¯åœäžçã®æŠå¿µãæããªãïŒå¿
äžïŒèšèšã
/// 倿Žããå Žåã¯ããã«åœäžå€å®ã远å ããã
/// </summary>
/// <param name="attacker">䜿çšè
ã®ããã«ç¶æ
</param>
/// <param name="defender">察象ã®ããã«ç¶æ
ïŒå埩ã®å Žåã¯äœ¿çšè
èªèº«ãæž¡ãããšãå¯ïŒ</param>
/// <param name="skill">䜿çšããã¹ãã«</param>
/// <returns>èšç®çµæ</returns>
public static SkillResult CalcSkillEffect(UnitBattleState attacker, UnitBattleState defender, SkillData skill)
{
var result = new SkillResult { Skill = skill };
switch (skill.skillType)
{
case SkillType.MagicAttack:
result.IsHit = true; // éæ³ã¯å¿
äž
result.Damage = CalcMagicDamage(attacker.BaseStats.magic, defender.BaseStats.magicDef);
break;
case SkillType.Heal:
result.IsHit = true;
result.HealAmount = CalcHealAmount(attacker.BaseStats.magic, skill.healMultiplier);
break;
case SkillType.Buff:
case SkillType.Debuff:
// ããã»ãããã®è©³çްã¯Phase3以éã«å®è£
result.IsHit = true;
break;
}
return result;
}
// ================================================================
// ã¢ã¹ãã©ã«ã³ãŒãèšç®
// ================================================================
/// <summary>
/// ã¢ã¹ãã©ã«ã³ãŒãã®å¹æéãèšç®ããïŒå¿
äžã»ã¯ãªãã£ã«ã«ãªãïŒã
///
/// å
šäœç³»ïŒAllEnemy / AllAllyïŒã®å ŽåãBattleManager åŽã§ãã®çµæã
/// åã¿ãŒã²ããã«åå¥é©çšãããdefender ã«ã¯ null ãæž¡ããŠããã
/// </summary>
/// <param name="attacker">䜿çšè
</param>
/// <param name="defender">åäœå¯Ÿè±¡ïŒå
šäœç³»ã¯ null ã§ããïŒ</param>
/// <param name="entry">ã¢ã¹ãã©ã«ã³ãŒããšã³ããªãŒå®çŸ©</param>
/// <returns>èšç®çµæ</returns>
public static AstralCodeResult CalcAstralCode(
UnitBattleState attacker,
UnitBattleState defender,
AstralCodeEntry entry)
{
var result = new AstralCodeResult { Entry = entry };
var stats = attacker.BaseStats;
switch (entry.effectType)
{
case AstralCodeEffectType.PhysicalDamage:
// â
ä¿®æ£ïŒãã蟌ã¿ã® ActualAtk ãš ActualDef ã䜿ã
result.Damage = Mathf.Max(
Mathf.FloorToInt(attacker.ActualAtk * entry.powerMultiplier)
- (defender?.ActualDef ?? 0),
MIN_DAMAGE);
result.IsAoE = false;
break;
case AstralCodeEffectType.MagicDamage:
result.Damage = Mathf.Max(
Mathf.FloorToInt(stats.magic * entry.powerMultiplier)
- (defender?.BaseStats.magicDef ?? 0),
MIN_DAMAGE);
result.IsAoE = false;
break;
case AstralCodeEffectType.SelfHeal:
// MaxHP ã®å²åå埩
result.HealAmount = Mathf.FloorToInt(stats.maxHp * entry.powerMultiplier);
result.IsAoE = false;
break;
case AstralCodeEffectType.AllEnemyPhysical:
// â
ä¿®æ£ïŒå
šäœç©çããã蟌ã¿ã® ActualAtk ã䜿ã
result.Damage = Mathf.Max(Mathf.FloorToInt(attacker.ActualAtk * entry.powerMultiplier), MIN_DAMAGE);
result.IsAoE = true;
break;
case AstralCodeEffectType.AllEnemyMagic:
// å
šäœéæ³ïŒåºç€å€ã®ã¿
result.Damage = Mathf.Max(Mathf.FloorToInt(stats.magic * entry.powerMultiplier), MIN_DAMAGE);
result.IsAoE = true;
break;
case AstralCodeEffectType.AllAllyHeal:
result.HealAmount = Mathf.FloorToInt(stats.magic * entry.powerMultiplier);
result.IsAoE = true;
break;
case AstralCodeEffectType.InstantKill:
result.Damage = 9999; // BattleManager åŽã§ IsDefeated ãã§ãã¯
result.IsAoE = false;
break;
}
return result;
}
}
// ================================================================
// çµæããŒã¿æ§é äœ
// ================================================================
/// <summary>éåžžæ»æã®èšç®çµæ</summary>
public struct AttackResult
{
/// <summary>åœäžããã</summary>
public bool IsHit;
/// <summary>ã¯ãªãã£ã«ã«ã ã£ãã</summary>
public bool IsCritical;
/// <summary>æçµãã¡ãŒãžéïŒãã¹ãªã0ïŒ</summary>
public int Damage;
public override string ToString()
{
if (!IsHit) return "ãã¹ïŒ";
return IsCritical
? $"ã¯ãªãã£ã«ã«ïŒ {Damage} ãã¡ãŒãž"
: $"{Damage} ãã¡ãŒãž";
}
}
/// <summary>ã¹ãã«äœ¿çšã®èšç®çµæ</summary>
public struct SkillResult
{
/// <summary>䜿çšããã¹ãã«</summary>
public SkillData Skill;
/// <summary>广ãçºåãããïŒå¿
äžã¹ãã«ã¯åžžã«trueïŒ</summary>
public bool IsHit;
/// <summary>äžãããã¡ãŒãžéïŒæ»æã¹ãã«ã®ã¿ïŒ</summary>
public int Damage;
/// <summary>å埩éïŒå埩ã¹ãã«ã®ã¿ïŒ</summary>
public int HealAmount;
}
// ================================================================
// ã¢ã¹ãã©ã«ã³ãŒãèšç®çµæ
// ================================================================
/// <summary>ã¢ã¹ãã©ã«ã³ãŒã䜿çšã®èšç®çµæ</summary>
public struct AstralCodeResult
{
/// <summary>䜿çšãããšã³ããªãŒå®çŸ©</summary>
public AstralCodeEntry Entry;
/// <summary>äžãããã¡ãŒãžéïŒæ»æç³»ã®ã¿ïŒ</summary>
public int Damage;
/// <summary>å埩éïŒå埩系ã®ã¿ïŒ</summary>
public int HealAmount;
/// <summary>å
šäœæ»æã»å
šäœå埩ã®å Žå true</summary>
public bool IsAoE;
public override string ToString()
{
if (Entry == null) return "(null)";
return IsAoE
? $"ãã¢ã¹ãã©ã«ã³ãŒãã{Entry.skillName} â å
šäœ{Damage}ãã¡ãŒãž"
: HealAmount > 0
? $"ãã¢ã¹ãã©ã«ã³ãŒãã{Entry.skillName} â {HealAmount}å埩"
: $"ãã¢ã¹ãã©ã«ã³ãŒãã{Entry.skillName} â {Damage}ãã¡ãŒãž";
}
}
}
ãâŠåããããã説æããŠãããã

ãããïŒããã€ã©ã£ããæšªçããŠïŒ
ãŸãããã£ãŠãèšç®ã¯åã«æ±ºãã仿§ããã®ãŸãŸèžè¥²ããŠããããã
ð¢ ããã«èšç®åŒã®å®çŸ©
1. ç©çãã¡ãŒãžèšç®
ãã¡ãŒãž = ATK - DEF ïŒâ»æäœãã¡ãŒãžã1ã«èšå®ïŒ
äŸïŒãã€ãã®ATKã30ãæµã®DEFã15ã®å Žåã
30 - 15 = 15ãã¡ãŒãžã
éåžžã«ã·ã³ãã«ã§ããç¹èšã§ATKã1äžããã°ããã¡ãŒãžã1å¢ããããšããæé·ã®å®æããã€ã¬ã¯ãã«äŒãããŸãã
2. éæ³ïŒã¹ãã«ïŒãã¡ãŒãžèšç®
ãã¡ãŒãž = éå - èéå
ç©çãšåæ§ã®èšç®ã§ãã
å埩ã¹ãã«ã®å Žåã¯ããã®ãŸãŸãéåã®æ°å€ïŒå埩éããšãããã
ãéå à 1.5ããªã©å°ãããŒãã¹ãã€ãããšãã©ã³ã¹ãåããããããã
3. åœäžçèšç®
æçµåœäžç(%) = 80 + åšçšã ïŒâ»äžé100%ïŒ
åºæ¬åœäžçã80%ãšãããåšçšã1ãã€ã³ãã«ã€ããåœäžçã1%äžããã仿§ã§ãã
ããã«ããããåšçšãã20ã«ãªãã°åœäžç100%ïŒå¿ äžïŒã«ãªãããšããæç¢ºãªç¹èšã®ç®æšãçãŸããŸãã
4. ã¯ãªãã£ã«ã«èšç®
ã¯ãªãã£ã«ã«ç(%) = é / 2
ã¯ãªãã£ã«ã«çºçæã®ãã¡ãŒãž = éåžžãã¡ãŒãž à 1.5å ïŒå°æ°ç¹åãæšãŠïŒ
çºåãããã©ãããŒã

ãåšçšããšéã®é¢ä¿ã¯ã
çŽæçãªåããããããéèŠããŠãåšçšããåœäžçããéãã¯ãªãã£ã«ã«çãã«å€æŽããã®ã
ãããŠãããåºã«ãClaudeAIããã«ã³ãŒããäœã£ãŠããã£ãã®ãïŒã

ããªãã»ã©ãªïŒ
âŠãŠããšã¯ããã€ããæ®ã©èšç®åŒèŠãŠãªãããããªããã

ããŸããŸããç§ã¯æããã«ããããæ°å€ã«ãªã£ãæã«ããã調æŽã§ããã°ããã§ããã®ãïŒã

ããã€ãã人ã®ããšèšããããããããâŠã
æŠéçšã¢ã€ãã ã®å®è£
â ã¢ã€ãã 䜿çš

ãæ¬¡ã«æŠéçšã¢ã€ãã ã®å®è£
ãã
ããã¯æ¬åœã«èŠåŽãããâŠã

ããŸããæšªã§èŠãŠãŠçžåœå€§å€ããã ã£ããããªã
äœã倧å€ã ã£ããèãããŠãããã

ãããããâŠããã¯ç§ã®ç°å¢åºæã®åé¡ã ã£ãã®ã ãã©ã
宎3ã«ããŒã¿ç®¡çãä»»ããŠãã以äžããŸãã¯ã¢ã€ãã ã®æ
å ±ãæŠéã·ãŒã³ã«åŒãæž¡ãã®ã倧å€ã ã£ãããã
çµå±ãåååæ§ã¹ã¯ãªãã¿ãã«ãªããžã§ã¯ãã§åŒãæž¡ãããã«ããã®ã ãã©ã
ããšã¯ãããã®ã¢ã€ãã 广ã远å ããŠããã°ãåãé€ããŠã£ãŠäœæ¥ãå°éã§å€§å€ã ã£ããã

ããŸãã確ãã«å®Ž3ã«ç¡çããããŒã¿ç®¡çä»»ããŠãéçšã ã£ããããªã
ã ã£ãããã£ãã®ããšå®Žããåãé¢ããŠããŒã¿ç®¡çããã°ããã£ãããããããïŒã

ãæ£çŽããããžã§ã¯ãã®åæãªããã®æ¹æ³ãããã ã£ããšä»ã§ã¯æããã
ã§ããç§ãäžçªæ°ã«ããŠãã®ã¯ä¿åããããŒã¿ã宎ãšC#ã§ããããæã£ãŠããŸã£ãå Žåããã°ãçºçããæã«ãããã©ããåå ãªã®ãåãããªããªãããäœã®ããŒã¿ã©ãã§ä¿åãããŠããã®ãåãããªããªããšæã£ãã®ã
ããã«ã宎ã«ã¯å
ã
ã»ãŒãã»ããŒãæ©èœãããããããã䜿ãéçšã«ããã°ç§ãããããã»ãŒãæ©èœãUIãäœãæéããªããªããã
ã ãããããŒã¿ç®¡çã¯å
šéšå®Žã®ç®¡èœã«ãããã£ãŠæ±ºããã®ã

ããªãã»ã©ãªã
äœæ¥ã¹ããŒããšå¹çãèããèš³ãã

ããããã§ããã®ããã§ä»æ¥ã¯çãç®ã«ãã£ãã®ã ãã©ãã
ã»ãŒãæ©èœã®ãã°ä¿®æ£ïŒ5/2 8æéãããïŒïŒ

ã仿¥ã®ãã€ãããã¡ããã¡ãå¿ãããã ã£ãããªã
äœããã£ãã®ãæããŠãããã

ãããâŠâŠã
å®ã¯ããã宎ïŒUtageïŒãã®æ©èœã䜿ã£ãŠã»ãŒãã»ããŒãããŠãã
ã¡ãããšã²ãŒã äžã§ã¯ããŒã¿ãããŒããããŠãªãã£ãŠçŸè±¡ãèŠã€ããã®ã

ããããããããã²ãŒã ãåºæ¥ãªãã¬ãã«ã®å€§åé¡ãããããïŒ
åå ã¯äœã ã£ããã ïŒã

ãåå ã¯ã·ã³ãã«ã ã£ããã
ãããããèªäœã®ã¡ãã¥ãŒããããŒãããæ®µéã§ã¯ã宎ãåŽããããŒã¿ãå
±æããŠãªãããããŠããªãããã宎åŽã§ä¿åããããŒã¿ãåã蟌ããŠããªãã£ãã®ãã

ããªãã ããããªããšãâŠãããããªãã§ãããªã«èŠåŽãããã ïŒã

ãã»ããç§åºæ¬çã«ã¯ã³ãŒãã£ã³ã°ã¯çæAIã«ä»»ããŠããããªãïŒ
ã ããããã¡ã€ã«ãClaudeAIãããGeminiå
çã«èŠããŠä¿®æ£ããŠããã£ãŠãã®ãã

ãã§ããè²ããªAIã«èããŠãçµå±ãæ¬åœã®åå ã«ã¯èª°ãæ°ã¥ããªãã£ããã
ãããŒãããæ®µéã§ã¯å®ŽããããŒã¿ãè²°ã£ãŠããªãããšããæ§é çãªçºæ³ã«ãŸã§è³ããªããŠãäžã
解決ã§ããªãã£ãã®ããã

ããªãã»ã©ãªã
ããã§ããã€ãã¯ã©ããããã ïŒã

ããã以äžAIã«èããŠã解決ããªããšæã£ãããã
æ¢ããŠçæAIã®å©èšã¯å
šéšå¿ããŠãèªåã§äžã€ãã€ãããŒã¿ãã©ã®æ®µéãŸã§ä¿æãããŠããããã確èªããŠã¿ãã®ãã

ãäŸãã°ãããŒãããåŸã«å®Žãæã£ãŠã倿°ãåŒã³åºãããå€ã¯å ¥ã£ãŠããã®ãïŒ
ãããã£ãŠèª¿ã¹ãŠã¿ããšã宎åŽã§ã®å€æ°ã¯ã¡ãããšããŒãããåŸãæ®ã£ãŠãã®ã
ãããªããšããããŒãå®è¡åŸã«ãã¡ãããšå®ŽåŽãåç §åºæ¥ãŠããªãC#åŽã®ã¡ãã¥ãŒçæããžãã¯ãã«åé¡ãããã
ããã§æ¹ããŠã³ãŒãã確èªããŠã¿ããã
ããããããŒãããåŸã«å®Žã®å€æ°ãèªã¿ã«è¡ã£ãŠãªããããããŒããäœããªãã£ãŠããšãåãã£ãã®ãïŒã

ãèªåã§åå ãåãã£ããªããŠããããããããïŒ
ããã§ãã©ããã£ãŠçŽãããšæã£ããã ïŒã

ããã®ããšãGeminiå
çã«äŒããããã³ãŒããæž¡ããŠããããã
ãããŒãããæã«å®ŽåŽããæ
å ±ããã£ããããããšããæ°ããããžãã¯ããã
ã§ããæ£çŽç§ã¯ãã®ããæ¹ã¯éå¹çã ãšæã£ãã®ãã

ãã ã£ãŠãã»ãŒãã»ããŒãããåã¯ã¡ãããšããŒã¿ã®åŒç¶ããè¡ãããŠããã®ã ãããããããããžãã¯ã®æ ¹æ¬ãå€ããå¿ èŠã¯ãªãã®ãã
ããŒãããæã«å®Žã®ã·ãŒã³ãåŒã³åºããŠãããããåŸæ¥éãè²æã¡ãã¥ãŒãåŒã³åºãã°ããããŸã§äžæãè¡ã£ãæ¹æ³ãèžè¥²ãã€ã€éçšã§ããã§ããïŒã

ããªãã»ã©ãªïŒ
ãããããããããªã解決ããã®ãïŒã

ãããâŠâŠãããããæ¬åœã®å°çã ã£ããã
ãšããããä»åã®ãã°ä»¥äžã®ã²ãšæ¶çããã£ãã®ãã

ããªããªã«ããã£ããã ãã

ããã®æãç§ã¯çµæ§ç²ããŠãããã
ä¿®æ£ãããçšã®ã¹ã¯ãªããã®çµã¿èŸŒã¿ãGeminiå
çã«ä»»ããŠããã¡ã€ã«ããã®ãŸãŸäžæžãããã®ããã

ãããããâŠâŠã¢ã€ãã é¢é£ã®æ©èœããã£ã©ã¯ã¿ãŒæ å ±ãªã©ãã²ãŒã ã®æ ¹å¹¹ã«ãªãæ©èœãæ®ã©å£ãããã

ãâŠã¯ãïŒïŒ
ãªã«ãã£ãŠãã ãïŒã

ããŸããããã¯ã¢ãããåã£ãŠãªãã£ãç§ã«éã¯ãããã
ã²ãŒã éçºã®ããã¯ã¢ããã¯åºæ¬çã«GitHub Desktopã䜿ã£ãŠããã ãã©âŠâŠ
ãHorizonNotesãæ¬ç·šã ã£ããã
ãã®äŒç»ä»¥å€ã«ãè²ã
ãªãã®ã®ããã¯ã¢ãããåã£ãŠãŠãéä¿¡ã®æ ãã±ãã£ãŠããŸã£ãŠâŠâŠãã®äŒç»ã®ããã¯ã¢ãããããŸãåã£ãŠãªãã£ãã®ã

ããŸããããã¯ç¢ºãã«ãã€ããæªããšããããããâŠâŠ
ããã§ãçµå±ãªãã§ãããªç¶æ³ã«ãªã£ããã ïŒã

ãåé¡ã¯å€§ããåããŠäºã€ãã
äžã€ã¯ãGeminiå çãã³ãŒããäœæããéã«ãã©ãããŠãã宎ããåç §ããŠããæ¢åã®æ£ããæžãæ¹ãéžè±ããŠãå¥ã®åç §èšè¿°ã«æžãæããŠããŸã£ãäºã
ããäžã€ããããã€ãã®æ¢åã®ããžãã¯ãåæã«çç¥ããŠæ¶ããŠããŸã£ãäºãã
æ¶ãããŠããŸã£ãããžãã¯ã¯ãGeminiå çãç§ãèŠããŠãªãã
âŠâŠãšããããäœã£ãŠãæäžã¯ææ¡ããŠããŠããå
šãŠã®æ©èœãäžèšäžå¥èŠããŠãããããããªããããã
ããæå³ãäžããäœãçŽããã倧å€ã ã£ããã

ãå²ãšèŽåœçãããããâŠ
ããã¯ã¢ããããªããªãã»ãŒäœãçŽãããããããããªã®ã

ãæ£çŽãäŒç»ã諊ãããã«ãªãããããããæãããããã
âŠã§ããããã£ãããããŸã§é 匵ã£ãã®ã ããããããšãããŸã§ã¯é 匵ããã£ãŠæã£ãã®ã

ãããã§ããã€ãã¯ã©ããã£ãŠçŽãããã ïŒã

ãäžå¿ããèŠæèŠæã§å€§äºãªãã¡ã€ã«ã¯å¥ã«ä¿ç®¡ããŠãã®ã
æããŠãéšåããããã©ãäœãæãããã®åèã«ãªãããã

ãããšãæ¬åœã«å©ãã£ãã®ã¯ClaudeAIãããïŒ
ClaudeAIã¯éå»ã«å
±æãããã¡ã€ã«ããã£ããå±¥æŽã«æ®ããŠãããŠããããããããã埩å
ãåºæ¥ããïŒ
埩å
ã§ããå瞟ã®8å²ã¯ClaudeAIãããïŒã

ãããã€ã¯è¯ãã£ããããããïŒ
âŠâŠããã§ãä»åãªãã§ãããªGeminiã®æŽèµ°ãèµ·ãã¡ãŸã£ããã ïŒã

ããŸããããžãã¯ãæ¶ããŠããŸã£ãçç±ã ãã©ã
Geminiå
çã¯APIã®äœ¿çšéïŒããŒã¯ã³ïŒãåæžããçºã«ã
ä¿®æ£äžèŠãªåæã¯ã³ã¡ã³ãã¢ãŠãããŠçç¥ããŠããŸãçãããã®ã
ããã¯ãããã³ããã§çç¥ããªãããã«ããšãé¡ãããŠãçºçããããšãããåé¡ã ããã
ããAIã«ããã®ãŸãŸäžæžãããŠãã ããããšèšãããŠããå¿
ãã³ãŒãã®å
šäœã確èªããããšããããããããã

ãæ¬¡ã«ãåæã«ããžãã¯ã®ææ³ãæžãæããŠããŸã£ãä»¶ãã
ããã¯æ£çŽç§ã«ãè¯ãåãããªãã®ã ãã©ã該åœç®æã¯ã宎3ãåºæã®ã³ãã³ããå¿
èŠãªå Žé¢ã ã£ãããã
ãã£ãšäžè¬çãªC#ã®ç¥èã§æ°ãå©ãããã€ããã«ãªã£ãŠãééã£ãã³ãŒãã«æžãæããŠããŸã£ãã®ãã

ãäœãšãããâŠå²ãšäººéã¿ãããªãã¹ããããã ãªã
Geminiã¯ã
ããã§ããã€ããæãå¯Ÿçæ¹æ³ã¯ããã®ãïŒã

ãçæAIãéä¿¡ããããªãããšãã
ãããžã§ã¯ãã®å 容ãè€éåããŠã³ãŒãã®åéãå€ããªããšãããããåé¡ã¯çµæ§çºçããã®ãã
ã ãããããã©ãããã£ãŠãã®ãŸãŸã³ããããŠé©çšããã®ã¯å±éºã ãã
ããšãããã¯ã¢ããããã£ããåãããšã
ããã¯æ¬åœã«å€§äºã
ãããŠãAIã¯ãããŸã§ããµããŒãããšããŠéçšããããšãã

ãä»åã®ããšã§ç§ãåŠãã ã®ã¯ã人ãäž»å°ããŠçæAIã«çç¢ºã«æç€ºïŒããã³ããïŒãåºããªããšããã®äŸ¿å©ãªæ©èœã100%åŒãåºããªãã£ãŠããšã
ã ãããçæAIã«äžããæ
å ±ã¯æ¥µåããŒãå¿
èŠããããšæããã
äž»å°æš©ã¯åžžã«ãŠãŒã¶ãŒãæ¡ã£ãŠãªããšãããã解決ãŸã§æéãæããããšãããããã

ããªãã»ã©ãªã
çæAIã¯äŸ¿å©ãªããŒã«ã ãã©ã䜿ãããªãã«ã¯ãã£ã±ã人éã®ç¥æµãšç®¡çãäžå¯æ¬ ã£ãŠããšã ãªã

ãããšãèªåã®ããŒãºã«åãããŠãã©ã®AIãæŽ»çšãããããé©æé©æã§æ€èšããã®ããå§ããïŒ
ç§ã¯ãã³ãŒãã£ã³ã°ã®ç²ŸåºŠããããGoogleã®æ©èœãšã®é£æºãããç»åçæã»BGMçæã»åç»çæããããšããã©ãŠã¶ã䜿ã£ãææ°æ å ±ã®åéãã«åªäœæ§ããããšæã£ãããGeminiã«èª²éããŠããã©âŠâŠã
æ£çŽãã³ãŒãã£ã³ã°ã®æ£ç¢ºãã§ã¯ClaudeAIã®æ¹ãåªç§ãªå°è±¡ã ããChatGPTã®æ¹ã䜿ãããããšæããå Žé¢ããããã
æåŸã«
ããããŠãç§»åãæ»æãšãã£ãæŠéã·ã¹ãã ã®åºç€ãçµã¿äžããããããããã²ãŒã ããšããŠã®å匷ãç£å£°ãäžãå§ãããããžã§ã¯ãïŒãã€ãã
ããŒã¿æ¶å€±ã®å±æ©ãšãããæ¬åœã®å°çããèŠãªãããã
決ããŠè«Šããªãã£ãéžæãããŸãäžã€ãã®äžçãåã«é²ããŸããã
ããããéçºã®éã¯ãŸã ãŸã éºãããæªèžã®é åãåºãã£ãŠããŸãã
次åãæãããŠãã€ãã¯æªå®æã®ã¹ãã«ã®å®è£ ã«èŸ¿ãçããã®ãïŒïŒ
ãããšãããŸãããŠãäºæãã¬ãã°ã®éç©ãã³ãŒãã®è£åŽããçãå¥ãã®ãâŠâŠïŒïŒ
ãŸã ãŸã ç¶ããç¬ãããæ¶ããïŒïŒïŒã®ã²ãŒã éçºå¥®éèšã
次åããã©ããä¹ããæåŸ ïŒ
#ãããžã§ã¯ãNeith #HorizonNotes #ã²ãŒã å¶äœ #å人éçº #Unity #éçºæ¥èš #èªè åå å #æ¯æ¥note
ãããªãšæã£ããå¿æŽãããïŒ
ãããããã°å¿æŽãé¡ãããŸãïŒ
ããã ãããããã¯ã¯ãªãšã€ã¿ãŒãšããŠã®ã²ãŒã éçºã«äœ¿ãããŠããã ããŸãïŒ
â»ããããšå
±ã«ãã£ãŠæ¬²ããäºããã£ããèšã£ãŠãã ããïŒ
å¯èœãªç¯å²ã§ããã°é 匵ããŸã