# Class: Scene

场景，系统核心之一。

`Scene`是元素的一种，对应于`xr-scene`标签。
作为整个`xr-frame`组件的根节点，它提供了整个组件运作的一些基本能力，挂在了各大系统，驱动生命周期循环。

## Hierarchy

- [`Element`](Element)

  ↳ **`Scene`**

## Table of contents

### Constructors

- constructor

### Properties

- dataMapping
- defaultComponents
- isScene
- TYPE

### Accessors

- animation
- ar
- assets
- event
- frameHeight
- frameWidth
- gizmo
- height
- id
- inXML
- name
- parent
- physics
- ready
- render
- rootShadow
- scene
- share
- timestamp
- video
- width

### Methods

- addChild
- addComponent
- createEffect
- createElement
- createGeometry
- createImage
- createMaterial
- createPostProcess
- createRenderTexture
- createTexture
- createUniformBlock
- createUniformBlockDesc
- createVertexLayout
- createVideoTexture
- dfs
- getChildAtIndex
- getChildByClass
- getChildByFilter
- getChildByName
- getChildrenByFilter
- getChildrenByName
- getComponent
- getElementById
- getNodeById
- release
- removeChild
- removeComponent
- setAttribute
- setId

## Constructors

### constructor

• **new Scene**(`_type`, `triggerEvent`)

#### Parameters

| Name | Type |
| :------ | :------ |
| `_type` | `string` |
| `triggerEvent` | `TFrameworkEventTrigger` |

#### Inherited from

