@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;AAG1C,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;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAW1C,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
- return null;
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;AASvE;;;;;;;;;;;;GAYG;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;IAEhD,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,OAAO,IAAI,CAAA;AACb,CAAC,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xrift/world-components",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "Shared components and utilities for Xrift worlds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",