@xrift/world-components 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -479,6 +479,68 @@ function MyWorld() {
|
|
|
479
479
|
- シェーダーを使用した軽量な実装です
|
|
480
480
|
- シーンの背景色も自動的に設定されます
|
|
481
481
|
|
|
482
|
+
### SpawnPoint コンポーネント
|
|
483
|
+
|
|
484
|
+
ワールド内のプレイヤーのスポーン(出現)地点を指定するコンポーネントです。開発時には位置と向きを視覚的に確認できるヘルパーが表示されます。
|
|
485
|
+
|
|
486
|
+
```tsx
|
|
487
|
+
import { SpawnPoint } from '@xrift/world-components'
|
|
488
|
+
|
|
489
|
+
function MyWorld() {
|
|
490
|
+
return (
|
|
491
|
+
<>
|
|
492
|
+
{/* 原点にスポーン、正面向き */}
|
|
493
|
+
<SpawnPoint />
|
|
494
|
+
|
|
495
|
+
{/* 位置と向きを指定 */}
|
|
496
|
+
<SpawnPoint position={[0, 0, 5]} yaw={180} />
|
|
497
|
+
</>
|
|
498
|
+
)
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
#### Props
|
|
503
|
+
|
|
504
|
+
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|
|
505
|
+
|-----------|-----|------|-----------|------|
|
|
506
|
+
| `position` | `[number, number, number]` | - | `[0, 0, 0]` | スポーン位置 |
|
|
507
|
+
| `yaw` | `number` | - | `0` | スポーン時の向き(度数法 0-360) |
|
|
508
|
+
|
|
509
|
+
#### 開発時ヘルパー
|
|
510
|
+
|
|
511
|
+
開発環境(`import.meta.env.DEV === true`)では、スポーン位置と向きを視覚的に確認できるヘルパーが表示されます:
|
|
512
|
+
|
|
513
|
+
- 半透明の円柱(下から上にかけて透明度が増すグラデーション)
|
|
514
|
+
- 黄緑色の矢印でスポーン方向を表示
|
|
515
|
+
|
|
516
|
+
本番ビルドではヘルパーは表示されず、コードも含まれません。
|
|
517
|
+
|
|
518
|
+
#### useSpawnPoint フック
|
|
519
|
+
|
|
520
|
+
プラットフォーム側で現在設定されているスポーン地点を取得するフックです。
|
|
521
|
+
|
|
522
|
+
```tsx
|
|
523
|
+
import { useSpawnPoint } from '@xrift/world-components'
|
|
524
|
+
|
|
525
|
+
function PlayerSpawner() {
|
|
526
|
+
const spawnPoint = useSpawnPoint()
|
|
527
|
+
|
|
528
|
+
useEffect(() => {
|
|
529
|
+
if (spawnPoint) {
|
|
530
|
+
player.position.set(...spawnPoint.position)
|
|
531
|
+
player.rotation.y = THREE.MathUtils.degToRad(spawnPoint.yaw)
|
|
532
|
+
}
|
|
533
|
+
}, [spawnPoint])
|
|
534
|
+
|
|
535
|
+
return null
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
#### 注意事項
|
|
540
|
+
|
|
541
|
+
- 1つのワールドに複数のSpawnPointがある場合、最後に設定されたものが有効になります
|
|
542
|
+
- `useSpawnPoint`は主にプラットフォーム側(xrift-frontend)での使用を想定しています
|
|
543
|
+
|
|
482
544
|
## 開発
|
|
483
545
|
|
|
484
546
|
```bash
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { type FC } from 'react';
|
|
2
|
+
declare module '@react-three/fiber' {
|
|
3
|
+
interface ThreeElements {
|
|
4
|
+
gradientCylinderMaterial: React.JSX.IntrinsicElements['shaderMaterial'];
|
|
5
|
+
}
|
|
6
|
+
}
|
|
2
7
|
export interface SpawnPointProps {
|
|
3
8
|
/** スポーン位置 [x, y, z] */
|
|
4
9
|
position?: [number, number, number];
|
|
@@ -15,7 +20,8 @@ export interface SpawnPointProps {
|
|
|
15
20
|
* <SpawnPoint position={[0, 0, 5]} yaw={180} />
|
|
16
21
|
*
|
|
17
22
|
* @note
|
|
18
|
-
* -
|
|
23
|
+
* - 開発時(import.meta.env.DEV === true)のみヘルパー表示が有効になります
|
|
24
|
+
* - 本番ビルドにはヘルパーのコードが含まれません
|
|
19
25
|
* - 1つのワールドに複数のSpawnPointがある場合、最後に設定されたものが有効になります
|
|
20
26
|
*/
|
|
21
27
|
export declare const SpawnPoint: FC<SpawnPointProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SpawnPoint/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAa,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SpawnPoint/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAa,MAAM,OAAO,CAAA;AA8B1C,OAAO,QAAQ,oBAAoB,CAAC;IAClC,UAAU,aAAa;QACrB,wBAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;KACxE;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,0BAA0B;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA+C1C,CAAA"}
|
|
@@ -1,5 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
2
|
import { useEffect } from 'react';
|
|
3
|
+
import { shaderMaterial } from '@react-three/drei';
|
|
4
|
+
import { extend } from '@react-three/fiber';
|
|
5
|
+
import { DoubleSide } from 'three';
|
|
2
6
|
import { useSpawnPointContext } from '../../contexts/SpawnPointContext';
|
|
7
|
+
const GradientCylinderMaterial = shaderMaterial({ color: [0, 1, 0.53], opacity: 0.5 },
|
|
8
|
+
// vertex shader
|
|
9
|
+
`
|
|
10
|
+
varying vec2 vUv;
|
|
11
|
+
void main() {
|
|
12
|
+
vUv = uv;
|
|
13
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
14
|
+
}
|
|
15
|
+
`,
|
|
16
|
+
// fragment shader
|
|
17
|
+
`
|
|
18
|
+
uniform vec3 color;
|
|
19
|
+
uniform float opacity;
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
void main() {
|
|
22
|
+
float alpha = opacity * (1.0 - vUv.y);
|
|
23
|
+
gl_FragColor = vec4(color, alpha);
|
|
24
|
+
}
|
|
25
|
+
`);
|
|
26
|
+
extend({ GradientCylinderMaterial });
|
|
3
27
|
/**
|
|
4
28
|
* ワールド内のリスポーン地点を指定するコンポーネント
|
|
5
29
|
* ワールド作成者がこのコンポーネントを配置することで、
|
|
@@ -10,14 +34,21 @@ import { useSpawnPointContext } from '../../contexts/SpawnPointContext';
|
|
|
10
34
|
* <SpawnPoint position={[0, 0, 5]} yaw={180} />
|
|
11
35
|
*
|
|
12
36
|
* @note
|
|
13
|
-
* -
|
|
37
|
+
* - 開発時(import.meta.env.DEV === true)のみヘルパー表示が有効になります
|
|
38
|
+
* - 本番ビルドにはヘルパーのコードが含まれません
|
|
14
39
|
* - 1つのワールドに複数のSpawnPointがある場合、最後に設定されたものが有効になります
|
|
15
40
|
*/
|
|
16
41
|
export const SpawnPoint = ({ position = [0, 0, 0], yaw = 0, }) => {
|
|
17
42
|
const { setSpawnPoint } = useSpawnPointContext();
|
|
43
|
+
const yawRad = (yaw * Math.PI) / 180;
|
|
18
44
|
useEffect(() => {
|
|
19
45
|
setSpawnPoint({ position, yaw });
|
|
20
46
|
}, [position, yaw, setSpawnPoint]);
|
|
21
|
-
|
|
47
|
+
// Vite以外の環境では import.meta.env が存在しない可能性があるため安全にアクセス
|
|
48
|
+
const isDev = typeof import.meta !== 'undefined' && import.meta.env?.DEV;
|
|
49
|
+
if (!isDev) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return (_jsxs("group", { position: position, children: [_jsxs("mesh", { position: [0, 0.375, 0], children: [_jsx("cylinderGeometry", { args: [0.5, 0.5, 0.75, 32, 1, true] }), _jsx("gradientCylinderMaterial", { transparent: true, side: DoubleSide, depthWrite: false })] }), _jsx("group", { rotation: [0, -yawRad, 0], children: _jsxs("group", { rotation: [0, Math.PI, 0], children: [_jsxs("mesh", { position: [0, 0.3, -0.1], rotation: [Math.PI / 2, 0, 0], children: [_jsx("cylinderGeometry", { args: [0.03, 0.03, 0.3, 8] }), _jsx("meshBasicMaterial", { color: "#00ff88" })] }), _jsxs("mesh", { position: [0, 0.3, 0.12], rotation: [Math.PI / 2, 0, 0], children: [_jsx("coneGeometry", { args: [0.08, 0.15, 8] }), _jsx("meshBasicMaterial", { color: "#00ff88" })] })] }) })] }));
|
|
22
53
|
};
|
|
23
54
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/SpawnPoint/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/SpawnPoint/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAEvE,MAAM,wBAAwB,GAAG,cAAc,CAC7C,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;AACrC,gBAAgB;AAChB;;;;;;GAMC;AACD,kBAAkB;AAClB;;;;;;;;GAQC,CACF,CAAA;AAED,MAAM,CAAC,EAAE,wBAAwB,EAAE,CAAC,CAAA;AAepC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAC9C,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,GAAG,GAAG,CAAC,GACR,EAAE,EAAE;IACH,MAAM,EAAE,aAAa,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAChD,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;IAClC,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAA;IAElC,oDAAoD;IACpD,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAA;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,iBAAO,QAAQ,EAAE,QAAQ,aAEvB,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,aAC3B,2BAAkB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAI,EACzD,mCACE,WAAW,QACX,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,KAAK,GACjB,IACG,EAGP,gBAAO,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,YAE9B,iBAAO,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,aAE9B,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAC3D,2BAAkB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAChD,4BAAmB,KAAK,EAAC,SAAS,GAAG,IAChC,EAEP,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAC3D,uBAAc,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAI,EACvC,4BAAmB,KAAK,EAAC,SAAS,GAAG,IAChC,IACD,GACF,IACF,CACT,CAAA;AACH,CAAC,CAAA"}
|