[Element](Element).[constructor](Element#constructor)

## Properties

### dataMapping

• `Readonly` **dataMapping**: `Object`

`Element`的数据映射。它是为了给组件的属性提供一个方便的用法，比如：
```ts
{
  position: [transform, position]
}
```
就是将`xml`中写在这个`Element`的`position`直接映射到了`transform`组件的`position`属性上。

**通常来讲，所有的驼峰如`nodeId`都会被映射为小写加中划线`node-id`**。

#### Index signature

▪ [key: `string`]: `string`[]

#### Inherited from

[Element](Element).[dataMapping](Element#dataMapping)

___

### defaultComponents

• `Readonly` **defaultComponents**: [`IEntityComponents`](/miniprogram/dev/reference/xr-frame/api/interfaces/IEntityComponents)

`Element`的默认组件集合，详见[IEntityComponents](/miniprogram/dev/reference/xr-frame/api/interfaces/IEntityComponents)。

#### Overrides

[Element](Element).[defaultComponents](Element#defaultComponents)

___

### isScene

• `Readonly` **isScene**: `boolean` = `true`

___

### TYPE

▪ `Static` **TYPE**: `string` = `'element'`

#### Inherited from

[Element](Element).[TYPE](Element#TYPE)

## Accessors

### animation

• `get` **animation**(): [`AnimationSystem`](AnimationSystem)

动画系统。

#### Returns

[`AnimationSystem`](AnimationSystem)

___

### ar

• `get` **ar**(): [`ARSystem`](ARSystem)

AR系统。

#### Returns

[`ARSystem`](ARSystem)

___

### assets

• `get` **assets**(): [`AssetsSystem`](AssetsSystem)

资源系统。

#### Returns

[`AssetsSystem`](AssetsSystem)

___

### event

• `get` **event**(): [`EventManager`](EventManager)

事件管理器。

#### Returns

[`EventManager`](EventManager)

___

### frameHeight

• `get` **frameHeight**(): `number`

显示分辨率高。

#### Returns

`number`

___

### frameWidth

• `get` **frameWidth**(): `number`

显示分辨率宽。

#### Returns

`number`

___

### gizmo

• `get` **gizmo**(): [`GizmoSystem`](GizmoSystem)

Gizmo系统。

#### Returns

[`GizmoSystem`](GizmoSystem)

___

### height

• `get` **height**(): `number`

渲染分辨率高，一般物理点击事件之类的都是参考这个。

#### Returns

`number`

___

### id

• `get` **id**(): `string`

写在`xml`上的那个`id`，要求唯一。

#### Returns

`string`

___

### inXML

• `get` **inXML**(): `boolean`

元素是否在`xml`中，若是`xr-shadow`下的节点，则为`false`。

#### Returns

`boolean`

___

### name

• `get` **name**(): `string`

名字，写在`xml`上的那个`name`，不唯一。

#### Returns

`string`

• `set` **name**(`value`): `void`

名字，写在`xml`上的那个`name`，不唯一。

#### Parameters

| Name | Type |
| :------ | :------ |
| `value` | `string` |

#### Returns

`void`

___

### parent

• `get` **parent**(): [`Element`](Element)

父元素。

#### Returns

[`Element`](Element)

___

### physics

• `get` **physics**(): [`PhysicsSystem`](PhysicsSystem)

物理系统。

#### Returns

[`PhysicsSystem`](PhysicsSystem)

___

### ready

• `get` **ready**(): `boolean`

场景是否已经就绪。

#### Returns

`boolean`

___

### render

• `get` **render**(): [`RenderSystem`](RenderSystem)

渲染系统。

#### Returns

[`RenderSystem`](RenderSystem)

___

### rootShadow

• `get` **rootShadow**(): [`XRShadow`](XRShadow)

一个可以用于快速挂载自己创建的`Element`的`shadow`节点。

#### Returns

[`XRShadow`](XRShadow)

___

### scene

• `get` **scene**(): `this`

自身。

#### Returns

`this`

___

### share

• `get` **share**(): [`ShareSystem`](ShareSystem)

分享系统。

#### Returns

[`ShareSystem`](ShareSystem)

___

### timestamp

• `get` **timestamp**(): `number`

当前时间戳(ms)。

#### Returns

`number`

___

### video

• `get` **video**(): [`VideoSystem`](VideoSystem)

视频系统。

#### Returns

[`VideoSystem`](VideoSystem)

___

### width

• `get` **width**(): `number`

渲染分辨率宽，一般物理点击事件之类的都是参考这个。

#### Returns

`number`

## Methods

### addChild

▸ **addChild**(`child`): `void`

手动添加一个子节点，**注意需要保证当前节点是`xr-shadow`或其子节点**。

#### Parameters

| Name | Type |
| :------ | :------ |
| `child` | [`Element`](Element) |

#### Returns

`void`

#### Inherited from

[Element](Element).[addChild](Element#addChild)

___

### addComponent

▸ **addComponent**(`clz`, `options?`): `T`

手动添加一个`Component`。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Component`](Component) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `clz` | () => `T` |
| `options?` | `T`[``"__DATA_TYPE"``] |

#### Returns

`T`

#### Inherited from

[Element](Element).[addComponent](Element#addComponent)

___

### createEffect

▸ **createEffect**(`description`): [`Effect`](Effect)

手动创建一个`Effect`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `description` | [`IEffectAsset`](/miniprogram/dev/reference/xr-frame/api/interfaces/IEffectAsset) |

#### Returns

[`Effect`](Effect)

___

### createElement

▸ **createElement**(`clz`, `attributes?`): `T`

创建一个`Element`，但注意**其只能作为`xr-shadow`的子孙节点**，否则可能会出错！

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Element`](Element) |

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `clz` | (...`args`: `any`) => `T` | - |
| `attributes?` | `Object` | 初始化的属性，同于`xml`中对应的标签属性。 |

#### Returns

`T`

___

### createGeometry

▸ **createGeometry**(`vertexLayout`, `vBuffer`, `iBuffer`, `indexType?`): [`Geometry`](Geometry)

手动创建一个`Geometry`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `vertexLayout` | `default` |
| `vBuffer` | `ArrayBufferView` |
| `iBuffer` | `ArrayBufferView` |
| `indexType?` | [`EIndexType`](/miniprogram/dev/reference/xr-frame/api/enums/EIndexType) |

#### Returns

[`Geometry`](Geometry)

___

### createImage

▸ **createImage**(`autoRelease?`): [`IImage`](/miniprogram/dev/reference/xr-frame/api/interfaces/IImage)

手动创建一个`Image`资源。

#### Parameters

| Name | Type | Default value | Description |
| :------ | :------ | :------ | :------ |
| `autoRelease` | `boolean` | `true` | 此图片在第一次时候后是否释放原始数据，默认释放。 |

#### Returns

[`IImage`](/miniprogram/dev/reference/xr-frame/api/interfaces/IImage)

___

### createMaterial

▸ **createMaterial**(`effect`, `defaultUniforms?`): [`Material`](Material)

手动创建一个`Material`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `effect` | [`Effect`](Effect) |
| `defaultUniforms?` | `Object` |

#### Returns

[`Material`](Material)

___

### createPostProcess

▸ **createPostProcess**(`options`): [`PostProcess`](PostProcess)

手动创建一个`PostProcess`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options` | [`IPostProcessOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/IPostProcessOptions) |

#### Returns

[`PostProcess`](PostProcess)

___

### createRenderTexture

▸ **createRenderTexture**(`options?`): [`RenderTexture`](RenderTexture)

手动创建一个`RenderTexture`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options?` | [`IRenderTextureOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/IRenderTextureOptions) |

#### Returns

[`RenderTexture`](RenderTexture)

___

### createTexture

▸ **createTexture**(`options`): `default`

手动创建一个`Texture`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options` | [`ITextureOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/ITextureOptions) |

#### Returns

`default`

___

### createUniformBlock

▸ **createUniformBlock**(`descriptor`): `default`

手动创建一个`UniformBlock`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `descriptor` | `default` |

#### Returns

`default`

___

### createUniformBlockDesc

▸ **createUniformBlockDesc**(`options`): `default`

手动创建一个`UniformBlockDescriptor`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options` | [`IUniformDescriptorOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/IUniformDescriptorOptions) |

