<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>エルダークロニクル:VR超完全版 – ロードなし(拾う/装備修正)</title>
<script src="https://aframe.io/releases/1.4.2/aframe.min.js"></script>
<style>
body, html { margin:0; padding:0; overflow:hidden; font-family:'Yu Gothic',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; background:#000;}
#ui {
position:absolute; top:20px; left:20px; z-index:10; width:400px; color:#fff;
background:linear-gradient(180deg,rgba(0,0,0,.92),rgba(0,10,30,.85));
border-radius:16px; padding:14px 16px; box-shadow:0 0 25px #0ff,0 0 18px #33f4; font-size:15px;
}
h2 { margin:0 0 8px 0; font-size:22px; letter-spacing:1px;}
.row { display:flex; gap:8px; align-items:center; flex-wrap:wrap;}
.row > * { flex: 1 1 auto; }
input, select { width:100%; padding:6px 8px; border-radius:8px; border:1px solid #024; background:#00131f; color:#cfe9ff; }
button {
background:linear-gradient(90deg,#555,#222 80%);
color:#fff; padding:10px; margin:5px 0; border:none; cursor:pointer; width:100%;
border-radius:8px; font-weight:bold; letter-spacing:1px; box-shadow:0 1px 8px #0cf5; transition:background .25s;
}
button:hover { background:linear-gradient(90deg,#888 40%,#3cf); }
.section-title { font-weight:bold; font-size:17px; margin-top:10px; border-bottom:2px solid #5ef; letter-spacing:1.2px; }
.bar { height:14px; background:#13202a; border-radius:7px; overflow:hidden; margin:6px 0; box-shadow:0 1px 6px #0ff6 inset; }
.bar-inner { height:100%; background:linear-gradient(90deg,#0f0,#3af); transition:width .25s; }
.mana-bar .bar-inner { background:linear-gradient(90deg,#33d,#6ff); }
.enemyhp-bar .bar-inner { background:linear-gradient(90deg,#f55,#fdd); }
#scenario { margin:10px 0 6px 0; background:rgba(0,10,32,0.7); padding:8px 12px; border-radius:8px; min-height:44px; }
.kbd { display:inline-block; padding:1px 6px; border-radius:6px; background:#0a2636; border:1px solid #124; font-family:monospace; }
#hint {
position:absolute; bottom:18px; left:50%; transform:translateX(-50%);
color:#eaffff; background:rgba(0,20,35,.72); border:1px solid #0af; padding:8px 12px; border-radius:10px;
box-shadow:0 0 18px #08f5; font-size:14px; z-index:10;
}
#pickupPrompt {
position:absolute; bottom:70px; left:50%; transform:translateX(-50%);
color:#fff; background:rgba(0,0,0,.7); border:1px solid #38f; padding:8px 12px; border-radius:10px;
display:none; z-index:10;
}
.tag { display:inline-block; padding:2px 6px; border-radius:6px; background:#012233; border:1px solid #1a4e6c; margin-left:6px; font-size:12px; color:#bfe6ff;}
.on { background:#0b3754; border-color:#3db3ff; color:#fff; }
</style>
</head>
<body>
<div id="ui">
<h2>エルダークロニクルVR</h2>
<div class="row">
<span>プレイヤー名:</span>
<input id="playerName" placeholder="名前を入力">
</div>
<div class="row"><span>レベル:</span><span id="level" class="tag on">1</span>
<span>装備:</span><span id="equipment" class="tag">なし</span>
</div>
<div>HP: <span id="hpText">100</span></div>
<div class="bar"><div id="hpBar" class="bar-inner" style="width:100%"></div></div>
<div>魔力: <span id="manaText">100</span></div>
<div class="bar mana-bar"><div id="manaBar" class="bar-inner" style="width:100%"></div></div>
<div>敵HP: <span id="enemyHpText">120</span></div>
<div class="bar enemyhp-bar"><div id="enemyHpBar" class="bar-inner" style="width:100%"></div></div>
<div class="section-title">シナリオ</div>
<div id="scenario"></div>
<div class="section-title">行動</div>
<button onclick="levelUp()">🎉 レベルアップ</button>
<button onclick="castSpell()">🪄 魔法発動</button>
<button onclick="choosePath('wizard')">🧙♂️ 魔導士に話す</button>
<button onclick="choosePath('knight')">🛡️ 騎士に話す</button>
<button onclick="receiveQuest()">📜 クエスト受注</button>
<button onclick="toggleEnvironment()">🌄 昼夜切替</button>
<div class="section-title">移動</div>
<div class="row">
<button onclick="changeField('town')">🏘️ 街</button>
<button onclick="changeField('castle')">🏰 城</button>
</div>
<div class="row">
<button onclick="changeField('cave')">🕳️ 洞窟</button>
<button onclick="changeField('ruins')">🏛️ 遺跡</button>
</div>
<div class="row">
<button onclick="changeField('dungeon')">🧩 ダンジョン</button>
</div>
<div class="section-title">操作</div>
<div style="line-height:1.6">
<span class="kbd">WASD</span> 移動
<span class="kbd">マウス</span> 視点
<span class="kbd">E</span> 拾う
<span class="kbd">1</span> 剣装備
<span class="kbd">2</span> 銃装備
<span class="kbd">クリック</span> 攻撃
</div>
</div>
<div id="pickupPrompt">Eで拾う</div>
<div id="hint">近くの武器に近づいて <span class="kbd">E</span> で拾い、<span class="kbd">1/2</span> で装備、クリックで攻撃!</div>
<a-scene loading-screen="enabled:false" renderer="colorManagement:true" shadow="true">
<a-sky id="sky" color="#0e163e"></a-sky>
<a-entity id="starParticles" position="0 25 -40" visible="false">
<a-entity geometry="primitive:sphere; radius:0.18" material="color:#fff; opacity:0.6" position="-10 3 0"></a-entity>
<a-entity geometry="primitive:sphere; radius:0.12" material="color:#fff; opacity:0.8" position="7 2 -2"></a-entity>
<a-entity geometry="primitive:sphere; radius:0.11" material="color:#eaf6ff; opacity:0.9" position="3 5 2"></a-entity>
<a-entity geometry="primitive:sphere; radius:0.10" material="color:#ffe; opacity:0.7" position="13 3 5"></a-entity>
</a-entity>
<a-entity id="cloudParticles" position="0 30 -35" visible="true">
<a-sphere radius="5" position="8 2 -8" color="#f6fbff" opacity="0.18"></a-sphere>
<a-sphere radius="6" position="-7 3 5" color="#eefbff" opacity="0.14"></a-sphere>
</a-entity>
<a-light type="ambient" color="#fff" intensity="1"></a-light>
<a-light id="sunlight" type="directional" intensity="1.6" position="20 25 -8" castShadow="true" shadow-mapWidth="1024" shadow-mapHeight="1024"></a-light>
<a-light type="point" color="#cff" intensity="2.2" distance="50" position="2 9 -3"></a-light>
<a-light type="spot" color="#55aaff" position="0 15 -10" intensity="1.2" angle="30" penumbra="0.7"></a-light>
<a-plane id="ground" position="0 0 0" rotation="-90 0 0" width="120" height="120" color="#375047" shadow="receive:true"></a-plane>
<a-entity id="field-town" visible="true">
<a-circle position="0 0 -6" radius="4" color="#7d7d7d" material="roughness:.9; metalness:.05; opacity:.84; transparent:true"></a-circle>
<a-entity position="-2 0 -7">
<a-box width="3.6" height="2.6" depth="2.4" color="#c0a47b" material="roughness:0.3; metalness:0.05" position="0 1.3 0"></a-box>
<a-cone position="0 3 -0.1" radius-bottom="2.1" height="1.4" color="#7b5322"></a-cone>
<a-text value="街の家" position="0 3.7 0" color="#fff" width="5" align="center"></a-text>
</a-entity>
<a-entity position="2 0 -9">
<a-box width="2.2" height="2.2" depth="2.4" color="#a86f23" position="0 1.1 0"></a-box>
<a-cone position="0 2.6 0" radius-bottom="1.4" height="1.0" color="#5c3a12"></a-cone>
</a-entity>
<a-entity position="5 0 -5">
<a-cylinder radius="0.25" height="4" color="#3a2a1a" position="0 2 0"></a-cylinder>
<a-sphere radius="1.2" color="#174d1f" position="0 3.2 0"></a-sphere>
</a-entity>
</a-entity>
<a-entity id="field-castle" visible="false">
<a-box position="0 2.8 -12" depth="6" height="6" width="10" color="#ccd2df" material="roughness:0.25; metalness:0.12"></a-box>
<a-cylinder position="-4 1.2 -13" radius="1.1" height="3.8" color="#858ca3"></a-cylinder>
<a-cylinder position="4 1.2 -13" radius="1.1" height="3.8" color="#858ca3"></a-cylinder>
<a-cone position="0 6.4 -12" radius-bottom="3.2" height="2" color="#dba"></a-cone>
<a-entity geometry="primitive:torus; radius:2.5; tube:0.07" material="color:#66aaff; opacity:.25; transparent:true" position="0 4.5 -12"></a-entity>
<a-text value="王の城" position="0 6.3 -12" color="#0bf" width="6" align="center"></a-text>
</a-entity>
<a-entity id="field-cave" visible="false">
<a-torus position="2 1.1 -10" radius="1.8" tube="0.8" arc="230" color="#363636" rotation="40 0 90"></a-torus>
<a-sphere position="2 0.4 -10" radius="1.1" color="#151515"></a-sphere>
<a-entity position="-2 0 -8">
<a-cone radius-bottom="0.8" height="2.2" color="#2a2a2a"></a-cone>
<a-cone radius-bottom="0.5" height="1.4" color="#393939" position="0.7 0 0.4"></a-cone>
</a-entity>
<a-text value="洞窟の入口" position="2 2.9 -10" color="#fff" width="6" align="center"></a-text>
</a-entity>
<a-entity id="field-ruins" visible="false">
<a-cylinder position="-2 1.1 -9" radius="0.8" height="2.6" color="#babbb2"></a-cylinder>
<a-box position="-3.1 1.8 -9" width="3.5" height="0.32" depth="0.7" color="#e0dfc7"></a-box>
<a-torus position="-2 2.3 -9" radius="0.6" tube="0.09" arc="340" color="#fffeee"></a-torus>
<a-entity geometry="primitive:torusKnot; p:2; q:7; radius:0.7; tube:0.07" position="2 1.8 -8" material="color:#bcd; opacity:.7; transparent:true"></a-entity>
<a-text value="古代の遺構" position="0 3.3 -8.5" color="#fff" width="6" align="center"></a-text>
</a-entity>
<a-entity id="field-dungeon" visible="false">
<a-box position="2 1.2 -8.8" depth="3.3" height="2.3" width="3.6" color="#161651"></a-box>
<a-torus-knot position="-1.5 2.7 -8.2" radius="0.9" tube="0.12" p="3" q="7" color="#64eaff"></a-torus-knot>
<a-cylinder position="-3 0.7 -9.6" radius="0.8" height="1.2" color="#333"></a-cylinder>
<a-entity geometry="primitive:torus; radius:1.4; tube:0.05" material="color:#aaeeff; opacity:.18; transparent:true" position="0 2.1 -8.6" rotation="90 0 0"></a-entity>
<a-text value="ダンジョン入口" position="0 3.1 -8.4" color="#fff" width="6" align="center"></a-text>
</a-entity>
<!-- 武器ピックアップ -->
<a-entity id="swordPickup" class="pickup" data-weapon="sword" position="-1 0 -5">
<a-box width="0.16" height="1.3" depth="0.08" color="#cfe7ff" material="metalness:0.8; roughness:0.15" position="0 0.75 0"></a-box>
<a-box width="0.5" height="0.08" depth="0.08" color="#333" position="0 0.1 0"></a-box>
<a-cylinder radius="0.06" height="0.42" color="#7c5a2b" position="0 -0.1 0"></a-cylinder>
<a-entity geometry="primitive:ring; radiusInner:0.45; radiusOuter:0.5" rotation="-90 0 0" position="0 0 0" material="color:#44d; opacity:.35; transparent:true"></a-entity>
<a-text value="剣" color="#fff" position="0 1.7 0" align="center"></a-text>
</a-entity>
<a-entity id="gunPickup" class="pickup" data-weapon="gun" position="2 0 -5.5">
<a-box width="0.7" height="0.18" depth="0.18" color="#222" position="0 0.4 0"></a-box>
<a-box width="0.3" height="0.28" depth="0.18" color="#444" position="-0.2 0.2 0"></a-box>
<a-box width="0.12" height="0.40" depth="0.16" color="#333" position="0.2 0.15 0"></a-box>
<a-cylinder radius="0.06" height="0.28" color="#555" position="0.34 0.46 0" rotation="0 0 90"></a-cylinder>
<a-entity geometry="primitive:ring; radiusInner:0.45; radiusOuter:0.5" rotation="-90 0 0" position="0 0 0" material="color:#0aa; opacity:.35; transparent:true"></a-entity>
<a-text value="銃" color="#fff" position="0 1.0 0" align="center"></a-text>
</a-entity>
<!-- プレイヤー(リグが移動する:★修正) -->
<a-entity id="rig" position="0 0 0" wasd-controls="acceleration:30">
<a-entity id="cam" camera look-controls="pointerLockEnabled:true" position="0 1.6 3"></a-entity>
<a-entity id="player" position="0 0 -1.5" rotation="0 180 0" shadow="cast:true">
<a-sphere radius="0.18" color="#ffd7f0" position="0 1.58 0"></a-sphere>
<a-cylinder radius="0.23" height="0.9" color="#9ad" position="0 1.02 0"></a-cylinder>
<a-cylinder radius="0.08" height="0.55" color="#9ad" position="-0.16 0.74 0" rotation="0 0 18"></a-cylinder>
<a-cylinder radius="0.08" height="0.55" color="#9ad" position="0.16 0.74 0" rotation="0 0 -18"></a-cylinder>
<a-cylinder radius="0.09" height="0.7" color="#79b" position="-0.10 0.35 0"></a-cylinder>
<a-cylinder radius="0.09" height="0.7" color="#79b" position="0.10 0.35 0"></a-cylinder>
</a-entity>
</a-entity>
<!-- 敵 -->
<a-entity id="enemy" position="0 0 -9" visible="true">
<a-sphere id="enemyBody" radius="1.25" color="#9b1e1e" material="metalness:0.35; roughness:.25; emissive:#330000"></a-sphere>
<a-entity geometry="primitive:torus; radius:1.4; tube:0.05" material="color:#ffeeaa; opacity:.18; transparent:true" position="0 0.3 0" rotation="90 0 0"></a-entity>
<a-entity geometry="primitive:torusKnot; radius:0.45; tube:0.05; p:2; q:5" material="color:#ffa033; opacity:.22; transparent:true" position="0 1.0 0"></a-entity>
<a-sphere position="-0.38 0.42 0.95" radius="0.14" color="#fff" material="metalness:.9; roughness:.05; emissive:#a0f"></a-sphere>
<a-sphere position="0.38 0.42 0.95" radius="0.14" color="#fff" material="metalness:.9; roughness:.05; emissive:#a0f"></a-sphere>
<a-cone position="-0.45 1.35 0.15" radius-bottom="0.16" height="0.62" color="#f5f3ff" rotation="15 0 60"></a-cone>
<a-cone position="0.45 1.35 0.15" radius-bottom="0.16" height="0.62" color="#f5f3ff" rotation="15 0 -60"></a-cone>
<a-text value="敵モンスター" position="0 2.15 0" align="center" color="#fff"></a-text>
</a-entity>
<a-entity id="spellEffect" geometry="primitive:sphere; radius:0.55"
material="color:#72f3ff; opacity:.86; emissive:#88f; transparent:true"
position="0 1.7 -3" visible="false"
animation__move="property: position; to: 0 3.1 -6; dur:500; dir:alternate; loop:false">
<a-entity geometry="primitive:torus; radius:0.7; tube:0.08" material="color:#fff; opacity:.3; transparent:true"></a-entity>
</a-entity>
<a-entity id="game" game-manager></a-entity>
</a-scene>
<script>
let isDay=false, hp=100, mana=100, level=1;
let enemyHP=120, enemyHPMax=120;
function updateBars(){
document.getElementById("hpText").innerText = Math.max(0,Math.floor(hp));
document.getElementById("manaText").innerText = Math.max(0,Math.floor(mana));
document.getElementById("hpBar").style.width = Math.max(0,Math.min(100,hp))+"%";
document.getElementById("manaBar").style.width = Math.max(0,Math.min(100,mana))+"%";
document.getElementById("level").innerText = level;
document.getElementById("enemyHpText").innerText = Math.max(0,enemyHP);
const w = Math.max(0, Math.min(100, enemyHP*100/enemyHPMax));
document.getElementById("enemyHpBar").style.width = w+"%";
}
function levelUp(){ level++; hp=Math.min(100,hp+20); mana+=30; showScenario("🎉 レベルアップ!新しい力が湧いてくる!"); updateBars(); }
function castSpell(){
if(mana<20){ showScenario("💤 魔力が足りない!"); return; }
mana-=20; updateBars();
const effect=document.getElementById("spellEffect");
effect.setAttribute("visible","true");
setTimeout(()=>{ effect.setAttribute("visible","false"); applyDamageToEnemy(30,"魔法ヒット"); },700);
}
function choosePath(choice){
if(choice==="wizard"){ document.getElementById("equipment").innerText="魔導士のローブ"; mana+=50; showScenario("🧙♂️ 魔導士の試練が始まる…"); }
else{ document.getElementById("equipment").innerText="騎士の剣"; hp+=30; showScenario("⚔️ 騎士と共に魔王城へ向かう!"); }
updateBars();
}
function toggleEnvironment(){
const sky=document.getElementById("sky");
const star=document.getElementById("starParticles");
const cloud=document.getElementById("cloudParticles");
const ground=document.getElementById("ground");
const sunlight=document.getElementById("sunlight");
if(isDay){
sky.setAttribute("color","#0e163e"); star.setAttribute("visible","false"); cloud.setAttribute("visible","true");
ground.setAttribute("color","#375047"); sunlight.setAttribute("intensity","1.6"); showScenario("🌌 夜の世界へ…");
}else{
sky.setAttribute("color","#7ddfff"); star.setAttribute("visible","true"); cloud.setAttribute("visible","false");
ground.setAttribute("color","#b8ffcc"); sunlight.setAttribute("intensity","2.1"); showScenario("🌞 昼の世界へ…");
}
isDay=!isDay;
}
function changeField(fieldName){
const fields=['town','castle','cave','ruins','dungeon'];
fields.forEach(name=>{
const el=document.getElementById(`field-${name}`);
el.setAttribute('visible', name===fieldName);
});
showScenario(`📍 ${fieldName} に移動しました`);
}
function receiveQuest(){
const quests=[
"魔導士の塔で失われた書を探せ!","騎士団の旗を取り戻せ!","洞窟の奥に眠る魔石を発見せよ!",
"遺跡に隠された封印を解け!","ダンジョンの魔王を討伐せよ!"
];
const index=Math.floor(Math.random()*quests.length);
showScenario("📜 クエスト受注: "+quests[index]);
}
const scenarioList=[
"目覚めたあなたは不思議な世界にいた。","最初のクエストを受注しよう。","フィールド移動で冒険の扉が開く。",
"行動や魔法でストーリーが動く。","街で情報を集め、仲間と出会おう。","クエストを進め、魔王に立ち向かえ!"
];
let scenarioIndex=0;
function showScenario(text){ document.getElementById('scenario').innerHTML=text; }
function advanceScenario(){ if(scenarioIndex<scenarioList.length){ showScenario(scenarioList[scenarioIndex]); scenarioIndex++; } }
['levelUp','castSpell','choosePath','changeField','receiveQuest'].forEach(fn=>{
const orig=window[fn]; window[fn]=function(){ orig.apply(this, arguments); advanceScenario(); }
});
/* ---- ここが拾う/装備の中核 ---- */
const rigEl=()=>document.getElementById('rig');
const camEl=()=>document.getElementById('cam');
const enemyEl=()=>document.getElementById('enemy');
const enemyBodyEl=()=>document.getElementById('enemyBody');
let hasSword=false, hasGun=false, equipped='none';
let attackCooldown=false;
const bullets=[];
function setEquipmentLabel(){
let label="なし";
if(equipped==='sword') label="剣";
if(equipped==='gun') label="銃";
document.getElementById('equipment').innerText=label;
}
function tryPickup(){
const rpos=rigEl().object3D.position; // ★リグが移動するのでOK
const items=[document.getElementById('swordPickup'),document.getElementById('gunPickup')];
for(const it of items){
if(!it.getAttribute('visible')) continue;
const wpos=it.object3D.position;
const d=rpos.distanceTo(wpos);
if(d<2.0){
const w=it.getAttribute('data-weapon');
it.setAttribute('visible','false');
if(w==='sword'){ hasSword=true; if(equipped==='none') equipped='sword'; showScenario("🗡️ 剣を拾った! 1で装備。"); }
if(w==='gun'){ hasGun=true; if(equipped==='none') equipped='gun'; showScenario("🔫 銃を拾った! 2で装備。"); }
setEquipmentLabel();
return;
}
}
showScenario("近くに拾えるものはない。");
}
function equipSword(){ if(hasSword){ equipped='sword'; setEquipmentLabel(); showScenario("🗡️ 剣を装備した。"); } else { showScenario("剣をまだ拾っていない。"); } }
function equipGun(){ if(hasGun){ equipped='gun'; setEquipmentLabel(); showScenario("🔫 銃を装備した。"); } else { showScenario("銃をまだ拾っていない。"); } }
function attack(){
if(attackCooldown) return;
if(equipped==='sword'){ swordSlash(); }
else if(equipped==='gun'){ shootBullet(); }
else{ showScenario("装備がありません。剣や銃を拾ってください。"); }
}
function swordSlash(){
attackCooldown=true;
const slash=document.createElement('a-entity');
slash.setAttribute('geometry','primitive: torus; radius:0.9; tube:0.08; arc:200');
slash.setAttribute('material','color:#fff; opacity:.6; transparent:true');
const dir=new AFRAME.THREE.Vector3(); camEl().object3D.getWorldDirection(dir); dir.y=0; dir.normalize();
const base=rigEl().object3D.position.clone().add(new AFRAME.THREE.Vector3(0,1.2,0)).add(dir.clone().multiplyScalar(0.8));
slash.setAttribute('position',`${base.x} ${base.y} ${base.z}`);
const rotY=Math.atan2(dir.x,dir.z)*AFRAME.THREE.MathUtils.RAD2DEG;
slash.setAttribute('rotation',`0 ${rotY} 0`);
slash.setAttribute('animation__fade','property: material.opacity; to:0; dur:200; easing:easeOutQuad');
document.querySelector('a-scene').appendChild(slash);
setTimeout(()=>slash.parentNode && slash.parentNode.removeChild(slash),220);
const enemyPos=enemyEl().object3D.position.clone();
const toEnemy=enemyPos.clone().sub(rigEl().object3D.position.clone().add(new AFRAME.THREE.Vector3(0,1.0,0)));
const dist=toEnemy.length();
toEnemy.y=0; toEnemy.normalize();
const forward=dir.clone();
const angle=forward.dot(toEnemy);
if(dist<2.6 && angle>0.5 && enemyEl().getAttribute('visible')){
applyDamageToEnemy(25,"斬撃");
} else {
showScenario("空振り…");
}
setTimeout(()=>attackCooldown=false,280);
}
function shootBullet(){
attackCooldown=true;
const bullet=document.createElement('a-sphere');
bullet.setAttribute('radius','0.07');
bullet.setAttribute('color','#e6f7ff');
bullet.setAttribute('material','emissive:#88d; metalness:.6; roughness:.2');
const dir=new AFRAME.THREE.Vector3(); camEl().object3D.getWorldDirection(dir); dir.normalize();
const start=rigEl().object3D.position.clone().add(new AFRAME.THREE.Vector3(0,1.3,0)).add(dir.clone().multiplyScalar(0.9));
bullet.setAttribute('position',`${start.x} ${start.y} ${start.z}`);
document.querySelector('a-scene').appendChild(bullet);
bullets.push({el:bullet, dir:dir.clone(), life:1800, speed:24});
setTimeout(()=>attackCooldown=false,120);
}
function applyDamageToEnemy(dmg,label){
if(!enemyEl().getAttribute('visible')) return;
enemyHP=Math.max(0, enemyHP - dmg);
updateBars();
const origColor=enemyBodyEl().getAttribute('color');
enemyBodyEl().setAttribute('color','#ffffff');
setTimeout(()=>enemyBodyEl().setAttribute('color', origColor), 80);
spawnDamageText(dmg,label);
if(enemyHP<=0){ killEnemy(); }
}
function spawnDamageText(dmg,label){
const t=document.createElement('a-text');
t.setAttribute('value',`${label} -${dmg}`);
t.setAttribute('color','#ffe6e6');
t.setAttribute('align','center');
const p=enemyEl().object3D.position.clone();
t.setAttribute('position',`${p.x} ${p.y+2.4} ${p.z}`);
t.setAttribute('animation__rise','property: position; to: '+`${p.x} ${p.y+3.2} ${p.z}`+'; dur:650; easing:easeOutQuad');
t.setAttribute('animation__fade','property: opacity; to:0; dur:650; easing:easeOutQuad');
document.querySelector('a-scene').appendChild(t);
setTimeout(()=>t.parentNode && t.parentNode.removeChild(t),700);
}
function killEnemy(){
enemyEl().setAttribute('visible','false');
showScenario("✅ 敵を倒した! 5秒後に再出現する…");
setTimeout(()=>respawnEnemy(), 5000);
}
function respawnEnemy(){
enemyHP=enemyHPMax; updateBars();
const e=enemyEl();
const x = (Math.random()*6 - 3);
const z = -8.5 + (Math.random()*3 - 1.5);
e.setAttribute('position',`${x} 0 ${z}`);
e.setAttribute('visible','true');
showScenario("⚠️ 新たな敵が現れた!");
}
/* 入力(E/1/2 の互換強化:★修正) */
AFRAME.registerComponent('game-manager',{
init:function(){
window.addEventListener('keydown',(e)=>{
const k=e.key;
const c=e.code;
if(c==='KeyE' || k==='e' || k==='E') tryPickup();
if(c==='Digit1' || c==='Numpad1' || k==='1') equipSword();
if(c==='Digit2' || c==='Numpad2' || k==='2') equipGun();
});
window.addEventListener('mousedown',()=>attack());
updateBars(); advanceScenario(); setEquipmentLabel();
},
tick:function(time,dt){
const delta=dt/1000;
const prompt=document.getElementById('pickupPrompt');
const rpos=rigEl().object3D.position;
let near=false;
['swordPickup','gunPickup'].forEach(id=>{
const el=document.getElementById(id);
if(el.getAttribute('visible')){
const d=rpos.distanceTo(el.object3D.position);
if(d<2.0) near=true;
}
});
prompt.style.display = near?'block':'none';
// 弾
for(let i=bullets.length-1;i>=0;i--){
const b=bullets[i];
if(!b.el.parentNode){ bullets.splice(i,1); continue; }
b.life -= dt;
const pos=b.el.object3D.position;
pos.add(b.dir.clone().multiplyScalar(24*delta));
if(b.life<=0){ b.el.parentNode.removeChild(b.el); bullets.splice(i,1); continue; }
if(enemyEl().getAttribute('visible')){
const d=pos.distanceTo(enemyEl().object3D.position);
if(d<1.35){
applyDamageToEnemy(15,"射撃");
b.el.parentNode.removeChild(b.el);
bullets.splice(i,1);
}
}
}
enemyEl().object3D.rotation.y += delta*0.3;
}
});
updateBars();
advanceScenario();
</script>
</body>
</html>
カテゴリー: ゲーム開発
『ファンタシースター2 VR(仮題)』企画書
『ファンタシースター2 VR(仮題)』企画書
1. 概要
タイトル名:ファンタシースター2 VR(仮)
ジャンル:VR対応3DアクションRPG(ダンジョン探索+戦術バトル)
対応機種:Meta Quest 3 / SteamVR / PS VR2(検討)
プレイ人数:1人(将来的にCO-OP対応を検討)
対象年齢:12歳以上
2. 開発コンセプト
名作『ファンタシースターⅡ』を現代VR技術で完全リメイク。
原作の世界観とキャラクター、シナリオを尊重しつつ、
・没入感ある一人称視点探索
・直感的なバトル操作(モーション・アクション)
・拡張された都市・バイオシステム・ダンジョンの再現
を実現する。
3. 特徴とVRならではの要素
A. 没入型探索
- 一人称視点によるダンジョン探索
- 全3D再構築された「モタビア」都市、研究所、バイオドーム、地下施設
- 「パイプ・テレポーター」による瞬間移動ギミック(VR演出あり)
B. 戦闘システム
- 武器の物理操作(ソード、ガン、テクニック発動)
- 旧作のターン制をアレンジした**「ハイブリッド・リアルタイム戦闘」**
(タイムゲージ制+行動入力:手をかざす/武器を振る/ボタンパネル操作) - パーティAI(仲間キャラは自動行動、状況に応じた戦略切替)
C. テクニック(魔法)演出
- VRでの魔法詠唱アクション(ジェスチャー or インタラクション)
- 代表例:「レスタ」(回復)、「ゾンデ」(雷撃)など
4. ストーリー概要(原作準拠+VR補完)
西暦1284年。モタビア星ではマザーブレインによる管理社会が完成していた。
だが、突如として現れたバイオモンスターの脅威、そして…
主人公ユーシス(VRではプレイヤー自身)は、恋人の死をきっかけに陰謀の核心へと迫る。
※VRでは原作イベントに新たな視点や演出を加え、臨場感を演出(例:ネイの死のシーンなど)
5. 対応予定機能
| 機能 | 内容 |
| VR移動方式 | スムーズ移動/テレポート移動(選択可) |
| UI | ホログラムUIパネル、音声ナビ |
| 戦闘補助 | 自動ロックオン、ジェスチャーガイド |
| サウンド | 原作BGMのVRリミックス+3D空間音響 |
| コーディネート要素 | 装備外観変更、第一人称での確認可 |
6. 開発スケジュール(想定)
| フェーズ | 期間 | 内容 |
| 企画・検証 | ~2ヶ月 | 原作調査、VRプロトタイプ制作 |
| 開発前半 | 3ヶ月 | 戦闘・探索システム実装 |
| 開発後半 | 6ヶ月 | マップ・イベント実装、UI・ボイス収録 |
| テスト | 2ヶ月 | VRチューニング、デバッグ、最終調整 |
7. 収益化・販売戦略(案)
- 基本パッケージ売切型(4,980円想定)
- DLC追加シナリオ(ネイ専用編、隠しボスなど)
- コレクターズエディション(原作アートブック、BGM集)
8. ターゲット層
| 層 | 特徴 |
| 昔のPSシリーズファン | 懐かしさ+現代的な再体験 |
| VR RPGプレイヤー | 没入感ある探索・バトル体験 |
| SF好き/JRPG好き | 独特の世界観・設定・BGM |
ご希望があれば、次の内容も追加できます:
- マップ構成と画面イメージ図
- ジェスチャー一覧
- ストーリー詳細分岐
- UIデザインのモックアップ
必要に応じて続き作成しますか?
🎮 ゲーム企画書:『カスタムロボ RE:BOOST(仮)』
🎮 ゲーム企画書:『カスタムロボ RE:BOOST(仮)』
1. タイトル案
- 『カスタムロボ RE:BOOST』
- 『カスタムロボ R:Reboot』
- 『カスタムロボ∞(インフィニティ)』
2. コンセプト
「少年の夢が、再び現実になる。」
プレイヤーはカスタムロボのパイロットとして、機体を自由にカスタマイズし、リアルかつスピーディな戦闘を繰り広げる。かつてのロボットバトルの熱狂を、現代のビジュアルとシステムで完全再現し、シリーズ未体験の若年層と当時のファン両方に向けた“進化系リメイク”。
3. ターゲットユーザー
- 【主】20~40代:旧作ファン層(N64 / GC / DSユーザー)
- 【副】10~20代:現代のロボットアクションゲームファン(スプラトゥーン、ARMORED CORE、ガンダム系)
4. プラットフォーム
- Nintendo Switch 2(想定)
- PC(Steam)
- PS5(マルチプラットフォーム想定)
5. ゲームジャンル
- 対戦型ロボットカスタマイズバトルアクション
(3Dアクション+パーツ収集+オンライン対戦)
6. 主なゲーム要素
| 要素 | 内容 |
| ロボットのカスタマイズ | 頭・胴・脚・ガン・ボム・ポッドなど1000種類以上のパーツ。性能とビジュアルに影響。 |
| スピード感重視のバトル | 従来のダッシュ・ジャンプ・バーストに加え、新アクション「ブーストチェイン」導入。 |
| シングルモード | オリジナルストーリー+リメイク要素。「ラウンドダクロン」のようなドラマ展開。 |
| オンライン対戦 | ランクマッチ・ルームマッチ・トーナメント。観戦モードあり。 |
| ギルド/クラブ要素 | ユーザー同士でクランを組み、週替わりのイベントに参加。 |
| スキン/アバター | キャラやロボの見た目を変更できる。課金なしでも入手可能。 |
7. 世界観とストーリー(概要)
西暦2089年。AR空間で行われる仮想バトル「ホロロイド」が世界大会に昇格し、ロボット競技は再び脚光を浴びていた。
主人公は「伝説のロボ乗り」の息子として大会に挑む。背後には国家機密とされる人工知能兵器の陰謀が…。
8. ビジュアルイメージ
- キャラデザイン:アニメ調+SFテイスト(イラスト例:天神英貴・貞本義行風)
- ロボデザイン:トイ的なかわいさとメカのかっこよさを両立(例:LBX×AC)
9. 技術・開発情報
- エンジン:Unreal Engine 5
- ネットワーク:Photon Fusion / Epic Online Services
- カスタムAI:バディAIとの協力バトルモードあり
10. マネタイズ・展開
| 方式 | 内容 |
| 買い切り型 | 基本価格:6,980円(DLCパックあり) |
| DLC | ストーリー拡張・新パーツセット(例:コラボ機体・歴代作品機体) |
| コラボ展開 | 他ゲーム/玩具/アニメとコラボ(例:メダロット、LBX、ガンダム) |
| メディア展開 | アニメ化・コミカライズ・プラモデル販売(3Dプリント連携も) |
11. 差別化ポイント
- パーツごとの「フィジカル挙動」シミュレーションでリアル感UP
- AIロボ同士のオート戦も可能(観戦専用モード)
- 「仮想バトル空間」×「現実の世界」の行き来するハイブリッドストーリー
12. 開発スケジュール(案)
| フェーズ | 内容 | 期間 |
| 企画・プロトタイプ | プロトタイピング/ビジュアル検証 | 3ヶ月 |
| α開発 | 基本システム構築 | 6ヶ月 |
| β開発 | 全体完成・バグ修正 | 3ヶ月 |
| PR・リリース | 体験版配布/事前登録/製品版発売 | 2ヶ月 |
『デビルチルドレン リメイク』企画書
1. タイトル案
『デビルチルドレン:リバースコード』
2. 企画意図
2000年代初頭に登場し、少年少女が悪魔と契約して戦うという世界観で人気を博した『デビルチルドレン』シリーズを、現代の技術とニーズに合わせてリメイク。ペルソナやポケモン、デジモンの人気が再燃する中、悪魔との契約・育成・融合・人間ドラマを融合させたRPGとして、懐かしさと新しさを両立させます。
3. 想定プラットフォーム
- Nintendo Switch
- PlayStation 5
- Steam(PC)
- スマートフォン(クラウド連携 or 外伝展開)
4. ゲーム概要
ジャンル
- 悪魔育成RPG+ダークファンタジーADV
主な要素
- ターン制バトル(3対3)
- 悪魔の仲間化・進化・合体(従来の悪魔合体に加え、個体ごとの性格やスキル成長分岐あり)
- 悪魔と絆を深める「契約イベント」や「共鳴システム」
- 選択によるストーリールート分岐(LAW / CHAOS / NEUTRAL)
- ジュブナイル・ホラー要素(子供視点で描く社会の闇)
5. ストーリー構成(例)
あらすじ(リメイク用に刷新)
主人公(カイ / アミ)は、異世界「魔界」と現実世界の交差点である「黄昏区(たそがれく)」に迷い込む。悪魔と契約する能力を持つ「契約者」として覚醒し、2つの世界の崩壊を止める旅へ出る。だが、選ぶ道によって人類の運命も変わる──。
6. メインキャラクター(案)
- カイ(主人公・男性)
- アミ(主人公・女性)
- ロキ(主人公に付き添う謎の悪魔)
- セト(CHAOSルートの導き手)
- メタトロン(LAWルートの守護天使)
- ルシフェル(真実を知る者)
7. 主な新要素
| 項目 | 内容 |
|---|---|
| 3Dグラフィック化 | Unity / Unreal Engineによるリアルタイム3D |
| 悪魔フルボイス化 | 合体時や契約時に専用セリフあり |
| 難易度調整機能 | EASY〜CHAOSまで選択可能 |
| マルチエンディング | ルート分岐と「真・人類ルート」追加 |
| オンライン育成交換要素 | プレイヤー間で悪魔を交換できる |
8. 想定スケジュール
| フェーズ | 期間 | 内容 |
|---|---|---|
| 企画・プリプロ | 3か月 | シナリオ/仕様書/キャラデザイン |
| 開発 | 12〜18か月 | モデリング/実装/収録/テスト |
| テスト・調整 | 3か月 | バランス調整/デバッグ |
| 発売 | XX年XX月 | パッケージ&DL版展開 |
9. 想定ターゲット
- 元祖『デビチル』ファン(20〜40代)
- 現代のRPGファン(ペルソナ、ポケモン、デジモン層)
- ダークジュブナイルや退廃SFが好きなプレイヤー
10. プロモーション戦略案
- 初報ティザーPV公開(『デビチル』ロゴを強調)
- キャラ人気投票キャンペーン
- 悪魔デザインコンテスト(ユーザー参加型)
- オリジナルサウンドトラック配信
- コラボカフェ、限定グッズ展開
ゲーム企画書ChronoBlade
ゲーム企画書
タイトル:「ChronoBlade(クロノブレイド)」
ジャンル:アクションRPG(時間操作×剣術バトル)
プラットフォーム:PC / コンシューマ(PS5 / Xbox) / Steam Deck
プレイ人数:1人(後に協力プレイモードを実装予定)
対象年齢:12歳以上
1. コンセプト
「時間を操る剣士」として、時を越えた世界を旅し、運命を断ち切る壮大な物語を描く。本作は、アクション性と戦略性を融合させた“時間干渉型アクションRPG”であり、時間を遅らせたり、停止したり、巻き戻す力を駆使して戦うのが最大の特徴である。
2. 世界観
――時空を壊された世界で、人々は「未来」を失った。
舞台は、時間軸が乱れた崩壊寸前の多元世界「テンペルクロノス」。各時代(中世・近未来・古代・終末世界など)を旅しながら、異なる歴史の分岐を巡り、「正しい未来」を見出していく。
3. 主人公・キャラクター
- カイ=アルデン(CV案あり)
失われた王国の騎士。時を断ち切る剣「クロノブレイド」を手に入れ、失った妹を取り戻すために旅に出る。 - ティナ=リュミエール
時の研究者。時間魔法を操ることができ、サポートキャラ兼ヒロイン。
4. ゲームシステム
● バトル
- 通常のアクションバトルに加え、「時間停止」「時間巻き戻し」「未来視(予知)」といったシステムを組み合わせる。
- コンボ攻撃とタイムスキルの組み合わせで“時空コンボ”が発動。
● フィールド探索
- 各時代の世界を自由に探索。時間の干渉によって地形や人間関係が変化。
- 例:古代で橋を作れば、未来で村が発展している、などの「因果リンク」要素。
● 成長・スキル
- 剣術・時術の2つのスキルツリー。
- 「記憶のかけら」を集めることで過去の真実や新たな能力を開放。
5. グラフィック・演出
- セミリアルな3Dアニメ調。
- UE5を使用、ナイアガラでの時間エフェクト演出を多用。
- スロー演出や巻き戻しエフェクトなど、視覚的にも時間の影響を感じられる作り。
6. 音楽・効果音
- テーマ曲は時を感じさせる幻想的な旋律。
- バトル時には緊張感あるストリングスやピアノ、スロー時にはディレイ・リバース音使用。
- サウンドディレクター案:古代祐三風を想定。
7. マネタイズ・展開案
- 本編は買い切り型。
- 追加DLC(過去の歴史エピソード)配信
- 時代スキン、ボイスパック販売
- アニメ化・小説・コミカライズメディア展開も視野に入れる
8. 想定スケジュール
| フェーズ | 内容 | 期間 |
| 企画・仕様設計 | ゲームコンセプト固め、仕様書作成 | 1〜2ヶ月 |
| プロトタイプ制作 | プレイヤー・バトルコアの試作 | 2〜3ヶ月 |
| 本開発 | ストーリー・マップ制作・演出追加 | 6ヶ月〜12ヶ月 |
| テスト・調整 | QA・デバッグ・バランス調整 | 2ヶ月 |
| リリース | 国内外展開 | 1ヶ月〜 |
9. 開発体制(案)
- ディレクター:1名
- プログラマー:2〜3名(UE5ブループリント& C++)
- デザイナー:2D/3D各1名
- サウンド:外注
- シナリオ:1名(外注可)
- デバッグ:クラウドQA導入想定
必要に応じて、企画書のPDF化・プレゼン用スライド化・イラスト付き提案資料化なども可能です。
この内容でよければ続編やDLCの企画案も作成できます。
修正点や、ジャンル・世界観・主人公の変更などご希望があればお知らせください!
4o
ポケットモンスター ファイアレッド リ・イマジンド(Pokémon FireRed Re:Imagined)
【ゲーム企画書】
タイトル(仮)
ポケットモンスター ファイアレッド リ・イマジンド(Pokémon FireRed Re:Imagined)
【ジャンル】
RPG(ロールプレイングゲーム)
【企画意図・背景】
2004年に発売された『ポケットモンスター ファイアレッド』は、初代『赤・緑』のリメイクとして多くのファンに支持されました。本作はその精神を継承しつつ、現代のプレイヤーに向けてさらなる進化を遂げた新たなリメイクです。
「懐かしさ」と「革新」を融合させ、老若男女すべてのプレイヤーが楽しめる冒険体験を提供します。
【対応プラットフォーム】
Nintendo Switch 2(仮称)
※将来的にPCやスマートデバイス展開の可能性も視野
【ターゲットユーザー】
- ポケモン赤・緑/ファイアレッド世代の20~40代
- 現在のポケモンプレイヤー(全年齢層)
- 海外のレトロゲームファン
【主なゲーム特徴】
1. グラフィック完全刷新
- Unreal Engine 5によるHDグラフィック
- カントー地方をオープンゾーンとして再構築
- 天候/時間の概念を導入(リアルタイム連動も可能)
2. バトルシステム刷新
- アクティブタイム制+クラシックターン制のハイブリッド
- アニメーションと演出強化(例:ダイナミックカメラ、環境連動)
- ダブルバトル導入、オンライン対戦完全対応
3. ストーリー拡張
- ロケット団の過去やリーダー「サカキ」の内面に迫る追加エピソード
- 主人公に「個別エンディング」導入(選択肢と関係性に応じて変化)
4. キャラ/モンスターの再構築
- 初代151匹+ジョウト・ホウエンから一部登場(全300匹収録予定)
- キャラクターボイス実装(重要キャラ中心)
- 一部トレーナーのデザインを現代風にアップデート
5. 追加コンテンツ・DLC
- 「オレンジ諸島編」や「ジョウト地方の序盤体験」などのDLC
- 毎月の期間限定レイドバトルイベント開催
【基本仕様】
| 項目 | 内容 |
|---|---|
| プレイ人数 | 1人(オンライン時最大4人協力・対戦) |
| セーブ方式 | オートセーブ+手動セーブ |
| ボイス | 一部フルボイス(メインキャラ) |
| 対戦機能 | ランクマッチ、フリーバトル、カジュアルルーム |
| 通信 | ローカル・Wi-Fi・Bluetooth対応 |
| 周辺機器対応 | Joy-Con振動、モーション操作(ポケモン捕獲時) |
【開発スケジュール(例)】
| フェーズ | 期間 | 内容 |
|---|---|---|
| 企画・プリプロ | 3ヶ月 | 仕様決定、アートテスト |
| α版開発 | 6ヶ月 | システム実装、マップ構築 |
| β版開発 | 6ヶ月 | UI、ボイス、イベント追加 |
| デバッグ/最終調整 | 3ヶ月 | テスト・最適化・ローカライズ |
| 合計 | 約18ヶ月 |
【販売戦略】
- 初回特典:特別デザインの「リザードン」配信コード
- 限定版:設定資料集、サウンドトラック付き
- コラボ展開:アニメ連動、リアルイベント(ポケモンセンター等)
【予想価格】
- 通常版:6,980円(税込)
- 限定版:9,980円(税込)
ドラゴンドライブVR
『ドラゴンドライブVR』企画書
1. タイトル
ドラゴンドライブVR(Dragon Drive VR)
2. ゲームジャンル
- ジャンル:VRアクション・ドラゴンバトルRPG
- プレイ方式:1人プレイ(将来的にオンライン対戦対応予定)
- 対応ハード:Meta Quest 3 / PC VR(SteamVR対応) / PS VR2
3. コンセプト
「君と竜が一体となる、空中戦の限界へ。」
プレイヤーは“ドラゴンライダー”となり、現実世界とリンクした仮想空間でドラゴンを育成・騎乗し、空中戦・地上戦を体験。VRならではの臨場感で“ドラゴンと飛ぶ”夢を実現する。
4. 主なゲームシステム
● ドラゴン育成システム
- タマゴから孵化→成長→進化(分岐進化あり)
- 育成によってスキル・属性が変化(炎・氷・雷・闇・光など)
- エサ・訓練・信頼度で個性が変化
● ライドバトル(空中戦)
- フリーフライトで空を自由に飛ぶ
- 射撃・ブレス攻撃・回避・突進などのバトルアクション
- 一人称視点と三人称視点を切替可能
● 地上探索
- 拠点となる街や遺跡を探索し、アイテムやミッションを獲得
- ダンジョンはプレイヤー+ドラゴンで攻略(謎解き要素あり)
● VRインタラクション
- ドラゴンとのふれあい:撫でる、餌をあげる、呼びかけるなど
- 騎乗時のリアルな風・振動・高度変化演出
5. 世界観
かつて竜と人が共に生きていた「空界アルトレア」。
再び甦る邪竜の脅威に対抗するため、選ばれし“ライダー”たちが立ち上がる。
6. 想定ターゲット
- VRユーザー(10代後半~30代前半)
- ファンタジー・ドラゴン・育成ゲームファン
- 『ドラゴンドライブ』『パンドラハーツ』『アバター』『竜とそばかすの姫』に魅力を感じる層
7. 収益モデル
- 基本プレイ無料+アイテム課金(アバター/ドラゴンスキン)
- 拡張DLC(新マップ、新ドラゴン、新ストーリー)
- NFT連携によるドラゴン個体資産化(検討中)
8. 開発体制・ツール
- エンジン:Unity(または Unreal Engine 5 + OpenXR)
- ネットワーク:Photon Fusion または Mirror
- VR対応:Meta SDK / OpenXR / SteamVR
9. 開発スケジュール(例)
| フェーズ | 内容 | 期間 |
|---|---|---|
| 企画・プロトタイプ | 世界観、コアシステム試作 | 3か月 |
| アルファ版 | 飛行+戦闘+育成基本実装 | 6か月 |
| ベータ版 | UI/UX調整+コンテンツ拡充 | 3か月 |
| リリース | マーケティング+ローンチ | 1か月 |
10. 補足・将来展望
- マルチプレイヤーPvP空中戦の実装
- ドラゴンコンテストイベント(飛行レース・育成大会)
- AI搭載ドラゴンとの感情交流
- Mixed Reality対応によるリアル環境でのドラゴン投影体験
デジモンVR – デジタルワールド体感プロジェクト
1. 概要
「デジモンVR」は、プレイヤーがパートナーデジモンとともにデジタルワールドを冒険する完全没入型VRゲームです。デジヴァイスを手に持ち、リアルタイムに進化・バトル・探索を体感できます。
2. コンセプト
- 没入型デジモン体験:フル3Dで再現されたデジタルワールドをVRで歩き回り、実際にパートナーデジモンと交流。
- リアル進化体験:デジヴァイスを模したVRインターフェースで、進化演出を自ら操作。
- ソーシャル連携:他プレイヤーとの協力プレイ・バトル機能も搭載予定。
3. プラットフォーム
- 対応予定:Meta Quest 3 / SteamVR / PSVR2
- 必要環境:6DoF対応、両手コントローラー、ネット接続
4. 主なゲーム要素
| 要素 | 内容 |
|---|---|
| パートナーデジモン | プレイヤーに寄り添い、育成・進化・会話が可能。 |
| 探索 | デジタルワールドを歩き回り、データ収集・イベント・素材採集など。 |
| バトル | リアルタイム・アクションバトル。手の動きで技を発動。 |
| 進化システム | 条件を満たすことで、進化演出をリアルタイム操作。 |
| デジヴァイス連携 | ゲーム内HUDを通じたステータス管理・進化・装備管理。 |
5. 想定ユーザー
- デジモンファン(10〜40代)
- VRゲームファン
- ソーシャルVR体験を求めるユーザー
6. 収益モデル
- 基本プレイ無料 + アイテム課金(進化用素材・コスチュームなど)
- 有料DLC(新エリア・新デジモン追加)
- 限定コラボイベント(アニメ・映画連動)
7. 開発体制とスケジュール(想定)
| フェーズ | 内容 | 期間 |
|---|---|---|
| 企画・設計 | 世界観・UI設計 | 2ヶ月 |
| プロトタイプ | MVP制作(移動・進化・バトル) | 3ヶ月 |
| フル開発 | 全コンテンツ制作 | 8〜12ヶ月 |
| テスト | クローズドβ、ユーザーテスト | 2ヶ月 |
| リリース | ローンチ & プロモーション | – |
8. プロモーション戦略
- ティザー映像公開(進化演出などを強調)
- VTuber・実況者とのコラボ体験配信
- デジモンアニメ新作との連動キャンペーン
9. ビジュアルモック(イメージ)
- ログイン画面:デジタルゲートをくぐる演出
- バトル画面:等身大のグレイモンが目前で技を放つ
- UI:腕についたデジヴァイス風デバイスで操作
10. 特記事項・注意点
- 原作のIP利用には株式会社バンダイとの協議・許諾が必要
- メタバース連携を想定する場合は将来的な拡張性も要検討
ロックマンEXE VR ― 企画書
ロックマンEXE VR ― 企画書
【タイトル】
ロックマンEXE VR(仮)
【コンセプト】
電脳世界と現実を融合させた「フルダイブ・ネットバトル体験」――
プレイヤーがナビゲーターを操作し、リアルタイムにネットバトルを行う、完全没入型VRアクションRPG。
【ジャンル】
- フルダイブVRアクションRPG
- オンラインネット対戦型コンテンツ
- ストーリー付きシングルプレイキャンペーンモード
【プラットフォーム】
- Meta Quest 3 / Quest Pro
- SteamVR(PCVR)
- 将来的にはApple Vision Pro、PlayStation VR2にも展開予定
【想定ターゲット】
- 20代〜40代のロックマンEXEシリーズ経験者
- VR体験に慣れているコアゲーマー層
- 近未来・サイバーSF世界観が好きなユーザー
【主な特徴】
1. 電脳世界へのフルダイブ
- プレイヤーは“オペレーター”として、VR空間から自分のナビ(ロックマンなど)を操作。
- 視点はナビ視点とオペレーター視点を自由に切り替え可能。
2. リアルタイム・ネットバトル
- 従来のマス目バトルにVRならではの要素を追加(例:手でチップを選び、発動動作を行う)。
- 複数人の協力プレイやPvP対戦にも対応。
3. チップ実体化ギミック
- 実際に手を伸ばして“バトルチップ”を物理的に選択・使用する没入型インターフェース。
- チップの選択ミスやタイミングなど、直感操作が勝負の鍵に。
4. 電脳都市の探索
- “ACDCタウン”や“電脳世界”を自由に歩き回り、NPCとの対話やミッション受注が可能。
- 実世界(オペレータールーム)とネット世界(ナビ視点)を行き来して物語が展開。
【ゲームモード】
- ストーリーモード
原作シリーズを踏襲しつつ、オリジナル展開も用意。名シーンをVRで再現。 - VR対戦モード
フレンド・ランダム対戦機能付き。ランキングや報酬制度あり。 - カスタムルームモード
プレイヤーのVRオペレータールームを自由にカスタマイズ。
【開発スケジュール(案)】
| フェーズ | 期間 | 内容 |
|---|---|---|
| 企画・プロト制作 | 0〜3ヶ月 | 世界観設定、試作バトルシステム |
| アルファ版開発 | 4〜8ヶ月 | 探索・戦闘・UIの実装 |
| ベータ版開発 | 9〜12ヶ月 | ストーリー、マルチ対戦 |
| リリース準備 | 13〜15ヶ月 | デバッグ、配信準備、マーケ |
【必要開発体制(最小構成)】
- VRエンジニア(Unreal Engine or Unity XR経験者)
- キャラクター/背景3Dモデラー
- アニメーター
- プランナー / シナリオライター
- UI/UXデザイナー
- ネットワークエンジニア
【将来的展開】
- DLC:フォルテ、サーチマン、ブルース編など
- eスポーツ大会の開催
- コラボイベント(EXEシリーズ20周年企画など)
- AR版ロックマンペットの開発(スマホ連携)
【ビジュアルモック・参考資料】
※必要であれば後日、UI/UX・ワールドデザインのモックアップをご用意します。
【備考】
※本企画はファン提案ベースであり、カプコン社の正式な許諾が必要です。商業化にあたってはライセンス取得が前提条件となります。
Unity C# Stats.cs
using UnityEngine;
[System.Serializable]
public class Stats // ← MonoBehaviourを削除
{
public int Level = 1;
public int maxHp = 1;
public int atk = 1;
public int def = 1;
public int mana = 1;
public int manaXSecond = 5;
public CharacterClass charClass = CharacterClass.warrior;
}
public enum CharacterClass
{
warrior,
maga,
priest,
paladin,
shamano,
druid,
rogue,
ranger
}