#### Returns

`default`

___

### createVertexLayout

▸ **createVertexLayout**(`options`): `default`

手动创建一个`VertexLayout`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options` | [`IVertexLayoutOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/IVertexLayoutOptions) |

#### Returns

`default`

___

### createVideoTexture

▸ **createVideoTexture**(`options?`): `Promise`

手动创建一个`VideoTexture`资源。

#### Parameters

| Name | Type |
| :------ | :------ |
| `options?` | [`IVideoTextureOptions`](/miniprogram/dev/reference/xr-frame/api/interfaces/IVideoTextureOptions) |

#### Returns

`Promise`

___

### dfs

▸ **dfs**(`callback`, `defaultParams?`, `excludeRoot?`, `stop?`): `void`

递归遍历元素的所有子孙节点。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends `unknown` |

#### Parameters

| Name | Type |
| :------ | :------ |
| `callback` | (`element`: [`Element`](Element), `params?`: `T`) => `T` |
| `defaultParams?` | `T` |
| `excludeRoot?` | `boolean` |
| `stop` | (`element`: [`Element`](Element), `params?`: `T`) => `boolean` |

#### Returns

`void`

#### Inherited from

[Element](Element).[dfs](Element#dfs)

___

### getChildAtIndex

▸ **getChildAtIndex**(`index`): `T`

获取第`index`个子元素。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Element`](Element) = [`Element`](Element) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `index` | `number` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getChildAtIndex](Element#getChildAtIndex)

___

### getChildByClass

▸ **getChildByClass**(`clz`): `T`

通过元素的类获取子元素。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Element`](Element) = [`Element`](Element) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `clz` | (...`args`: `any`[]) => `T` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getChildByClass](Element#getChildByClass)

___

### getChildByFilter

▸ **getChildByFilter**(`filter`): `T`

通过`filter`获取子元素。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Element`](Element) = [`Element`](Element) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `filter` | (`child`: [`Element`](Element)) => `boolean` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getChildByFilter](Element#getChildByFilter)

___

### getChildByName

▸ **getChildByName**(`name`): `T`

通过元素的名字`name`获取子元素。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Element`](Element) = [`Element`](Element) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `name` | `string` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getChildByName](Element#getChildByName)

___

### getChildrenByFilter

▸ **getChildrenByFilter**(`filter`): [`Element`](Element)[]

通过`filter`获取子元素列表。

#### Parameters

| Name | Type |
| :------ | :------ |
| `filter` | (`child`: [`Element`](Element)) => `boolean` |

#### Returns

[`Element`](Element)[]

#### Inherited from

[Element](Element).[getChildrenByFilter](Element#getChildrenByFilter)

___

### getChildrenByName

▸ **getChildrenByName**(`name`): [`Element`](Element)[]

通过元素的名字`name`获取子元素们。

#### Parameters

| Name | Type |
| :------ | :------ |
| `name` | `string` |

#### Returns

[`Element`](Element)[]

#### Inherited from

[Element](Element).[getChildrenByName](Element#getChildrenByName)

___

### getComponent

▸ **getComponent**(`clzName`): `T`

获取一个`Component`，可以使用类或者名字获取。

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Component`](Component) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `clzName` | `string` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getComponent](Element#getComponent)

▸ **getComponent**(`clz`): `T`

#### Type parameters

| Name | Type |
| :------ | :------ |
| `T` | extends [`Component`](Component) |

#### Parameters

| Name | Type |
| :------ | :------ |
| `clz` | () => `T` |

#### Returns

`T`

#### Inherited from

[Element](Element).[getComponent](Element#getComponent)

___

### getElementById

▸ **getElementById**(`id`): [`Element`](Element)

通过在`wxml`的元素上设置的`id`索引一个元素，`id`是唯一的。

#### Parameters

| Name | Type |
| :------ | :------ |
| `id` | `string` |

#### Returns

[`Element`](Element)

___

### getNodeById

▸ **getNodeById**(`nodeId`): [`Transform`](Transform)

通过在`wxml`的元素上设置的`node-id`索引一个`Transform`组件，`node-id`是唯一的。

#### Parameters

| Name | Type |
| :------ | :------ |
| `nodeId` | `string` |

#### Returns

[`Transform`](Transform)

___

### release

▸ **release**(): `void`

仅限自己创建的节点使用，否则后果自负。

#### Returns

`void`

#### Inherited from

[Element](Element).[release](Element#release)

___

### removeChild

▸ **removeChild**(`child`): `void`

手动移除一个子节点，**注意需要保证当前节点是`xr-shadow`或其子节点**。
**只调用removeChild没有办法走进子节点的onRelease里**，需要手动调用子节点的release才行。

#### Parameters

| Name | Type |
| :------ | :------ |
| `child` | [`Element`](Element) |

#### Returns

`void`

#### Inherited from

[Element](Element).[removeChild](Element#removeChild)

___

### removeComponent

▸ **removeComponent**(`clz`): `void`

手动移除一个`Component`，注意保证其不在`xml`上。

#### Parameters

| Name | Type |
| :------ | :------ |
| `clz` | () => [`Component`](Component) |

#### Returns

`void`

#### Inherited from

[Element](Element).[removeComponent](Element#removeComponent)

___

### setAttribute

▸ **setAttribute**(`name`, `value`): `void`

设置一个属性，对应于`xml`标签中的那些属性，值为字符串。
**一般建议使用`component`的`setData`方法**！！！

#### Parameters

| Name | Type |
| :------ | :------ |
| `name` | `string` |
| `value` | `string` |

#### Returns

`void`

#### Inherited from

[Element](Element).[setAttribute](Element#setAttribute)

___

### setId

▸ **setId**(`id`): `void`

仅限自己创建的节点使用，否则后果自负。

#### Parameters

| Name | Type |
| :------ | :------ |
| `id` | `string` |

#### Returns

`void`

#### Inherited from

[Element](Element).[setId](Element#setId)
