diff --git a/.editorconfig b/.editorconfig index 83ffe4cde..b8fb7609b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,6 +10,7 @@ quote_type = double insert_final_newline = true tab_width = 4 trim_trailing_whitespace = true +max_line_length = 120 [*.py] spaces_around_brackets = none diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..ef40a1e26 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +tests/samples/* filter=lfs diff=lfs merge=lfs -text +UnityPy/resources/* filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c06c9cc8b..700306b52 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -58,6 +58,9 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + submodules: recursive + lfs: true # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 88ae37c6d..cd917a79c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + lfs: true - name: Set up Python uses: actions/setup-python@v5 @@ -19,7 +20,7 @@ jobs: - name: Build sdist run: pipx run build --sdist - + - name: Install sdist run: pip install dist/*.tar.gz @@ -27,7 +28,7 @@ jobs: with: name: "sdist" path: dist/*.tar.gz - + build_wheels: name: Build wheels on ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -41,19 +42,20 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - + lfs: true + - name: Build wheels - uses: joerick/cibuildwheel@v2.21.2 + uses: joerick/cibuildwheel@v3.3 env: CIBW_TEST_SKIP: "*" CIBW_SKIP: "pp*" - + - uses: actions/upload-artifact@v4 with: name: "${{ matrix.os }}" path: ./wheelhouse/*.whl retention-days: 1 - + build_manylinux_wheels_ubuntu: name: Build manylinux wheels on ubuntu-latest runs-on: ubuntu-latest @@ -63,6 +65,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + lfs: true - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -70,7 +73,7 @@ jobs: platforms: all - name: Build wheels - uses: joerick/cibuildwheel@v2.21.2 + uses: joerick/cibuildwheel@v3.3 env: CIBW_TEST_SKIP: "*" CIBW_SKIP: "pp* *-musllinux*" @@ -90,6 +93,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + lfs: true - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -97,11 +101,11 @@ jobs: platforms: all - name: Build wheels - uses: joerick/cibuildwheel@v2.21.2 + uses: joerick/cibuildwheel@v3.3 env: CIBW_TEST_SKIP: "*" CIBW_SKIP: "pp* *-manylinux*" - # fmod requires: + # fmod requires: # default via musl: -exclude flag # libdl.so.2 => /lib/ld-musl-x86_64.so.1 (0x7faeb127d000) # librt.so.1 => /lib/ld-musl-x86_64.so.1 (0x7faeb127d000) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 498aa615f..d322f25de 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,9 @@ name: Test on: - push + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] jobs: build_wheels: @@ -9,11 +12,14 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest] steps: - uses: actions/checkout@v4 - + with: + submodules: recursive + lfs: true + - name: Set up Python uses: actions/setup-python@v5 with: @@ -22,5 +28,13 @@ jobs: - name: Install run: pip install .[tests] + - uses: astral-sh/ruff-action@v3 + + - name: Check code (ruff check) + run: ruff check + + - name: Check code style (ruff format) + run: ruff format --check + - name: Run tests run: python -m pytest -vs ./tests diff --git a/.gitignore b/.gitignore index b1405525c..85f418724 100644 --- a/.gitignore +++ b/.gitignore @@ -2,18 +2,15 @@ test.py AssetStudio/ .vscode/ - +uv.lock # Byte-compiled / optimized / DLL files __pycache__/ -.dump -.idea/ -*.py[cod] +*.py[codz] *$py.class -# precompiled C extensions -UnityPy/*.so -UnityPy/*.pyd +# C extensions +*.so # Distribution / packaging .Python @@ -23,18 +20,21 @@ dist/ downloads/ eggs/ .eggs/ +lib/ +lib64/ parts/ sdist/ var/ wheels/ +share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec @@ -45,14 +45,18 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ +.nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover +*.py.cover +*.lcov .hypothesis/ .pytest_cache/ +cover/ # Translations *.mo @@ -62,6 +66,7 @@ coverage.xml *.log local_settings.py db.sqlite3 +db.sqlite3-journal # Flask stuff: instance/ @@ -74,22 +79,85 @@ instance/ docs/_build/ # PyBuilder +.pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints -# pyenv -.python-version +# IPython +profile_default/ +ipython_config.py -# celery beat schedule file -celerybeat-schedule +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +# Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +# poetry.lock +# poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +# pdm.lock +# pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +# pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi/* +!.pixi/config.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule* +celerybeat.pid + +# Redis +*.rdb +*.aof +*.pid + +# RabbitMQ +mnesia/ +rabbitmq/ +rabbitmq-data/ + +# ActiveMQ +activemq-data/ # SageMath parsed files *.sage.py # Environments .env +.envrc .venv env/ venv/ @@ -109,3 +177,50 @@ venv.bak/ # mypy .mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +# .idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ +# Temporary file for partial code execution +tempCodeRunnerFile.py + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.toml diff --git a/LICENSE b/LICENSE index 6bc7be1f7..bf224f947 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-2021 K0lb3 +Copyright (c) 2019-2026 K0lb3 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 7ea71e26d..baf92789d 100644 --- a/README.md +++ b/README.md @@ -8,22 +8,28 @@ A Unity asset extractor for Python based on [AssetStudio](https://github.com/Perfare/AssetStudio). -Next to extraction, it also supports editing Unity assets. -So far following obj types can be edited: +Next to extraction, UnityPy also supports editing Unity assets. +Via the typetree structure all object types can be edited in their native forms. -- Texture2D -- Sprite(indirectly via linked Texture2D) -- TextAsset -- MonoBehaviour (and all other types that you have the typetree of) +```python +# modification via dict: + raw_dict = obj.parse_as_dict() + # modify raw dict + obj.patch(raw_dict) +# modification via parsed class + instance = obj.parse_as_object() + # modify instance + obj.patch(instance) +``` If you need advice or if you want to talk about (game) data-mining, feel free to join the [UnityPy Discord](https://discord.gg/C6txv7M). -If you're using UnityPy a commercial project, +If you're using UnityPy for a commercial project, a donation to a charitable cause or a sponsorship of this project is expected. -**As UnityPy is still in active development breaking changes can happen.** -Those changes are usually limited to minor versions (x.y) and not to patch versions (x.y.z). +**As UnityPy is still in active development, breaking changes can happen.** +These changes are usually limited to minor versions (x.y) and not to patch versions (x.y.z). So in case that you don't want to actively maintain your project, make sure to make a note of the used UnityPy version in your README or add a check in your code. e.g. @@ -37,22 +43,22 @@ if UnityPy.__version__ != '1.9.6': 2. [Example](#example) 3. [Important Classes](#important-classes) 4. [Important Object Types](#important-object-types) -5. [Custom Fileystem](#custom-filesystem) +5. [Configurations](#configurations) 6. [Credits](#credits) ## Installation -**Python 3.7.0 or higher is required** +**Python 3.8 or higher is required.** -via pypi +Install via PyPI: -```cmd +```bash pip install UnityPy ``` -from source +Install from source code: -```cmd +```bash git clone https://github.com/K0lb3/UnityPy.git cd UnityPy python -m pip install . @@ -65,17 +71,12 @@ python -m pip install . Visual C++ Redistributable is required for the brotli dependency. In case a new(ish) Python version is used, it can happen that the C-dependencies of UnityPy might not be precompiled for this version. In such cases the user either has to report this as issue or follow the steps of [this issue](https://github.com/K0lb3/UnityPy/issues/223) to compile it oneself. -Another option for the user is downgrading Python to the latest version supported by UnityPy. For this see the python version badge at the top of the README. +Another option for the user is downgrading Python to the latest version supported by UnityPy. For this see the Python version badge at the top of the README. -### Crash without warning/error +#### Crash without warning/error -The C-implementation of the typetree reader can directly crash python. -In case this happens, the usage of the C-typetree reader can be disabled by adding these two lines to your main file. - -```python -from UnityPy.helpers import TypeTreeHelper -TypeTreeHelper.read_typetree_boost = False -``` +The C-implementation of the typetree reader can directly crash Python. +In case this happens, the usage of the C-typetree reader can be disabled. Read [this section](#disable-typetree-c-implementation) for more details. ## Example @@ -85,7 +86,7 @@ The following is a simple example. import os import UnityPy -def unpack_all_assets(source_folder : str, destination_folder : str): +def unpack_all_assets(source_folder: str, destination_folder: str): # iterate over all files in source folder for root, dirs, files in os.walk(source_folder): for file_name in files: @@ -99,10 +100,10 @@ def unpack_all_assets(source_folder : str, destination_folder : str): # process specific object types if obj.type.name in ["Texture2D", "Sprite"]: # parse the object data - data = obj.read() + data = obj.parse_as_object() # create destination path - dest = os.path.join(destination_folder, data.name) + dest = os.path.join(destination_folder, data.m_Name) # make sure that the extension is correct # you probably only want to do so with images/textures @@ -115,7 +116,7 @@ def unpack_all_assets(source_folder : str, destination_folder : str): # alternative way which keeps the original path for path,obj in env.container.items(): if obj.type.name in ["Texture2D", "Sprite"]: - data = obj.read() + data = obj.parse_as_object() # create dest based on original path dest = os.path.join(destination_folder, *path.split("/")) # make sure that the dir of that path exists @@ -129,24 +130,19 @@ def unpack_all_assets(source_folder : str, destination_folder : str): You probably have to read [Important Classes](#important-classes) and [Important Object Types](#important-object-types) to understand how it works. -People with slightly advanced python skills should look at [UnityPy/tools/extractor.py](UnityPy/tools/extractor.py) for a more advanced example. +Users with slightly advanced Python skills should look at [UnityPy/tools/extractor.py](UnityPy/tools/extractor.py) for a more advanced example. It can also be used as a general template or as an importable tool. -### Setting the decryption key for Unity CN's AssetBundle encryption - -The chinese version of Unity has its own inbuild option to encrypt AssetBundles/BundleFiles. As it's a feature of Unity itself, and not a game specific protection, it is included in UnityPy as well. -To enable encryption simply use `UnityPy.set_assetbundle_decrypt_key(key)`, with key being the value that the game that loads the budles passes to `AssetBundle.SetAssetBundleDecryptKey`. - ## Important Classes -### [Environment](UnityPy/environment.py) +### Environment -Environment loads and parses the given files. +[Environment](UnityPy/environment.py) loads and parses the given files. It can be initialized via: - a file path - apk files can be loaded as well - a folder path - loads all files in that folder (bad idea for folders with a lot of files) -- a stream - e.g., io.BytesIO, file stream,... +- a stream - e.g., `io.BytesIO`, file stream,... - a bytes object - will be loaded into a stream UnityPy can detect if the file is a WebFile, BundleFile, Asset, or APK. @@ -178,26 +174,70 @@ with open(dst, "wb") as f: f.write(env.file.save()) ``` -### [Asset](UnityPy/files/SerializedFile.py) +### Asset -Assets are a container that contains multiple objects. +Assets \([SerializedFile class](UnityPy/files/SerializedFile.py)\) are a container that contains multiple objects. One of these objects can be an AssetBundle, which contains a file path for some of the objects in the same asset. All objects can be found in the `.objects` dict - `{ID : object}`. The objects with a file path can be found in the `.container` dict - `{path : object}`. -### [Object](UnityPy/files/ObjectReader.py) +### Object + +Objects \([ObjectReader class](UnityPy/files/ObjectReader.py)\) contain the _actual_ files, e.g., textures, text files, meshes, settings, ... + +To acquire the actual data of an object it has to be parsed first. +This happens via the parse functions mentioned below. +This isn't done automatically to save time as only a small part of the objects are usually of interest. +Serialized objects can be set with raw data using `.set_raw_data(data)` or modified with `.save()` function, if supported. + +For object types with ``m_Name`` you can use ``.peek_name()`` to only read the name of the parsed object without parsing it completely, which is way faster. -Objects contain the _actual_ files, e.g., textures, text files, meshes, settings, ... +There are two general parsing functions, ``.parse_as_object()`` and ``.parse_as_dict()``. +``parse_as_dict`` parses the object data into a dict. +``parse_as_object`` parses the object data into a class. If the class is a Unity class, it's stub class from ``UnityPy.classes(.generated)`` will be used, if it's an unknown one, then it will be parsed into an ``UnknownObject``, which simply acts as interface for the otherwise parsed dict. +Some special classes, namely those below, have additional handlers added to their class for easier interaction with them. + +The ``.patch(item)`` function can be used on all object (readers) to replace their data with the changed item, which has to be either a dict or of the class the object represents. + +#### Example + +```py +for obj in env.objects: + if obj.type.name == "the type you want": + if obj.peek_name() != "the specific object you want": + continue + # parsing + instance = obj.parse_as_object() + dic = obj.parse_as_dict() + + # modifying + instance.m_Name = "new name" + dic["m_Name"] = "new name" + + # saving + obj.patch(instance) + obj.patch(dic) +``` + +#### Legacy + +Following functions are legacy functions that will be removed in the future when major version 2 hits. +The modern versions are equivalent to them and have a more correct type hints. + +| Legacy | Modern | +|---------------|-----------------| +| read | parse_as_object | +| read_typetree | parse_as_dict | +| save_typetree | patch | -To acquire the actual data of an object it has to be read first. This happens via the `.read()` function. This isn't done automatically to save time because only a small part of the objects are of interest. Serialized objects can be set with raw data using `.set_raw_data(data)` or modified with `.save()` function, if supported. ## Important Object Types -All object types can be found in [UnityPy/classes](UnityPy/classes/). +Now UnityPy uses [auto generated classes](UnityPy/classes/generated.py) with some useful extension methods and properties defined in [legacy_patch](UnityPy/classes/legacy_patch/). You can search for a specific classes in the module `UnityPy.classes` with your IDE's autocompletion. -### [Texture2D](UnityPy/classes/Texture2D.py) +### Texture2D - `.m_Name` - `.image` converts the texture into a `PIL.Image` @@ -211,17 +251,17 @@ from PIL import Image for obj in env.objects: if obj.type.name == "Texture2D": # export texture - data = obj.read() - path = os.path.join(export_dir, f"{data.m_Name}.png") - data.image.save(path) + tex = obj.parse_as_object() + path = os.path.join(export_dir, f"{tex.m_Name}.png") + tex.image.save(path) # edit texture - fp = os.path.join(replace_dir, f"{data.m_Name}.png") + fp = os.path.join(replace_dir, f"{tex.m_Name}.png") pil_img = Image.open(fp) - data.image = pil_img - data.save() + tex.image = pil_img + tex.save() ``` -### [Sprite](UnityPy/classes/Sprite.py) +### Sprite Sprites are part of a texture and can have a separate alpha-image as well. Unlike most other extractors (including AssetStudio), UnityPy merges those two images by itself. @@ -236,19 +276,21 @@ Unlike most other extractors (including AssetStudio), UnityPy merges those two i ```python for obj in env.objects: if obj.type.name == "Sprite": - data = obj.read() - path = os.path.join(export_dir, f"{data.m_Name}.png") - data.image.save(path) + sprite = obj.parse_as_object() + path = os.path.join(export_dir, f"{sprite.m_Name}.png") + sprite.image.save(path) ``` -### [TextAsset](UnityPy/classes/TextAsset.py) +### TextAsset TextAssets are usually normal text files. - `.m_Name` - `.m_Script` - str -Some games save binary data as TextFile, so to convert the ``str`` back to bytes correctly ``m_Script.encode("utf-8", "surrogateescape")`` has to be used. +Some games save binary data as TextAssets. +As ``m_Script`` gets handled as str by default, +use ``m_Script.encode("utf-8", "surrogateescape")`` to retrieve the original binary data. **Export** @@ -256,26 +298,26 @@ Some games save binary data as TextFile, so to convert the ``str`` back to bytes for obj in env.objects: if obj.type.name == "TextAsset": # export asset - data = obj.read() - path = os.path.join(export_dir, f"{data.m_Name}.txt") + txt = obj.parse_as_object() + path = os.path.join(export_dir, f"{txt.m_Name}.txt") with open(path, "wb") as f: - f.write(data.m_Script.encode("utf-8", "surrogateescape")) + f.write(txt.m_Script.encode("utf-8", "surrogateescape")) # edit asset - fp = os.path.join(replace_dir, f"{data.m_Name}.txt") + fp = os.path.join(replace_dir, f"{txt.m_Name}.txt") with open(fp, "rb") as f: - data.m_Script = f.read().decode("utf-8", "surrogateescape")) - data.save() + txt.m_Script = f.read().decode("utf-8", "surrogateescape") + txt.save() ``` -### [MonoBehaviour](UnityPy/classes/MonoBehaviour.py) +### MonoBehaviour MonoBehaviour assets are usually used to save the class instances with their values. -If a type tree exists, it can be used to read the whole data, -but if it doesn't exist, then it is usually necessary to investigate the class that loads the specific MonoBehaviour to extract the data. -([example](examples/CustomMonoBehaviour/get_scriptable_texture.py)) +The structure/typetree for these classes might not be contained in the asset files. +In such cases see the 2nd example (TypeTreeGenerator) below. - `.m_Name` - `.m_Script` +- custom data **Export** @@ -285,25 +327,52 @@ import json for obj in env.objects: if obj.type.name == "MonoBehaviour": # export - if obj.serialized_type.node: - # save decoded data - tree = obj.read_typetree() - fp = os.path.join(extract_dir, f"{tree['m_Name']}.json") - with open(fp, "wt", encoding = "utf8") as f: - json.dump(tree, f, ensure_ascii = False, indent = 4) + # save decoded data + tree = obj.parse_as_dict() + fp = os.path.join(extract_dir, f"{tree['m_Name']}.json") + with open(fp, "wt", encoding = "utf8") as f: + json.dump(tree, f, ensure_ascii = False, indent = 4) # edit - if obj.serialized_type.node: - tree = obj.read_typetree() - # apply modifications to the data within the tree - obj.save_typetree(tree) - else: - data = obj.read(check_read=False) - with open(os.path.join(replace_dir, data.m_Name)) as f: - data.save(raw_data = f.read()) + tree = obj.parse_as_dict() + # apply modifications to the data within the tree + obj.patch(tree) +``` + +**TypeTreeGenerator** + +UnityPy can generate the typetrees of MonoBehaviours from the game assemblies using an optional package, ``TypeTreeGeneratorAPI``, which has to be installed via pip. +UnityPy will automatically try to generate the typetree of MonoBehaviours if the typetree is missing in the assets and ``env.typetree_generator`` is set. + +```python +import UnityPy +from UnityPy.helpers.TypeTreeGenerator import TypeTreeGenerator + +# create generator +GAME_ROOT_DIR: str +# e.g. r"D:\Program Files (x86)\Steam\steamapps\common\Aethermancer Demo" +GAME_UNITY_VERSION: str +# you can get the version via an object +# e.g. objects[0].assets_file.unity_version + +generator = TypeTreeGenerator(GAME_UNITY_VERSION) +generator.load_local_game(GAME_ROOT_DIR) +# generator.load_local_game(root_dir: str) - for a Windows game +# generator.load_dll_folder(dll_dir: str) - for mono / non-il2cpp or generated dummies +# generator.load_dll(dll: bytes) +# generator.load_il2cpp(il2cpp: bytes, metadata: bytes) + +env = UnityPy.load(fp) +# assign generator to env +env.typetree_generator = generator +for obj in objects: + if obj.type.name == "MonoBehaviour": + # automatically tries to use the generator in the background if necessary + x = obj.parse_as_object() ``` -### [AudioClip](UnityPy/classes/AudioClip.py) + +### AudioClip - `.samples` - `{sample-name : sample-data}` @@ -311,17 +380,19 @@ The samples are converted into the .wav format. The sample data is a .wav file in bytes. ```python -clip : AudioClip +clip: AudioClip for name, data in clip.samples.items(): with open(name, "wb") as f: f.write(data) ``` -### [Font](UnityPy/classes/Font.py) +### Font + +**Export** ```python if obj.type.name == "Font": - font : Font = obj.read() + font: Font = obj.parse_as_object() if font.m_FontData: extension = ".ttf" if font.m_FontData[0:4] == b"OTTO": @@ -331,14 +402,14 @@ if obj.type.name == "Font": f.write(font.m_FontData) ``` -### [Mesh](UnityPy/classes/Mesh.py) +### Mesh - `.export()` - mesh exported as .obj (str) The mesh will be converted to the Wavefront .obj file format. ```python -mesh : Mesh +mesh: Mesh with open(f"{mesh.m_Name}.obj", "wt", newline = "") as f: # newline = "" is important f.write(mesh.export()) @@ -353,17 +424,18 @@ ALPHA-VERSION The mesh and materials will be in the Wavefront formats. ```python -mesh_renderer : Renderer +mesh_renderer: Renderer export_dir: str if mesh_renderer.m_GameObject: # get the name of the model - game_object = mesh_renderer.m_GameObject.read() - export_dir = os.path.join(export_dir, game_object.m_Name) + game_obj_reader = mesh_renderer.m_GameObject.deref() + game_obj_name = game_obj_reader.peek_name() + export_dir = os.path.join(export_dir, game_obj_name) mesh_renderer.export(export_dir) ``` -### [Texture2DArray](UnityPy/classes/Texture2DArray.py) +### Texture2DArray WARNING - not well tested @@ -380,13 +452,61 @@ from PIL import Image for obj in env.objects: if obj.type.name == "Texture2DArray": # export texture - data = obj.read() - for i, image in enumerate(data.images): - image.save(os.path.join(path, f"{data.m_Name}_{i}.png")) + tex_arr = obj.parse_as_object() + for i, image in enumerate(tex_arr.images): + image.save(os.path.join(path, f"{tex_arr.m_Name}_{i}.png")) # editing isn't supported yet! ``` -## Custom-Filesystem +## Configurations + +There're several configurations and interfaces that provide the customizability to UnityPy. + +### Unity CN Decryption + +The Chinese version of Unity has its own builtin option to encrypt AssetBundles/BundleFiles. As it's a feature of Unity itself, and not a game specific protection, it is included in UnityPy as well. +To enable encryption simply use the code as follow, with `key` being the value that the game that loads the bundles passes to `AssetBundle.SetAssetBundleDecryptKey`. + +```python +import UnityPy +UnityPy.set_assetbundle_decrypt_key(key) +``` + +### Unity Fallback Version + +In case UnityPy failed to detect the Unity version of the game assets, you can set a fallback version. e.g. + +```python +import UnityPy.config +UnityPy.config.FALLBACK_UNITY_VERSION = "2.5.0f5" +``` + +### Disable Typetree C-Implementation + +The [C-implementation](UnityPyBoost/) of typetree reader can boost the parsing of typetree by a lot. If you want to disable it and use pure Python reader, you can put the following 2 lines in your main file. + +```python +from UnityPy.helpers import TypeTreeHelper +TypeTreeHelper.read_typetree_boost = False +``` + +### Custom Block (De)compression + +Some game assets have non-standard compression/decompression algorithm applied on the block data. If you wants to customize the compression/decompression function, you can modify the corresponding function mapping. e.g. + +```python +from UnityPy.enums.BundleFile import CompressionFlags +flag = CompressionFlags.LZHAM + +from UnityPy.helpers import CompressionHelper +CompressionHelper.COMPRESSION_MAP[flag] = custom_compress +CompressionHelper.DECOMPRESSION_MAP[flag] = custom_decompress +``` + +- `custom_compress(data: bytes) -> bytes` (where bytes can also be bytearray or memoryview) +- `custom_decompress(data: bytes, uncompressed_size: int) -> bytes` + +### Custom Filesystem UnityPy uses [fsspec](https://github.com/fsspec/filesystem_spec) under the hood to manage all filesystem interactions. This allows using various different types of filesystems without having to change UnityPy's code. @@ -394,24 +514,23 @@ It also means that you can use your own custom filesystem to e.g. handle indirec Following methods of the filesystem have to be implemented for using it in UnityPy. -- sep (not a function, just the seperator as character) -- isfile(self, path: str) -> bool -- isdir(self, path: str) -> bool -- exists(self, path: str, \*\*kwargs) -> bool -- walk(self, path: str, \*\*kwargs) -> Iterable[List[str], List[str], List[str]] -- open(self, path: str, mode: str = "rb", \*\*kwargs) -> file ("rb" mode required, "wt" required for ModelExporter) -- makedirs(self, path: str, exist_ok: bool = False) -> bool +- `sep` (not a function, just the separator as character) +- `isfile(self, path: str) -> bool` +- `isdir(self, path: str) -> bool` +- `exists(self, path: str, **kwargs) -> bool` +- `walk(self, path: str, **kwargs) -> Iterable[List[str], List[str], List[str]]` +- `open(self, path: str, mode: str = "rb", **kwargs) -> file` ("rb" mode required, "wt" required for ModelExporter) +- `makedirs(self, path: str, exist_ok: bool = False) -> bool` ## Credits First of all, thanks a lot to all contributors of UnityPy and all of its users. -Also, -many thanks to: +Also, many thanks to: - [Perfare](https://github.com/Perfare) for creating and maintaining and every contributor of [AssetStudio](https://github.com/Perfare/AssetStudio) - [ds5678](https://github.com/ds5678) for the [TypeTreeDumps](https://github.com/AssetRipper/TypeTreeDumps) and the [custom minimal Tpk format](https://github.com/AssetRipper/Tpk) - [Razmoth](https://github.com/Razmoth) for figuring out and sharing Unity CN's AssetBundle decryption ([src](https://github.com/Razmoth/PGRStudio)). - [nesrak1](https://github.com/nesrak1) for figuring out the [Switch texture swizzling](https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs) -- xiop_13690 (discord) for figuring out unsolved issues of the ManagedReferencesRegistry \ No newline at end of file +- xiop_13690 (discord) for figuring out unsolved issues of the ManagedReferencesRegistry diff --git a/UnityPy/UnityPyBoost.pyi b/UnityPy/UnityPyBoost.pyi index b7daec1b1..34ac0b86c 100644 --- a/UnityPy/UnityPyBoost.pyi +++ b/UnityPy/UnityPyBoost.pyi @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, List, Optional, Union +from typing import TYPE_CHECKING, Any, List, Literal, Optional, Tuple, Union if TYPE_CHECKING: from .classes import Object @@ -8,6 +8,7 @@ if TYPE_CHECKING: def unpack_vertexdata( data: Union[bytes, bytearray], + component_byte_size: int, vertex_count: int, stream_offset: int, stream_stride: int, @@ -18,11 +19,11 @@ def unpack_vertexdata( def read_typetree( data: Union[bytes, bytearray], node: TypeTreeNode, - endian: Union["<", ">"], + endian: Literal["<", ">"], as_dict: bool, assetsfile: SerializedFile, classes: dict, -) -> Union[dict[str, Any], Object]: ... +) -> Tuple[Union[dict[str, Any], Object], int]: ... class TypeTreeNode: m_Level: int diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 713d01dfd..44828896e 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,14 +1,11 @@ -__version__ = "1.20.20" +__version__ = "1.25.3" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( set_assetbundle_decrypt_key as set_assetbundle_decrypt_key, ) - -def load(*args, fs=None, **kwargs): - return Environment(*args, fs=fs, **kwargs) - +load = Environment # backward compatibility AssetsManager = Environment diff --git a/UnityPy/__main__.py b/UnityPy/__main__.py new file mode 100644 index 000000000..b7ac88bfa --- /dev/null +++ b/UnityPy/__main__.py @@ -0,0 +1,4 @@ +if __name__ == "__main__": + from UnityPy.cli import main + + main() diff --git a/UnityPy/classes/Object.py b/UnityPy/classes/Object.py index f00de2d0e..c6ea23738 100644 --- a/UnityPy/classes/Object.py +++ b/UnityPy/classes/Object.py @@ -1,6 +1,7 @@ from __future__ import annotations + from abc import ABC, ABCMeta -from typing import TYPE_CHECKING, Dict, Any, Optional +from typing import TYPE_CHECKING, Any, Dict, Optional if TYPE_CHECKING: from ..files.ObjectReader import ObjectReader @@ -30,3 +31,29 @@ def save(self) -> None: raise ValueError("ObjectReader not set") self.object_reader.save_typetree(self) + + def __copy__(self) -> Object: + clz = self.__class__ + data = { + key: value + for key, value in self.__dict__.items() + if isinstance(key, str) and (not key.startswith("__") or key == "__node__") and not callable(value) + } + try: + # covers UnknownObject + return clz(**data) + except TypeError: + from ..helpers.TypeTreeHelper import get_annotation_keys + + keys = set(self.__dict__.keys()) + annotation_keys = get_annotation_keys(clz) + extra_keys = keys - annotation_keys + instance = clz(**{key: data[key] for key in annotation_keys}) + for key in extra_keys: + setattr(instance, key, data[key]) + return instance + + +__all__ = [ + "Object", +] diff --git a/UnityPy/classes/PPtr.py b/UnityPy/classes/PPtr.py index 1459583f7..313e62745 100644 --- a/UnityPy/classes/PPtr.py +++ b/UnityPy/classes/PPtr.py @@ -42,14 +42,16 @@ def read_typetree(self): def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: assetsfile = assetsfile or self.assetsfile + if assetsfile is None: raise ValueError("PPtr can't deref without an assetsfile!") if self.m_PathID == 0: raise ValueError("PPtr can't deref with m_PathID == 0!") + assetsfile_dst = None if self.m_FileID == 0: - pass + assetsfile_dst = assetsfile or self.assetsfile else: # resolve file id to external name external_id = self.m_FileID - 1 @@ -61,9 +63,7 @@ def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: container = assetsfile.parent if container is None: # TODO - use default fs - raise FileNotFoundError( - f"PPtr points to {external.path} but no container is set!" - ) + raise FileNotFoundError(f"PPtr points to {external.path} but no container is set!") external_clean_path = external.path if external_clean_path.startswith("archive:/"): @@ -74,26 +74,25 @@ def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: for key, file in container.files.items(): if key.lower() == external_clean_path: - assetsfile = file + assetsfile_dst = file break else: env = assetsfile.environment cab = env.find_file(external_clean_path) if cab: - assetsfile = cab + assetsfile_dst = cab else: - raise FileNotFoundError( - f"Failed to resolve pointer - {external.path} not found!" - ) + raise FileNotFoundError(f"Failed to resolve pointer - {external.path} not found!") + + if assetsfile_dst is None: + raise FileNotFoundError(f"Failed to resolve pointer - {self.m_FileID} not found!") - return cast("ObjectReader[T]", assetsfile.objects[self.m_PathID]) + return cast("ObjectReader[T]", assetsfile_dst.objects[self.m_PathID]) def deref_parse_as_object(self, assetsfile: Optional[SerializedFile] = None) -> T: return self.deref(assetsfile).parse_as_object() - def deref_parse_as_dict( - self, assetsfile: Optional[SerializedFile] = None - ) -> dict[str, Any]: + def deref_parse_as_dict(self, assetsfile: Optional[SerializedFile] = None) -> dict[str, Any]: return self.deref(assetsfile).parse_as_dict() def __bool__(self): @@ -106,3 +105,8 @@ def __eq__(self, other: object) -> bool: if not isinstance(other, PPtr): return False return self.m_FileID == other.m_FileID and self.m_PathID == other.m_PathID + + +__all__ = [ + "PPtr", +] diff --git a/UnityPy/classes/UnknownObject.py b/UnityPy/classes/UnknownObject.py index b6a3caa43..6ffbab07d 100644 --- a/UnityPy/classes/UnknownObject.py +++ b/UnityPy/classes/UnknownObject.py @@ -9,7 +9,7 @@ class UnknownObject(Object): __node__: Optional[TypeTreeNode] - def __init__(self, __node__: TypeTreeNode = None, **kwargs): + def __init__(self, __node__: Optional[TypeTreeNode] = None, **kwargs): self.__node__ = __node__ self.__dict__.update(**kwargs) @@ -23,10 +23,11 @@ def format_value(v): return vstr[:97] + "..." return vstr - inner_str = ", ".join( - f"{k}={format_value(v)}" - for k, v in self.__dict__.items() - if k != "__node__" - ) + inner_str = ", ".join(f"{k}={format_value(v)}" for k, v in self.__dict__.items() if k != "__node__") return f" {inner_str}>" + + +__all__ = [ + "UnknownObject", +] diff --git a/UnityPy/classes/__init__.py b/UnityPy/classes/__init__.py index ec2efb29d..f3ecdb219 100644 --- a/UnityPy/classes/__init__.py +++ b/UnityPy/classes/__init__.py @@ -1,5 +1,28 @@ -from .generated import * -from .legacy_patch import * +from .generated import * # noqa: F403 +from .legacy_patch import ( + AudioClip as AudioClip, +) +from .legacy_patch import ( + GameObject as GameObject, +) +from .legacy_patch import ( + Mesh as Mesh, +) +from .legacy_patch import ( + Renderer as Renderer, +) +from .legacy_patch import ( + Shader as Shader, +) +from .legacy_patch import ( + Sprite as Sprite, +) +from .legacy_patch import ( + Texture2D as Texture2D, +) +from .legacy_patch import ( + Texture2DArray as Texture2DArray, +) from .Object import Object as Object from .PPtr import PPtr as PPtr from .UnknownObject import UnknownObject as UnknownObject diff --git a/UnityPy/classes/generated.py b/UnityPy/classes/generated.py index 5a8d209b9..2e2697352 100644 --- a/UnityPy/classes/generated.py +++ b/UnityPy/classes/generated.py @@ -7,15 +7,15 @@ from attrs import define as attrs_define from .math import ( - ColorRGBA, - Matrix3x4f, - Matrix4x4f, - Quaternionf, - Vector2f, - Vector3f, - Vector4f, - float3, - float4, + ColorRGBA, + Matrix3x4f, + Matrix4x4f, + Quaternionf, + Vector2f, + Vector3f, + Vector4f, + float3, + float4, ) from .Object import Object from .PPtr import PPtr @@ -24,11604 +24,12327 @@ def unitypy_define(cls: T) -> T: - """ - A hacky solution to bypass multiple problems related to attrs and inheritance. + """ + A hacky solution to bypass multiple problems related to attrs and inheritance. - The class inheritance is very lax and based on the typetrees. - Some of the child classes might not have the same attributes as the parent class, - which would make type-hinting more tricky, and breaks attrs.define. + The class inheritance is very lax and based on the typetrees. + Some of the child classes might not have the same attributes as the parent class, + which would make type-hinting more tricky, and breaks attrs.define. - Therefore this function bypasses the issue - by redifining the bases for problematic classes for the attrs.define call. - """ - bases = cls.__bases__ - if bases[0] in (object, Object, ABC): - cls = attrs_define(cls, slots=True, unsafe_hash=True) - else: - cls.__bases__ = (Object,) - cls = attrs_define(cls, slots=False, unsafe_hash=True) - cls.__bases__ = bases - return cls + Therefore this function bypasses the issue + by redefining the bases for problematic classes for the attrs.define call. + """ + bases = cls.__bases__ + if bases[0] in (object, Object, ABC): + cls = attrs_define(cls, slots=True, unsafe_hash=True) + else: + cls.__bases__ = (Object,) + cls = attrs_define(cls, slots=False, unsafe_hash=True) + cls.__bases__ = bases + return cls @unitypy_define class AnnotationManager(Object): - m_CurrentPreset_m_AnnotationList: List[Annotation] - m_RecentlyChanged: List[Annotation] - m_FadeGizmoSize: Optional[float] = None - m_FadeGizmos: Optional[bool] = None - m_IconSize: Optional[float] = None - m_ShowGrid: Optional[bool] = None - m_ShowSelectionOutline: Optional[bool] = None - m_ShowSelectionWire: Optional[bool] = None - m_Use3dGizmos: Optional[bool] = None - m_WorldIconSize: Optional[float] = None + m_CurrentPreset_m_AnnotationList: List[Annotation] + m_RecentlyChanged: List[Annotation] + m_FadeGizmoSize: Optional[float] = None + m_FadeGizmos: Optional[bool] = None + m_IconSize: Optional[float] = None + m_ShowGrid: Optional[bool] = None + m_ShowLODLabels: Optional[bool] = None + m_ShowSelectionOutline: Optional[bool] = None + m_ShowSelectionWire: Optional[bool] = None + m_Use3dGizmos: Optional[bool] = None + m_WorldIconSize: Optional[float] = None @unitypy_define class AssetDatabaseV1(Object): - m_AssetBundleNames: List[Tuple[int, AssetBundleFullName]] - m_AssetTimeStamps: List[Tuple[str, AssetTimeStamp]] - m_Assets: List[Tuple[GUID, Asset]] - m_Metrics: AssetDatabaseMetrics - m_UnityShadersVersion: int - m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None - m_lastValidVersions: Optional[List[Tuple[AssetImporterHashKey, int]]] = None + m_AssetBundleNames: List[Tuple[int, AssetBundleFullName]] + m_AssetTimeStamps: List[Tuple[str, AssetTimeStamp]] + m_Assets: List[Tuple[GUID, Asset]] + m_Metrics: AssetDatabaseMetrics + m_UnityShadersVersion: int + m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None + m_lastValidVersions: Optional[List[Tuple[AssetImporterHashKey, int]]] = None @unitypy_define class AssetMetaData(Object): - assetStoreRef: int - guid: GUID - labels: List[str] - originalName: str - pathName: str - licenseType: Optional[int] = None - originalChangeset: Optional[int] = None - originalDigest: Optional[Union[Hash128, MdFour]] = None - originalParent: Optional[GUID] = None - timeCreated: Optional[int] = None + assetStoreRef: int + guid: GUID + labels: List[str] + originalName: str + pathName: str + licenseType: Optional[int] = None + originalChangeset: Optional[int] = None + originalDigest: Optional[Union[Hash128, MdFour]] = None + originalParent: Optional[GUID] = None + timeCreated: Optional[int] = None @unitypy_define class AssetServerCache(Object): - m_CachesInitialized: int - m_CommitItemSelection: List[GUID] - m_DeletedItems: List[Tuple[GUID, DeletedItem]] - m_Items: List[Tuple[GUID, Item]] - m_LastCommitMessage: str - m_LatestServerChangeset: int - m_ModifiedItems: List[Tuple[GUID, Item]] - m_WorkingItemMetaData: List[Tuple[GUID, CachedAssetMetaData]] + m_CachesInitialized: int + m_CommitItemSelection: List[GUID] + m_DeletedItems: List[Tuple[GUID, DeletedItem]] + m_Items: List[Tuple[GUID, Item]] + m_LastCommitMessage: str + m_LatestServerChangeset: int + m_ModifiedItems: List[Tuple[GUID, Item]] + m_WorkingItemMetaData: List[Tuple[GUID, CachedAssetMetaData]] @unitypy_define class AudioBuildInfo(Object): - m_AudioClipCount: int - m_AudioMixerCount: int - m_IsAudioDisabled: bool + m_AudioClipCount: int + m_AudioMixerCount: int + m_IsAudioDisabled: bool + + +@unitypy_define +class BlockShaderSourceArtifact(Object): + shaderName: str + shaderSource: str @unitypy_define class BuiltAssetBundleInfoSet(Object): - bundleInfos: List[BuiltAssetBundleInfo] + bundleInfos: List[BuiltAssetBundleInfo] + + +@unitypy_define +class ContentSummary(Object): + m_assetStatsList: List[AssetStats] + m_headerSize: int + m_objectCount: int + m_resourceDataSize: int + m_resourceFileCount: int + m_serializedFileCount: int + m_serializedFileSize: int + m_typeStatsList: List[TypeStats] + m_generatedFileCount: Optional[int] = None + m_generatedFileSize: Optional[int] = None + m_reusedSerializedFileCount: Optional[int] = None + m_reusedSerializedFileSize: Optional[int] = None + m_sizeReusedContentInOutputDirectory: Optional[int] = None @unitypy_define class Derived(Object): - pass + pass @unitypy_define class SubDerived(Derived): - pass + pass @unitypy_define class DifferentMarshallingTestObject(Object): - pass + pass @unitypy_define class EditorBuildSettings(Object): - m_Scenes: List[Scene] - m_UseUCBPForAssetBundles: Optional[bool] = None - m_configObjects: Optional[List[Tuple[str, PPtr[Object]]]] = None + m_Scenes: List[Scene] + m_UseUCBPForAssetBundles: Optional[bool] = None + m_configObjects: Optional[List[Tuple[str, PPtr[Object]]]] = None @unitypy_define class EditorExtension(Object, ABC): - pass + pass @unitypy_define class Component(EditorExtension): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class Behaviour(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class Animation(Behaviour): - m_AnimatePhysics: bool - m_Animation: PPtr[AnimationClip] - m_Animations: List[PPtr[AnimationClip]] - m_CullingType: int - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_PlayAutomatically: bool - m_WrapMode: int - m_UpdateMode: Optional[int] = None - m_UserAABB: Optional[AABB] = None + m_AnimatePhysics: bool + m_Animation: PPtr[AnimationClip] + m_Animations: List[PPtr[AnimationClip]] + m_CullingType: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PlayAutomatically: bool + m_WrapMode: int + m_UpdateMode: Optional[int] = None + m_UserAABB: Optional[AABB] = None @unitypy_define class Animator(Behaviour): - m_ApplyRootMotion: bool - m_Avatar: PPtr[Avatar] - m_Controller: Union[PPtr[AnimatorController], PPtr[RuntimeAnimatorController]] - m_CullingMode: int - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_AllowConstantClipSamplingOptimization: Optional[bool] = None - m_AnimatePhysics: Optional[bool] = None - m_HasTransformHierarchy: Optional[bool] = None - m_KeepAnimatorControllerStateOnDisable: Optional[bool] = None - m_KeepAnimatorStateOnDisable: Optional[bool] = None - m_LinearVelocityBlending: Optional[bool] = None - m_StabilizeFeet: Optional[bool] = None - m_UpdateMode: Optional[int] = None - m_WriteDefaultValuesOnDisable: Optional[bool] = None + m_ApplyRootMotion: bool + m_Avatar: PPtr[Avatar] + m_Controller: Union[PPtr[AnimatorController], PPtr[RuntimeAnimatorController]] + m_CullingMode: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_AllowConstantClipSamplingOptimization: Optional[bool] = None + m_AnimatePhysics: Optional[bool] = None + m_HasTransformHierarchy: Optional[bool] = None + m_KeepAnimatorControllerStateOnDisable: Optional[bool] = None + m_KeepAnimatorStateOnDisable: Optional[bool] = None + m_LinearVelocityBlending: Optional[bool] = None + m_StabilizeFeet: Optional[bool] = None + m_UpdateMode: Optional[int] = None + m_WriteDefaultValuesOnDisable: Optional[bool] = None @unitypy_define class ArticulationBody(Behaviour): - m_AnchorPosition: Vector3f - m_AnchorRotation: Quaternionf - m_AngularDamping: float - m_ArticulationJointType: int - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Immovable: bool - m_JointFriction: float - m_LinearDamping: float - m_LinearX: int - m_LinearY: int - m_LinearZ: int - m_Mass: float - m_ParentAnchorPosition: Vector3f - m_ParentAnchorRotation: Quaternionf - m_SwingY: int - m_SwingZ: int - m_Twist: int - m_XDrive: ArticulationDrive - m_YDrive: ArticulationDrive - m_ZDrive: ArticulationDrive - m_CenterOfMass: Optional[Vector3f] = None - m_CollisionDetectionMode: Optional[int] = None - m_ComputeParentAnchor: Optional[bool] = None - m_ExcludeLayers: Optional[BitField] = None - m_ImplicitCom: Optional[bool] = None - m_ImplicitTensor: Optional[bool] = None - m_IncludeLayers: Optional[BitField] = None - m_InertiaRotation: Optional[Quaternionf] = None - m_InertiaTensor: Optional[Vector3f] = None - m_MatchAnchors: Optional[bool] = None - m_UseGravity: Optional[bool] = None + m_AnchorPosition: Vector3f + m_AnchorRotation: Quaternionf + m_AngularDamping: float + m_ArticulationJointType: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Immovable: bool + m_JointFriction: float + m_LinearDamping: float + m_LinearX: int + m_LinearY: int + m_LinearZ: int + m_Mass: float + m_ParentAnchorPosition: Vector3f + m_ParentAnchorRotation: Quaternionf + m_SwingY: int + m_SwingZ: int + m_Twist: int + m_XDrive: ArticulationDrive + m_YDrive: ArticulationDrive + m_ZDrive: ArticulationDrive + m_CenterOfMass: Optional[Vector3f] = None + m_CollisionDetectionMode: Optional[int] = None + m_ComputeParentAnchor: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_ImplicitCom: Optional[bool] = None + m_ImplicitTensor: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_InertiaRotation: Optional[Quaternionf] = None + m_InertiaTensor: Optional[Vector3f] = None + m_MatchAnchors: Optional[bool] = None + m_UseGravity: Optional[bool] = None @unitypy_define class AudioBehaviour(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class AudioListener(AudioBehaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None @unitypy_define class AudioSource(AudioBehaviour): - BypassEffects: bool - DopplerLevel: float - Loop: bool - MaxDistance: float - MinDistance: float - Mute: bool - Pan2D: float - Priority: int - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Pitch: float - m_PlayOnAwake: bool - m_Volume: float - m_audioClip: PPtr[AudioClip] - panLevelCustomCurve: AnimationCurve - rolloffCustomCurve: AnimationCurve - rolloffMode: int - spreadCustomCurve: AnimationCurve - BypassListenerEffects: Optional[bool] = None - BypassReverbZones: Optional[bool] = None - OutputAudioMixerGroup: Optional[PPtr[AudioMixerGroup]] = None - Spatialize: Optional[bool] = None - SpatializePostEffects: Optional[bool] = None - m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None - m_Resource: Optional[PPtr[AudioResource]] = None - reverbZoneMixCustomCurve: Optional[AnimationCurve] = None + BypassEffects: bool + DopplerLevel: float + Loop: bool + MaxDistance: float + MinDistance: float + Mute: bool + Pan2D: float + Priority: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Pitch: float + m_PlayOnAwake: bool + m_Volume: float + m_audioClip: PPtr[AudioClip] + panLevelCustomCurve: AnimationCurve + rolloffCustomCurve: AnimationCurve + rolloffMode: int + spreadCustomCurve: AnimationCurve + BypassListenerEffects: Optional[bool] = None + BypassReverbZones: Optional[bool] = None + OutputAudioMixerGroup: Optional[PPtr[AudioMixerGroup]] = None + Spatialize: Optional[bool] = None + SpatializePostEffects: Optional[bool] = None + m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None + m_Resource: Optional[Union[PPtr[AudioResource], PPtr[Object]]] = None + reverbZoneMixCustomCurve: Optional[AnimationCurve] = None @unitypy_define class AudioFilter(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class AudioChorusFilter(AudioFilter): - m_Delay: float - m_Depth: float - m_DryMix: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Rate: float - m_WetMix1: float - m_WetMix2: float - m_WetMix3: float - m_FeedBack: Optional[float] = None + m_Delay: float + m_Depth: float + m_DryMix: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Rate: float + m_WetMix1: float + m_WetMix2: float + m_WetMix3: float + m_FeedBack: Optional[float] = None @unitypy_define class AudioDistortionFilter(AudioFilter): - m_DistortionLevel: float - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_DistortionLevel: float + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class AudioEchoFilter(AudioFilter): - m_DecayRatio: float - m_Delay: Union[int, float] - m_DryMix: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_WetMix: float + m_DecayRatio: float + m_Delay: Union[float, int] + m_DryMix: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_WetMix: float @unitypy_define class AudioHighPassFilter(AudioFilter): - m_CutoffFrequency: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_HighpassResonanceQ: float + m_CutoffFrequency: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HighpassResonanceQ: float @unitypy_define class AudioLowPassFilter(AudioFilter): - lowpassLevelCustomCurve: AnimationCurve - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_LowpassResonanceQ: float - m_CutoffFrequency: Optional[float] = None + lowpassLevelCustomCurve: AnimationCurve + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LowpassResonanceQ: float + m_CutoffFrequency: Optional[float] = None @unitypy_define class AudioReverbFilter(AudioFilter): - m_DecayHFRatio: float - m_DecayTime: float - m_Density: float - m_Diffusion: float - m_DryLevel: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_HFReference: float - m_LFReference: float - m_ReflectionsDelay: float - m_ReflectionsLevel: float - m_ReverbDelay: float - m_ReverbLevel: float - m_ReverbPreset: int - m_Room: float - m_RoomHF: float - m_RoomLF: float - m_RoomRolloff: Optional[float] = None + m_DecayHFRatio: float + m_DecayTime: float + m_Density: float + m_Diffusion: float + m_DryLevel: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HFReference: float + m_LFReference: float + m_ReflectionsDelay: float + m_ReflectionsLevel: float + m_ReverbDelay: float + m_ReverbLevel: float + m_ReverbPreset: int + m_Room: float + m_RoomHF: float + m_RoomLF: float + m_RoomRolloff: Optional[float] = None @unitypy_define class AudioReverbZone(Behaviour): - m_DecayHFRatio: float - m_DecayTime: float - m_Density: float - m_Diffusion: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_HFReference: float - m_LFReference: float - m_MaxDistance: float - m_MinDistance: float - m_Reflections: int - m_ReflectionsDelay: float - m_Reverb: int - m_ReverbDelay: float - m_ReverbPreset: int - m_Room: int - m_RoomHF: int - m_RoomLF: int - m_RoomRolloffFactor: Optional[float] = None + m_DecayHFRatio: float + m_DecayTime: float + m_Density: float + m_Diffusion: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HFReference: float + m_LFReference: float + m_MaxDistance: float + m_MinDistance: float + m_Reflections: int + m_ReflectionsDelay: float + m_Reverb: int + m_ReverbDelay: float + m_ReverbPreset: int + m_Room: int + m_RoomHF: int + m_RoomLF: int + m_RoomRolloffFactor: Optional[float] = None @unitypy_define class Camera(Behaviour): - far_clip_plane: float - field_of_view: float - m_BackGroundColor: ColorRGBA - m_ClearFlags: int - m_CullingMask: BitField - m_Depth: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_NormalizedViewPortRect: Rectf - m_RenderingPath: int - m_TargetTexture: PPtr[RenderTexture] - near_clip_plane: float - orthographic: bool - orthographic_size: float - m_AllowDynamicResolution: Optional[bool] = None - m_AllowMSAA: Optional[bool] = None - m_Anamorphism: Optional[float] = None - m_Aperture: Optional[float] = None - m_BarrelClipping: Optional[float] = None - m_BladeCount: Optional[int] = None - m_Curvature: Optional[Vector2f] = None - m_FocalLength: Optional[float] = None - m_FocusDistance: Optional[float] = None - m_ForceIntoRT: Optional[bool] = None - m_GateFitMode: Optional[int] = None - m_HDR: Optional[bool] = None - m_Iso: Optional[int] = None - m_LensShift: Optional[Vector2f] = None - m_OcclusionCulling: Optional[bool] = None - m_SensorSize: Optional[Vector2f] = None - m_ShutterSpeed: Optional[float] = None - m_StereoConvergence: Optional[float] = None - m_StereoMirrorMode: Optional[bool] = None - m_StereoSeparation: Optional[float] = None - m_TargetDisplay: Optional[int] = None - m_TargetEye: Optional[int] = None - m_projectionMatrixMode: Optional[int] = None + far_clip_plane: float + field_of_view: float + m_BackGroundColor: ColorRGBA + m_ClearFlags: int + m_CullingMask: BitField + m_Depth: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_NormalizedViewPortRect: Rectf + m_RenderingPath: int + m_TargetTexture: PPtr[RenderTexture] + near_clip_plane: float + orthographic: bool + orthographic_size: float + m_AllowDynamicResolution: Optional[bool] = None + m_AllowMSAA: Optional[bool] = None + m_Anamorphism: Optional[float] = None + m_Aperture: Optional[float] = None + m_BarrelClipping: Optional[float] = None + m_BladeCount: Optional[int] = None + m_Curvature: Optional[Vector2f] = None + m_FocalLength: Optional[float] = None + m_FocusDistance: Optional[float] = None + m_ForceIntoRT: Optional[bool] = None + m_GateFitMode: Optional[int] = None + m_HDR: Optional[bool] = None + m_Iso: Optional[int] = None + m_LensShift: Optional[Vector2f] = None + m_OcclusionCulling: Optional[bool] = None + m_SensorSize: Optional[Vector2f] = None + m_ShutterSpeed: Optional[float] = None + m_StereoConvergence: Optional[float] = None + m_StereoMirrorMode: Optional[bool] = None + m_StereoSeparation: Optional[float] = None + m_TargetDisplay: Optional[int] = None + m_TargetEye: Optional[int] = None + m_projectionMatrixMode: Optional[int] = None @unitypy_define class ScriptableCamera(Camera): - far_clip_plane: float - field_of_view: float - m_AllowDynamicResolution: bool - m_AllowMSAA: bool - m_BackGroundColor: ColorRGBA - m_ClearFlags: int - m_CullingMask: BitField - m_Depth: float - m_Enabled: int - m_FocalLength: float - m_ForceIntoRT: bool - m_GameObject: PPtr[GameObject] - m_GateFitMode: int - m_HDR: bool - m_LensShift: Vector2f - m_NormalizedViewPortRect: Rectf - m_OcclusionCulling: bool - m_RenderingPath: int - m_Script: PPtr[MonoScript] - m_SensorSize: Vector2f - m_StereoConvergence: float - m_StereoSeparation: float - m_TargetDisplay: int - m_TargetEye: int - m_TargetTexture: PPtr[RenderTexture] - m_projectionMatrixMode: int - near_clip_plane: float - orthographic: bool - orthographic_size: float + far_clip_plane: float + field_of_view: float + m_AllowDynamicResolution: bool + m_AllowMSAA: bool + m_BackGroundColor: ColorRGBA + m_ClearFlags: int + m_CullingMask: BitField + m_Depth: float + m_Enabled: int + m_FocalLength: float + m_ForceIntoRT: bool + m_GameObject: PPtr[GameObject] + m_GateFitMode: int + m_HDR: bool + m_LensShift: Vector2f + m_NormalizedViewPortRect: Rectf + m_OcclusionCulling: bool + m_RenderingPath: int + m_Script: PPtr[MonoScript] + m_SensorSize: Vector2f + m_StereoConvergence: float + m_StereoSeparation: float + m_TargetDisplay: int + m_TargetEye: int + m_TargetTexture: PPtr[RenderTexture] + m_projectionMatrixMode: int + near_clip_plane: float + orthographic: bool + orthographic_size: float @unitypy_define class Canvas(Behaviour): - m_Camera: PPtr[Camera] - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_PixelPerfect: bool - m_RenderMode: int - m_AdditionalShaderChannelsFlag: Optional[int] = None - m_Alpha: Optional[float] = None - m_Normals: Optional[bool] = None - m_OverridePixelPerfect: Optional[bool] = None - m_OverrideSorting: Optional[bool] = None - m_PlaneDistance: Optional[float] = None - m_PositionUVs: Optional[bool] = None - m_ReceivesEvents: Optional[bool] = None - m_SortingBucketNormalizedSize: Optional[float] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_TargetDisplay: Optional[int] = None - m_UpdateRectTransformForStandalone: Optional[int] = None - m_VertexColorAlwaysGammaSpace: Optional[bool] = None + m_Camera: PPtr[Camera] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PixelPerfect: bool + m_RenderMode: int + m_AdditionalShaderChannelsFlag: Optional[int] = None + m_Alpha: Optional[float] = None + m_Normals: Optional[bool] = None + m_OverridePixelPerfect: Optional[bool] = None + m_OverrideSorting: Optional[bool] = None + m_PlaneDistance: Optional[float] = None + m_PositionUVs: Optional[bool] = None + m_ReceivesEvents: Optional[bool] = None + m_SortingBucketNormalizedSize: Optional[float] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_TargetDisplay: Optional[int] = None + m_UpdateRectTransformForStandalone: Optional[int] = None + m_UseReflectionProbes: Optional[bool] = None + m_VertexColorAlwaysGammaSpace: Optional[bool] = None @unitypy_define class CanvasGroup(Behaviour): - m_Alpha: float - m_BlocksRaycasts: bool - m_GameObject: PPtr[GameObject] - m_IgnoreParentGroups: bool - m_Interactable: bool - m_Enabled: Optional[int] = None + m_Alpha: float + m_BlocksRaycasts: bool + m_GameObject: PPtr[GameObject] + m_IgnoreParentGroups: bool + m_Interactable: bool + m_Enabled: Optional[int] = None @unitypy_define class Cloth(Behaviour): - m_GameObject: PPtr[GameObject] - m_BendingStiffness: Optional[float] = None - m_CapsuleColliders: Optional[List[PPtr[CapsuleCollider]]] = None - m_Coefficients: Optional[List[ClothConstrainCoefficients]] = None - m_CollisionMassScale: Optional[float] = None - m_Damping: Optional[float] = None - m_Enabled: Optional[int] = None - m_ExternalAcceleration: Optional[Vector3f] = None - m_Friction: Optional[float] = None - m_RandomAcceleration: Optional[Vector3f] = None - m_SelfAndInterCollisionIndices: Optional[List[int]] = None - m_SelfCollisionDistance: Optional[float] = None - m_SelfCollisionStiffness: Optional[float] = None - m_SleepThreshold: Optional[float] = None - m_SolverFrequency: Optional[Union[int, float]] = None - m_SphereColliders: Optional[ - Union[ - List[ClothSphereColliderPair], - List[Tuple[PPtr[SphereCollider], PPtr[SphereCollider]]], - ] - ] = None - m_StretchingStiffness: Optional[float] = None - m_UseContinuousCollision: Optional[bool] = None - m_UseGravity: Optional[bool] = None - m_UseTethers: Optional[bool] = None - m_UseVirtualParticles: Optional[bool] = None - m_VirtualParticleIndices: Optional[List[int]] = None - m_VirtualParticleWeights: Optional[List[Vector3f]] = None - m_WorldAccelerationScale: Optional[float] = None - m_WorldVelocityScale: Optional[float] = None + m_GameObject: PPtr[GameObject] + m_BendingStiffness: Optional[float] = None + m_CapsuleColliders: Optional[List[PPtr[CapsuleCollider]]] = None + m_Coefficients: Optional[List[ClothConstrainCoefficients]] = None + m_CollisionMassScale: Optional[float] = None + m_Damping: Optional[float] = None + m_Enabled: Optional[int] = None + m_ExternalAcceleration: Optional[Vector3f] = None + m_Friction: Optional[float] = None + m_RandomAcceleration: Optional[Vector3f] = None + m_SelfAndInterCollisionIndices: Optional[List[int]] = None + m_SelfCollisionDistance: Optional[float] = None + m_SelfCollisionStiffness: Optional[float] = None + m_SleepThreshold: Optional[float] = None + m_SolverFrequency: Optional[Union[float, int]] = None + m_SphereColliders: Optional[Union[List[ClothSphereColliderPair], List[Tuple[PPtr[SphereCollider], PPtr[SphereCollider]]]]] = None + m_StretchingStiffness: Optional[float] = None + m_UseContinuousCollision: Optional[bool] = None + m_UseGravity: Optional[bool] = None + m_UseTethers: Optional[bool] = None + m_UseVirtualParticles: Optional[bool] = None + m_VirtualParticleIndices: Optional[List[int]] = None + m_VirtualParticleWeights: Optional[List[Vector3f]] = None + m_WorldAccelerationScale: Optional[float] = None + m_WorldVelocityScale: Optional[float] = None @unitypy_define class InteractiveCloth(Cloth): - m_AttachedColliders: List[ClothAttachment] - m_AttachmentResponse: float - m_AttachmentTearFactor: float - m_BendingStiffness: float - m_CollisionResponse: float - m_Damping: float - m_Density: float - m_Enabled: int - m_ExternalAcceleration: Vector3f - m_Friction: float - m_GameObject: PPtr[GameObject] - m_Mesh: PPtr[Mesh] - m_Pressure: float - m_RandomAcceleration: Vector3f - m_SelfCollision: bool - m_StretchingStiffness: float - m_TearFactor: float - m_Thickness: float - m_UseGravity: bool + m_AttachedColliders: List[ClothAttachment] + m_AttachmentResponse: float + m_AttachmentTearFactor: float + m_BendingStiffness: float + m_CollisionResponse: float + m_Damping: float + m_Density: float + m_Enabled: int + m_ExternalAcceleration: Vector3f + m_Friction: float + m_GameObject: PPtr[GameObject] + m_Mesh: PPtr[Mesh] + m_Pressure: float + m_RandomAcceleration: Vector3f + m_SelfCollision: bool + m_StretchingStiffness: float + m_TearFactor: float + m_Thickness: float + m_UseGravity: bool @unitypy_define class SkinnedCloth(Cloth): - m_BendingStiffness: float - m_Coefficients: List[ClothConstrainCoefficients] - m_Damping: float - m_Enabled: int - m_ExternalAcceleration: Vector3f - m_GameObject: PPtr[GameObject] - m_RandomAcceleration: Vector3f - m_SelfCollision: bool - m_StretchingStiffness: float - m_Thickness: float - m_UseGravity: bool - m_WorldAccelerationScale: float - m_WorldVelocityScale: float + m_BendingStiffness: float + m_Coefficients: List[ClothConstrainCoefficients] + m_Damping: float + m_Enabled: int + m_ExternalAcceleration: Vector3f + m_GameObject: PPtr[GameObject] + m_RandomAcceleration: Vector3f + m_SelfCollision: bool + m_StretchingStiffness: float + m_Thickness: float + m_UseGravity: bool + m_WorldAccelerationScale: float + m_WorldVelocityScale: float @unitypy_define class CloudServiceHandlerBehaviour(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class Collider2D(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class BoxCollider2D(Collider2D): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Size: Vector2f - m_AutoTiling: Optional[bool] = None - m_CallbackLayers: Optional[BitField] = None - m_Center: Optional[Vector2f] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_Density: Optional[float] = None - m_EdgeRadius: Optional[float] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_Offset: Optional[Vector2f] = None - m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None - m_UsedByComposite: Optional[bool] = None - m_UsedByEffector: Optional[bool] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Size: Vector2f + m_AutoTiling: Optional[bool] = None + m_CallbackLayers: Optional[BitField] = None + m_Center: Optional[Vector2f] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None @unitypy_define class CapsuleCollider2D(Collider2D): - m_Density: float - m_Direction: int - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Offset: Vector2f - m_Size: Vector2f - m_UsedByEffector: bool - m_CallbackLayers: Optional[BitField] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_UsedByComposite: Optional[bool] = None + m_Density: float + m_Direction: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_Size: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_UsedByComposite: Optional[bool] = None @unitypy_define class CircleCollider2D(Collider2D): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Radius: float - m_CallbackLayers: Optional[BitField] = None - m_Center: Optional[Vector2f] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_Density: Optional[float] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_Offset: Optional[Vector2f] = None - m_UsedByComposite: Optional[bool] = None - m_UsedByEffector: Optional[bool] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Radius: float + m_CallbackLayers: Optional[BitField] = None + m_Center: Optional[Vector2f] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None @unitypy_define class CompositeCollider2D(Collider2D): - m_ColliderPaths: List[SubCollider] - m_CompositePaths: Polygon2D - m_Density: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_GenerationType: int - m_GeometryType: int - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Offset: Vector2f - m_UsedByEffector: bool - m_VertexDistance: float - m_CallbackLayers: Optional[BitField] = None - m_CompositeGameObject: Optional[PPtr[GameObject]] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_EdgeRadius: Optional[float] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_OffsetDistance: Optional[float] = None - m_UseDelaunayMesh: Optional[bool] = None - m_UsedByComposite: Optional[bool] = None + m_ColliderPaths: List[SubCollider] + m_CompositePaths: Polygon2D + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_GenerationType: int + m_GeometryType: int + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_VertexDistance: float + m_CallbackLayers: Optional[BitField] = None + m_CompositeGameObject: Optional[PPtr[GameObject]] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_OffsetDistance: Optional[float] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None @unitypy_define class CustomCollider2D(Collider2D): - m_CustomShapes: PhysicsShapeGroup2D - m_Density: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Offset: Vector2f - m_UsedByEffector: bool - m_CallbackLayers: Optional[BitField] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_UsedByComposite: Optional[bool] = None + m_CustomShapes: PhysicsShapeGroup2D + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_UsedByComposite: Optional[bool] = None @unitypy_define class EdgeCollider2D(Collider2D): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Points: List[Vector2f] - m_AdjacentEndPoint: Optional[Vector2f] = None - m_AdjacentStartPoint: Optional[Vector2f] = None - m_CallbackLayers: Optional[BitField] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_Density: Optional[float] = None - m_EdgeRadius: Optional[float] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_Offset: Optional[Vector2f] = None - m_UseAdjacentEndPoint: Optional[bool] = None - m_UseAdjacentStartPoint: Optional[bool] = None - m_UsedByComposite: Optional[bool] = None - m_UsedByEffector: Optional[bool] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Points: List[Vector2f] + m_AdjacentEndPoint: Optional[Vector2f] = None + m_AdjacentStartPoint: Optional[Vector2f] = None + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_UseAdjacentEndPoint: Optional[bool] = None + m_UseAdjacentStartPoint: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None @unitypy_define class PolygonCollider2D(Collider2D): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_AutoTiling: Optional[bool] = None - m_CallbackLayers: Optional[BitField] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_Density: Optional[float] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_Offset: Optional[Vector2f] = None - m_Points: Optional[Polygon2D] = None - m_Poly: Optional[Polygon2D] = None - m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None - m_UseDelaunayMesh: Optional[bool] = None - m_UsedByComposite: Optional[bool] = None - m_UsedByEffector: Optional[bool] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_AutoTiling: Optional[bool] = None + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_Points: Optional[Polygon2D] = None + m_Poly: Optional[Polygon2D] = None + m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None @unitypy_define class PolygonColliderBase2D(Collider2D): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class TilemapCollider2D(Collider2D): - m_Density: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: PPtr[PhysicsMaterial2D] - m_Offset: Vector2f - m_UsedByEffector: bool - m_CallbackLayers: Optional[BitField] = None - m_CompositeOperation: Optional[int] = None - m_CompositeOrder: Optional[int] = None - m_ContactCaptureLayers: Optional[BitField] = None - m_ExcludeLayers: Optional[BitField] = None - m_ExtrusionFactor: Optional[float] = None - m_ForceReceiveLayers: Optional[BitField] = None - m_ForceSendLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_MaximumTileChangeCount: Optional[int] = None - m_UseDelaunayMesh: Optional[bool] = None - m_UsedByComposite: Optional[bool] = None + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ExtrusionFactor: Optional[float] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_MaximumTileChangeCount: Optional[int] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None @unitypy_define class ConstantForce(Behaviour): - m_Enabled: int - m_Force: Vector3f - m_GameObject: PPtr[GameObject] - m_RelativeForce: Vector3f - m_RelativeTorque: Vector3f - m_Torque: Vector3f + m_Enabled: int + m_Force: Vector3f + m_GameObject: PPtr[GameObject] + m_RelativeForce: Vector3f + m_RelativeTorque: Vector3f + m_Torque: Vector3f @unitypy_define class Effector2D(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class AreaEffector2D(Effector2D): - m_AngularDrag: float - m_ColliderMask: BitField - m_Drag: float - m_Enabled: int - m_ForceMagnitude: float - m_ForceTarget: int - m_ForceVariation: float - m_GameObject: PPtr[GameObject] - m_ForceAngle: Optional[float] = None - m_ForceDirection: Optional[float] = None - m_UseColliderMask: Optional[bool] = None - m_UseGlobalAngle: Optional[bool] = None + m_ColliderMask: BitField + m_Enabled: int + m_ForceMagnitude: float + m_ForceTarget: int + m_ForceVariation: float + m_GameObject: PPtr[GameObject] + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_Drag: Optional[float] = None + m_ForceAngle: Optional[float] = None + m_ForceDirection: Optional[float] = None + m_LinearDamping: Optional[float] = None + m_UseColliderMask: Optional[bool] = None + m_UseGlobalAngle: Optional[bool] = None @unitypy_define class BuoyancyEffector2D(Effector2D): - m_AngularDrag: float - m_ColliderMask: BitField - m_Density: float - m_Enabled: int - m_FlowAngle: float - m_FlowMagnitude: float - m_FlowVariation: float - m_GameObject: PPtr[GameObject] - m_LinearDrag: float - m_SurfaceLevel: float - m_UseColliderMask: bool + m_ColliderMask: BitField + m_Density: float + m_Enabled: int + m_FlowAngle: float + m_FlowMagnitude: float + m_FlowVariation: float + m_GameObject: PPtr[GameObject] + m_SurfaceLevel: float + m_UseColliderMask: bool + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_LinearDamping: Optional[float] = None + m_LinearDrag: Optional[float] = None @unitypy_define class PlatformEffector2D(Effector2D): - m_ColliderMask: BitField - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_OneWay: Optional[bool] = None - m_RotationalOffset: Optional[float] = None - m_SideAngleVariance: Optional[float] = None - m_SideArc: Optional[float] = None - m_SideBounce: Optional[bool] = None - m_SideFriction: Optional[bool] = None - m_SurfaceArc: Optional[float] = None - m_UseColliderMask: Optional[bool] = None - m_UseOneWay: Optional[bool] = None - m_UseOneWayGrouping: Optional[bool] = None - m_UseSideBounce: Optional[bool] = None - m_UseSideFriction: Optional[bool] = None + m_ColliderMask: BitField + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_OneWay: Optional[bool] = None + m_RotationalOffset: Optional[float] = None + m_SideAngleVariance: Optional[float] = None + m_SideArc: Optional[float] = None + m_SideBounce: Optional[bool] = None + m_SideFriction: Optional[bool] = None + m_SurfaceArc: Optional[float] = None + m_UseColliderMask: Optional[bool] = None + m_UseOneWay: Optional[bool] = None + m_UseOneWayGrouping: Optional[bool] = None + m_UseSideBounce: Optional[bool] = None + m_UseSideFriction: Optional[bool] = None @unitypy_define class PointEffector2D(Effector2D): - m_AngularDrag: float - m_ColliderMask: BitField - m_DistanceScale: float - m_Drag: float - m_Enabled: int - m_ForceMagnitude: float - m_ForceMode: int - m_ForceSource: int - m_ForceTarget: int - m_ForceVariation: float - m_GameObject: PPtr[GameObject] - m_UseColliderMask: Optional[bool] = None + m_ColliderMask: BitField + m_DistanceScale: float + m_Enabled: int + m_ForceMagnitude: float + m_ForceMode: int + m_ForceSource: int + m_ForceTarget: int + m_ForceVariation: float + m_GameObject: PPtr[GameObject] + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_Drag: Optional[float] = None + m_LinearDamping: Optional[float] = None + m_UseColliderMask: Optional[bool] = None @unitypy_define class SurfaceEffector2D(Effector2D): - m_ColliderMask: BitField - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Speed: float - m_SpeedVariation: float - m_ForceScale: Optional[float] = None - m_UseBounce: Optional[bool] = None - m_UseColliderMask: Optional[bool] = None - m_UseContactForce: Optional[bool] = None - m_UseFriction: Optional[bool] = None + m_ColliderMask: BitField + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Speed: float + m_SpeedVariation: float + m_ForceScale: Optional[float] = None + m_UseBounce: Optional[bool] = None + m_UseColliderMask: Optional[bool] = None + m_UseContactForce: Optional[bool] = None + m_UseFriction: Optional[bool] = None @unitypy_define class FlareLayer(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class GUIElement(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class GUIText(GUIElement): - m_Alignment: int - m_Anchor: int - m_Enabled: int - m_Font: PPtr[Font] - m_FontSize: int - m_FontStyle: int - m_GameObject: PPtr[GameObject] - m_LineSpacing: float - m_Material: PPtr[Material] - m_PixelCorrect: bool - m_PixelOffset: Vector2f - m_TabSize: float - m_Text: str - m_Color: Optional[ColorRGBA] = None - m_RichText: Optional[bool] = None + m_Alignment: int + m_Anchor: int + m_Enabled: int + m_Font: PPtr[Font] + m_FontSize: int + m_FontStyle: int + m_GameObject: PPtr[GameObject] + m_LineSpacing: float + m_Material: PPtr[Material] + m_PixelCorrect: bool + m_PixelOffset: Vector2f + m_TabSize: float + m_Text: str + m_Color: Optional[ColorRGBA] = None + m_RichText: Optional[bool] = None @unitypy_define class GUITexture(GUIElement): - m_BottomBorder: int - m_Color: ColorRGBA - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_LeftBorder: int - m_PixelInset: Rectf - m_RightBorder: int - m_Texture: PPtr[Texture] - m_TopBorder: int + m_BottomBorder: int + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LeftBorder: int + m_PixelInset: Rectf + m_RightBorder: int + m_Texture: PPtr[Texture] + m_TopBorder: int @unitypy_define class GUILayer(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class GridLayout(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class Grid(GridLayout): - m_CellGap: Vector3f - m_CellLayout: int - m_CellSize: Vector3f - m_CellSwizzle: int - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_CellGap: Vector3f + m_CellLayout: int + m_CellSize: Vector3f + m_CellSwizzle: int + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class Tilemap(GridLayout): - m_AnimatedTiles: List[Tuple[int3_storage, TileAnimationData]] - m_AnimationFrameRate: float - m_Color: ColorRGBA - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Origin: int3_storage - m_Size: int3_storage - m_TileAnchor: Vector3f - m_TileAssetArray: List[TilemapRefCountedData] - m_TileColorArray: List[TilemapRefCountedData] - m_TileMatrixArray: List[TilemapRefCountedData] - m_TileOrientation: int - m_TileOrientationMatrix: Matrix4x4f - m_TileSpriteArray: List[TilemapRefCountedData] - m_Tiles: List[Tuple[int3_storage, Tile]] - m_TileObjectToInstantiateArray: Optional[List[TilemapRefCountedData]] = None + m_AnimatedTiles: List[Tuple[int3_storage, TileAnimationData]] + m_AnimationFrameRate: float + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Origin: int3_storage + m_Size: int3_storage + m_TileAnchor: Vector3f + m_TileAssetArray: List[TilemapRefCountedData] + m_TileColorArray: List[TilemapRefCountedData] + m_TileMatrixArray: List[TilemapRefCountedData] + m_TileOrientation: int + m_TileOrientationMatrix: Matrix4x4f + m_TileSpriteArray: List[TilemapRefCountedData] + m_Tiles: List[Tuple[int3_storage, Tile]] + m_TileObjectToInstantiateArray: Optional[List[TilemapRefCountedData]] = None @unitypy_define class Halo(Behaviour): - m_Color: ColorRGBA - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Size: float + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Size: float @unitypy_define class HaloLayer(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class IConstraint(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class AimConstraint(IConstraint): - m_AffectRotationX: bool - m_AffectRotationY: bool - m_AffectRotationZ: bool - m_AimVector: Vector3f - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_RotationAtRest: Vector3f - m_RotationOffset: Vector3f - m_Sources: List[ConstraintSource] - m_UpType: int - m_UpVector: Vector3f - m_Weight: float - m_WorldUpObject: PPtr[Transform] - m_WorldUpVector: Vector3f - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_AimVector: Vector3f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_UpType: int + m_UpVector: Vector3f + m_Weight: float + m_WorldUpObject: PPtr[Transform] + m_WorldUpVector: Vector3f + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class LookAtConstraint(IConstraint): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Roll: float - m_RotationAtRest: Vector3f - m_RotationOffset: Vector3f - m_Sources: List[ConstraintSource] - m_UseUpObject: bool - m_Weight: float - m_WorldUpObject: PPtr[Transform] - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Roll: float + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_UseUpObject: bool + m_Weight: float + m_WorldUpObject: PPtr[Transform] + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class ParentConstraint(IConstraint): - m_AffectRotationX: bool - m_AffectRotationY: bool - m_AffectRotationZ: bool - m_AffectTranslationX: bool - m_AffectTranslationY: bool - m_AffectTranslationZ: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_RotationAtRest: Vector3f - m_RotationOffsets: List[Vector3f] - m_Sources: List[ConstraintSource] - m_TranslationAtRest: Vector3f - m_TranslationOffsets: List[Vector3f] - m_Weight: float - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_AffectTranslationX: bool + m_AffectTranslationY: bool + m_AffectTranslationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffsets: List[Vector3f] + m_Sources: List[ConstraintSource] + m_TranslationAtRest: Vector3f + m_TranslationOffsets: List[Vector3f] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class PositionConstraint(IConstraint): - m_AffectTranslationX: bool - m_AffectTranslationY: bool - m_AffectTranslationZ: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Sources: List[ConstraintSource] - m_TranslationAtRest: Vector3f - m_TranslationOffset: Vector3f - m_Weight: float - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_AffectTranslationX: bool + m_AffectTranslationY: bool + m_AffectTranslationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Sources: List[ConstraintSource] + m_TranslationAtRest: Vector3f + m_TranslationOffset: Vector3f + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class RotationConstraint(IConstraint): - m_AffectRotationX: bool - m_AffectRotationY: bool - m_AffectRotationZ: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_RotationAtRest: Vector3f - m_RotationOffset: Vector3f - m_Sources: List[ConstraintSource] - m_Weight: float - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class ScaleConstraint(IConstraint): - m_AffectScalingX: bool - m_AffectScalingY: bool - m_AffectScalingZ: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_ScaleAtRest: Vector3f - m_ScaleOffset: Vector3f - m_Sources: List[ConstraintSource] - m_Weight: float - m_Active: Optional[bool] = None - m_IsContraintActive: Optional[bool] = None + m_AffectScalingX: bool + m_AffectScalingY: bool + m_AffectScalingZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ScaleAtRest: Vector3f + m_ScaleOffset: Vector3f + m_Sources: List[ConstraintSource] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None @unitypy_define class Joint2D(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class AnchoredJoint2D(Joint2D): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class DistanceJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_Distance: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_AutoConfigureDistance: Optional[bool] = None - m_BreakAction: Optional[int] = None - m_BreakForce: Optional[float] = None - m_BreakTorque: Optional[float] = None - m_CollideConnected: Optional[bool] = None - m_EnableCollision: Optional[bool] = None - m_MaxDistanceOnly: Optional[bool] = None + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Distance: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_AutoConfigureDistance: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + m_MaxDistanceOnly: Optional[bool] = None @unitypy_define class FixedJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_AutoConfigureConnectedAnchor: bool - m_BreakForce: float - m_BreakTorque: float - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_DampingRatio: float - m_EnableCollision: bool - m_Enabled: int - m_Frequency: float - m_GameObject: PPtr[GameObject] - m_BreakAction: Optional[int] = None + m_Anchor: Vector2f + m_AutoConfigureConnectedAnchor: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_EnableCollision: bool + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_BreakAction: Optional[int] = None @unitypy_define class FrictionJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_AutoConfigureConnectedAnchor: bool - m_BreakForce: float - m_BreakTorque: float - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_EnableCollision: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_MaxForce: float - m_MaxTorque: float - m_BreakAction: Optional[int] = None + m_Anchor: Vector2f + m_AutoConfigureConnectedAnchor: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_EnableCollision: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_MaxForce: float + m_MaxTorque: float + m_BreakAction: Optional[int] = None @unitypy_define class HingeJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_AngleLimits: Union[JointAngleLimit2D, JointAngleLimits2D] - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Motor: JointMotor2D - m_UseLimits: bool - m_UseMotor: bool - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_BreakAction: Optional[int] = None - m_BreakForce: Optional[float] = None - m_BreakTorque: Optional[float] = None - m_CollideConnected: Optional[bool] = None - m_EnableCollision: Optional[bool] = None - m_UseConnectedAnchor: Optional[bool] = None + m_Anchor: Vector2f + m_AngleLimits: Union[JointAngleLimit2D, JointAngleLimits2D] + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_UseLimits: bool + m_UseMotor: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + m_UseConnectedAnchor: Optional[bool] = None @unitypy_define class SliderJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_Angle: float - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Motor: JointMotor2D - m_TranslationLimits: JointTranslationLimits2D - m_UseLimits: bool - m_UseMotor: bool - m_AutoConfigureAngle: Optional[bool] = None - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_BreakAction: Optional[int] = None - m_BreakForce: Optional[float] = None - m_BreakTorque: Optional[float] = None - m_CollideConnected: Optional[bool] = None - m_EnableCollision: Optional[bool] = None + m_Anchor: Vector2f + m_Angle: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_TranslationLimits: JointTranslationLimits2D + m_UseLimits: bool + m_UseMotor: bool + m_AutoConfigureAngle: Optional[bool] = None + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None @unitypy_define class SpringJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_DampingRatio: float - m_Distance: float - m_Enabled: int - m_Frequency: float - m_GameObject: PPtr[GameObject] - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_AutoConfigureDistance: Optional[bool] = None - m_BreakAction: Optional[int] = None - m_BreakForce: Optional[float] = None - m_BreakTorque: Optional[float] = None - m_CollideConnected: Optional[bool] = None - m_EnableCollision: Optional[bool] = None + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_Distance: float + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_AutoConfigureDistance: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None @unitypy_define class WheelJoint2D(AnchoredJoint2D): - m_Anchor: Vector2f - m_ConnectedAnchor: Vector2f - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Motor: JointMotor2D - m_Suspension: JointSuspension2D - m_UseMotor: bool - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_BreakAction: Optional[int] = None - m_BreakForce: Optional[float] = None - m_BreakTorque: Optional[float] = None - m_CollideConnected: Optional[bool] = None - m_EnableCollision: Optional[bool] = None + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_Suspension: JointSuspension2D + m_UseMotor: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None @unitypy_define class RelativeJoint2D(Joint2D): - m_AngularOffset: float - m_AutoConfigureOffset: bool - m_BreakForce: float - m_BreakTorque: float - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_CorrectionScale: float - m_EnableCollision: bool - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_LinearOffset: Vector2f - m_MaxForce: float - m_MaxTorque: float - m_BreakAction: Optional[int] = None + m_AngularOffset: float + m_AutoConfigureOffset: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_CorrectionScale: float + m_EnableCollision: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LinearOffset: Vector2f + m_MaxForce: float + m_MaxTorque: float + m_BreakAction: Optional[int] = None @unitypy_define class TargetJoint2D(Joint2D): - m_Anchor: Vector2f - m_AutoConfigureTarget: bool - m_BreakForce: float - m_BreakTorque: float - m_ConnectedRigidBody: PPtr[Rigidbody2D] - m_DampingRatio: float - m_EnableCollision: bool - m_Enabled: int - m_Frequency: float - m_GameObject: PPtr[GameObject] - m_MaxForce: float - m_Target: Vector2f - m_BreakAction: Optional[int] = None + m_Anchor: Vector2f + m_AutoConfigureTarget: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_EnableCollision: bool + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_MaxForce: float + m_Target: Vector2f + m_BreakAction: Optional[int] = None @unitypy_define class LensFlare(Behaviour): - m_Brightness: float - m_Color: ColorRGBA - m_Directional: bool - m_Enabled: int - m_Flare: PPtr[Flare] - m_GameObject: PPtr[GameObject] - m_IgnoreLayers: BitField - m_FadeSpeed: Optional[float] = None + m_Brightness: float + m_Color: ColorRGBA + m_Directional: bool + m_Enabled: int + m_Flare: PPtr[Flare] + m_GameObject: PPtr[GameObject] + m_IgnoreLayers: BitField + m_FadeSpeed: Optional[float] = None @unitypy_define class Light(Behaviour): - m_Color: ColorRGBA - m_Cookie: PPtr[Texture] - m_CookieSize: float - m_CullingMask: BitField - m_DrawHalo: bool - m_Enabled: int - m_Flare: PPtr[Flare] - m_GameObject: PPtr[GameObject] - m_Intensity: float - m_Lightmapping: int - m_Range: float - m_RenderMode: int - m_Shadows: ShadowSettings - m_SpotAngle: float - m_Type: int - m_ActuallyLightmapped: Optional[bool] = None - m_AreaSize: Optional[Vector2f] = None - m_BakedIndex: Optional[int] = None - m_BakingOutput: Optional[LightBakingOutput] = None - m_BounceIntensity: Optional[float] = None - m_BoundingSphereOverride: Optional[Vector4f] = None - m_CCT: Optional[float] = None - m_ColorTemperature: Optional[float] = None - m_EnableSpotReflector: Optional[bool] = None - m_FalloffTable: Optional[FalloffTable] = None - m_ForceVisible: Optional[bool] = None - m_InnerSpotAngle: Optional[float] = None - m_LightShadowCasterMode: Optional[int] = None - m_LightUnit: Optional[int] = None - m_LuxAtDistance: Optional[float] = None - m_RenderingLayerMask: Optional[int] = None - m_Shape: Optional[int] = None - m_UseBoundingSphereOverride: Optional[bool] = None - m_UseColorTemperature: Optional[bool] = None - m_UseViewFrustumForShadowCasterCull: Optional[bool] = None + m_Color: ColorRGBA + m_Cookie: PPtr[Texture] + m_CullingMask: BitField + m_DrawHalo: bool + m_Enabled: int + m_Flare: PPtr[Flare] + m_GameObject: PPtr[GameObject] + m_Intensity: float + m_Lightmapping: int + m_Range: float + m_RenderMode: int + m_Shadows: ShadowSettings + m_SpotAngle: float + m_Type: int + m_ActuallyLightmapped: Optional[bool] = None + m_AreaSize: Optional[Vector2f] = None + m_BakedIndex: Optional[int] = None + m_BakingOutput: Optional[LightBakingOutput] = None + m_BounceIntensity: Optional[float] = None + m_BoundingSphereOverride: Optional[Vector4f] = None + m_CCT: Optional[float] = None + m_ColorTemperature: Optional[float] = None + m_CookieSize: Optional[float] = None + m_CookieSize2D: Optional[Vector2f] = None + m_EnableSpotReflector: Optional[bool] = None + m_FalloffTable: Optional[FalloffTable] = None + m_ForceVisible: Optional[bool] = None + m_InnerSpotAngle: Optional[float] = None + m_LightShadowCasterMode: Optional[int] = None + m_LightUnit: Optional[int] = None + m_LuxAtDistance: Optional[float] = None + m_RenderingLayerMask: Optional[int] = None + m_Shape: Optional[int] = None + m_ShapeRadius: Optional[float] = None + m_UseBoundingSphereOverride: Optional[bool] = None + m_UseColorTemperature: Optional[bool] = None + m_UseViewFrustumForShadowCasterCull: Optional[bool] = None @unitypy_define class LightProbeGroup(Behaviour): - m_GameObject: PPtr[GameObject] - m_Enabled: Optional[int] = None + m_GameObject: PPtr[GameObject] + m_Enabled: Optional[int] = None @unitypy_define class LightProbeProxyVolume(Behaviour): - m_BoundingBoxMode: int - m_BoundingBoxOrigin: Vector3f - m_BoundingBoxSize: Vector3f - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_ProbePositionMode: int - m_RefreshMode: int - m_ResolutionMode: int - m_ResolutionProbesPerUnit: float - m_ResolutionX: int - m_ResolutionY: int - m_ResolutionZ: int - m_DataFormat: Optional[int] = None - m_QualityMode: Optional[int] = None + m_BoundingBoxMode: int + m_BoundingBoxOrigin: Vector3f + m_BoundingBoxSize: Vector3f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ProbePositionMode: int + m_RefreshMode: int + m_ResolutionMode: int + m_ResolutionProbesPerUnit: float + m_ResolutionX: int + m_ResolutionY: int + m_ResolutionZ: int + m_DataFormat: Optional[int] = None + m_QualityMode: Optional[int] = None @unitypy_define class MonoBehaviour(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Name: str - m_Script: PPtr[MonoScript] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Name: str + m_Script: PPtr[MonoScript] @unitypy_define class NavMeshAgent(Behaviour): - m_Acceleration: float - m_AngularSpeed: float - m_AutoRepath: bool - m_AutoTraverseOffMeshLink: bool - m_BaseOffset: float - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Height: float - m_ObstacleAvoidanceType: int - m_Radius: float - m_Speed: float - m_StoppingDistance: float - m_WalkableMask: int - avoidancePriority: Optional[int] = None - m_AgentTypeID: Optional[int] = None - m_AutoBraking: Optional[bool] = None + m_Acceleration: float + m_AngularSpeed: float + m_AutoRepath: bool + m_AutoTraverseOffMeshLink: bool + m_BaseOffset: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Height: float + m_ObstacleAvoidanceType: int + m_Radius: float + m_Speed: float + m_StoppingDistance: float + m_WalkableMask: int + avoidancePriority: Optional[int] = None + m_AgentTypeID: Optional[int] = None + m_AutoBraking: Optional[bool] = None @unitypy_define class NavMeshObstacle(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Carve: Optional[bool] = None - m_CarveOnlyStationary: Optional[bool] = None - m_Center: Optional[Vector3f] = None - m_Extents: Optional[Vector3f] = None - m_Height: Optional[float] = None - m_MoveThreshold: Optional[float] = None - m_Radius: Optional[float] = None - m_Shape: Optional[int] = None - m_TimeToStationary: Optional[float] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Carve: Optional[bool] = None + m_CarveOnlyStationary: Optional[bool] = None + m_Center: Optional[Vector3f] = None + m_Extents: Optional[Vector3f] = None + m_Height: Optional[float] = None + m_MoveThreshold: Optional[float] = None + m_Radius: Optional[float] = None + m_Shape: Optional[int] = None + m_TimeToStationary: Optional[float] = None @unitypy_define class NetworkView(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Observed: PPtr[Component] - m_StateSynchronization: int - m_ViewID: NetworkViewID + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Observed: PPtr[Component] + m_StateSynchronization: int + m_ViewID: NetworkViewID @unitypy_define class OffMeshLink(Behaviour): - m_Activated: bool - m_BiDirectional: bool - m_CostOverride: float - m_End: PPtr[Transform] - m_GameObject: PPtr[GameObject] - m_Start: PPtr[Transform] - m_AgentTypeID: Optional[int] = None - m_AreaIndex: Optional[int] = None - m_AutoUpdatePositions: Optional[bool] = None - m_DtPolyRef: Optional[int] = None - m_Enabled: Optional[int] = None - m_NavMeshLayer: Optional[int] = None + m_Activated: bool + m_BiDirectional: bool + m_CostOverride: float + m_End: PPtr[Transform] + m_GameObject: PPtr[GameObject] + m_Start: PPtr[Transform] + m_AgentTypeID: Optional[int] = None + m_AreaIndex: Optional[int] = None + m_AutoUpdatePositions: Optional[bool] = None + m_DtPolyRef: Optional[int] = None + m_Enabled: Optional[int] = None + m_NavMeshLayer: Optional[int] = None @unitypy_define class ParticleSystemForceField(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Parameters: ParticleSystemForceFieldParameters + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Parameters: ParticleSystemForceFieldParameters @unitypy_define class PhysicsUpdateBehaviour2D(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class ConstantForce2D(PhysicsUpdateBehaviour2D): - m_Enabled: int - m_Force: Vector2f - m_GameObject: PPtr[GameObject] - m_RelativeForce: Vector2f - m_Torque: float + m_Enabled: int + m_Force: Vector2f + m_GameObject: PPtr[GameObject] + m_RelativeForce: Vector2f + m_Torque: float @unitypy_define class PlayableDirector(Behaviour): - m_DirectorUpdateMode: int - m_Enabled: int - m_ExposedReferences: ExposedReferenceTable - m_GameObject: PPtr[GameObject] - m_InitialState: int - m_InitialTime: float - m_PlayableAsset: PPtr[Object] - m_SceneBindings: List[DirectorGenericBinding] - m_WrapMode: int + m_DirectorUpdateMode: int + m_Enabled: int + m_ExposedReferences: ExposedReferenceTable + m_GameObject: PPtr[GameObject] + m_InitialState: int + m_InitialTime: float + m_PlayableAsset: PPtr[Object] + m_SceneBindings: List[DirectorGenericBinding] + m_WrapMode: int @unitypy_define class Projector(Behaviour): - m_AspectRatio: float - m_Enabled: int - m_FarClipPlane: float - m_FieldOfView: float - m_GameObject: PPtr[GameObject] - m_IgnoreLayers: BitField - m_Material: PPtr[Material] - m_NearClipPlane: float - m_Orthographic: bool - m_OrthographicSize: float + m_AspectRatio: float + m_Enabled: int + m_FarClipPlane: float + m_FieldOfView: float + m_GameObject: PPtr[GameObject] + m_IgnoreLayers: BitField + m_Material: PPtr[Material] + m_NearClipPlane: float + m_Orthographic: bool + m_OrthographicSize: float @unitypy_define class ReflectionProbe(Behaviour): - m_BackGroundColor: ColorRGBA - m_BakedTexture: PPtr[Texture] - m_BoxOffset: Vector3f - m_BoxProjection: bool - m_BoxSize: Vector3f - m_ClearFlags: int - m_CullingMask: BitField - m_CustomBakedTexture: PPtr[Texture] - m_Enabled: int - m_FarClip: float - m_GameObject: PPtr[GameObject] - m_HDR: bool - m_Importance: int - m_IntensityMultiplier: float - m_Mode: int - m_NearClip: float - m_RefreshMode: int - m_RenderDynamicObjects: bool - m_Resolution: int - m_ShadowDistance: float - m_TimeSlicingMode: int - m_Type: int - m_UpdateFrequency: int - m_UseOcclusionCulling: bool - m_BlendDistance: Optional[float] = None + m_BackGroundColor: ColorRGBA + m_BakedTexture: PPtr[Texture] + m_BoxOffset: Vector3f + m_BoxProjection: bool + m_BoxSize: Vector3f + m_ClearFlags: int + m_CullingMask: BitField + m_CustomBakedTexture: PPtr[Texture] + m_Enabled: int + m_FarClip: float + m_GameObject: PPtr[GameObject] + m_HDR: bool + m_Importance: int + m_IntensityMultiplier: float + m_Mode: int + m_NearClip: float + m_RefreshMode: int + m_RenderDynamicObjects: bool + m_Resolution: int + m_ShadowDistance: float + m_TimeSlicingMode: int + m_Type: int + m_UpdateFrequency: int + m_UseOcclusionCulling: bool + m_BlendDistance: Optional[float] = None @unitypy_define class Skybox(Behaviour): - m_CustomSkybox: PPtr[Material] - m_Enabled: int - m_GameObject: PPtr[GameObject] + m_CustomSkybox: PPtr[Material] + m_Enabled: int + m_GameObject: PPtr[GameObject] @unitypy_define class SortingGroup(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_SortingLayer: int - m_SortingOrder: int - m_SortAtRoot: Optional[bool] = None - m_SortingLayerID: Optional[int] = None + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_SortingLayer: int + m_SortingOrder: int + m_Sort3DAs2D: Optional[bool] = None + m_SortAtRoot: Optional[bool] = None + m_SortingLayerID: Optional[int] = None @unitypy_define class StreamingController(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_StreamingMipmapBias: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_StreamingMipmapBias: float @unitypy_define class Terrain(Behaviour): - m_BakeLightProbesForTrees: bool - m_ChunkDynamicUVST: Vector4f - m_DetailObjectDensity: float - m_DetailObjectDistance: float - m_DrawHeightmap: bool - m_DrawTreesAndFoliage: bool - m_DynamicUVST: Vector4f - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_HeightmapMaximumLOD: int - m_HeightmapPixelError: float - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_MaterialTemplate: PPtr[Material] - m_ReflectionProbeUsage: int - m_SplatMapDistance: float - m_TerrainData: PPtr[TerrainData] - m_TreeBillboardDistance: float - m_TreeCrossFadeLength: float - m_TreeDistance: float - m_TreeMaximumFullLODCount: int - m_AllowAutoConnect: Optional[bool] = None - m_CastShadows: Optional[bool] = None - m_DefaultSmoothness: Optional[float] = None - m_DrawInstanced: Optional[bool] = None - m_EnableHeightmapRayTracing: Optional[bool] = None - m_EnableTreesAndDetailsRayTracing: Optional[bool] = None - m_ExplicitProbeSetHash: Optional[Hash128] = None - m_GroupingID: Optional[int] = None - m_HeightmapMinimumLODSimplification: Optional[int] = None - m_IgnoreQualitySettings: Optional[bool] = None - m_LegacyShininess: Optional[float] = None - m_LegacySpecular: Optional[ColorRGBA] = None - m_MaterialType: Optional[int] = None - m_PreserveTreePrototypeLayers: Optional[bool] = None - m_RenderingLayerMask: Optional[int] = None - m_ShadowCastingMode: Optional[int] = None - m_StaticShadowCaster: Optional[bool] = None - m_TreeMotionVectorModeOverride: Optional[int] = None - m_UseDefaultSmoothness: Optional[bool] = None + m_BakeLightProbesForTrees: bool + m_ChunkDynamicUVST: Vector4f + m_DetailObjectDensity: float + m_DetailObjectDistance: float + m_DrawHeightmap: bool + m_DrawTreesAndFoliage: bool + m_DynamicUVST: Vector4f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HeightmapMaximumLOD: int + m_HeightmapPixelError: float + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaterialTemplate: PPtr[Material] + m_ReflectionProbeUsage: int + m_SplatMapDistance: float + m_TerrainData: PPtr[TerrainData] + m_TreeBillboardDistance: float + m_TreeCrossFadeLength: float + m_TreeDistance: float + m_TreeMaximumFullLODCount: int + m_AllowAutoConnect: Optional[bool] = None + m_CastShadows: Optional[bool] = None + m_DefaultSmoothness: Optional[float] = None + m_DrawInstanced: Optional[bool] = None + m_EnableHeightmapLODFrustumCulling: Optional[bool] = None + m_EnableHeightmapRayTracing: Optional[bool] = None + m_EnableTreesAndDetailsRayTracing: Optional[bool] = None + m_ExplicitProbeSetHash: Optional[Hash128] = None + m_GroupingID: Optional[int] = None + m_HeightmapMinimumLODSimplification: Optional[int] = None + m_IgnoreQualitySettings: Optional[bool] = None + m_LegacyShininess: Optional[float] = None + m_LegacySpecular: Optional[ColorRGBA] = None + m_MaterialType: Optional[int] = None + m_PreserveTreePrototypeLayers: Optional[bool] = None + m_RenderingLayerMask: Optional[int] = None + m_ShadowCastingMode: Optional[int] = None + m_StaticShadowCaster: Optional[bool] = None + m_TreeMotionVectorModeOverride: Optional[int] = None + m_UseDefaultSmoothness: Optional[bool] = None @unitypy_define class VideoPlayer(Behaviour): - m_AspectRatio: int - m_AudioOutputMode: int - m_ControlledAudioTrackCount: int - m_DataSource: int - m_DirectAudioMutes: List[bool] - m_DirectAudioVolumes: List[float] - m_Enabled: int - m_EnabledAudioTracks: List[bool] - m_FrameReadyEventEnabled: bool - m_GameObject: PPtr[GameObject] - m_Looping: bool - m_PlayOnAwake: bool - m_PlaybackSpeed: float - m_RenderMode: int - m_SkipOnDrop: bool - m_TargetAudioSources: List[PPtr[AudioSource]] - m_TargetCamera: PPtr[Camera] - m_TargetCameraAlpha: float - m_TargetMaterialProperty: str - m_TargetMaterialRenderer: PPtr[Renderer] - m_TargetTexture: PPtr[RenderTexture] - m_Url: str - m_VideoClip: PPtr[VideoClip] - m_WaitForFirstFrame: bool - m_TargetCamera3DLayout: Optional[int] = None - m_TargetMaterialName: Optional[str] = None - m_TimeReference: Optional[int] = None - m_TimeUpdateMode: Optional[int] = None - m_VideoShaders: Optional[List[PPtr[Shader]]] = None + m_AspectRatio: int + m_AudioOutputMode: int + m_ControlledAudioTrackCount: int + m_DataSource: int + m_DirectAudioMutes: List[bool] + m_DirectAudioVolumes: List[float] + m_Enabled: int + m_EnabledAudioTracks: List[bool] + m_FrameReadyEventEnabled: bool + m_GameObject: PPtr[GameObject] + m_Looping: bool + m_PlayOnAwake: bool + m_PlaybackSpeed: float + m_RenderMode: int + m_SkipOnDrop: bool + m_TargetAudioSources: List[PPtr[AudioSource]] + m_TargetCamera: PPtr[Camera] + m_TargetCameraAlpha: float + m_TargetMaterialProperty: str + m_TargetMaterialRenderer: PPtr[Renderer] + m_TargetTexture: PPtr[RenderTexture] + m_Url: str + m_VideoClip: PPtr[VideoClip] + m_WaitForFirstFrame: bool + m_TargetCamera3DLayout: Optional[int] = None + m_TargetMaterialName: Optional[str] = None + m_TimeReference: Optional[int] = None + m_TimeUpdateMode: Optional[int] = None + m_VideoShaders: Optional[List[PPtr[Shader]]] = None @unitypy_define class VisualEffect(Behaviour): - m_Asset: PPtr[VisualEffectAsset] - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_PropertySheet: VFXPropertySheetSerializedBase - m_ResetSeedOnPlay: Union[bool, int] - m_StartSeed: int - m_AllowInstancing: Optional[int] = None - m_InitialEventName: Optional[str] = None - m_InitialEventNameOverriden: Optional[int] = None + m_Asset: PPtr[VisualEffectAsset] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PropertySheet: VFXPropertySheetSerializedBase + m_ResetSeedOnPlay: Union[bool, int] + m_StartSeed: int + m_AllowInstancing: Optional[int] = None + m_InitialEventName: Optional[str] = None + m_InitialEventNameOverriden: Optional[int] = None + m_ReleaseInstanceOnDisable: Optional[int] = None @unitypy_define class WindZone(Behaviour): - m_Enabled: int - m_GameObject: PPtr[GameObject] - m_Mode: int - m_Radius: float - m_WindMain: float - m_WindPulseFrequency: float - m_WindPulseMagnitude: float - m_WindTurbulence: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Mode: int + m_Radius: float + m_WindMain: float + m_WindPulseFrequency: float + m_WindPulseMagnitude: float + m_WindTurbulence: float @unitypy_define class CanvasRenderer(Component): - m_GameObject: PPtr[GameObject] - m_CullTransparentMesh: Optional[bool] = None + m_GameObject: PPtr[GameObject] + m_CullTransparentMesh: Optional[bool] = None @unitypy_define class Collider(Component): - m_GameObject: Optional[PPtr[GameObject]] = None - m_MaxLimitX: Optional[float] = None - m_MaxLimitY: Optional[float] = None - m_MaxLimitZ: Optional[float] = None - m_MinLimitX: Optional[float] = None - m_Type: Optional[int] = None - m_X: Optional[xform] = None - m_XMotionType: Optional[int] = None - m_YMotionType: Optional[int] = None - m_ZMotionType: Optional[int] = None + m_GameObject: Optional[PPtr[GameObject]] = None + m_MaxLimitX: Optional[float] = None + m_MaxLimitY: Optional[float] = None + m_MaxLimitZ: Optional[float] = None + m_MinLimitX: Optional[float] = None + m_Type: Optional[int] = None + m_X: Optional[xform] = None + m_XMotionType: Optional[int] = None + m_YMotionType: Optional[int] = None + m_ZMotionType: Optional[int] = None @unitypy_define class BoxCollider(Collider): - m_Center: Vector3f - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] - m_Size: Vector3f - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_ProvidesContacts: Optional[bool] = None + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Size: Vector3f + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None @unitypy_define class CapsuleCollider(Collider): - m_Center: Vector3f - m_Direction: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_Height: float - m_IsTrigger: bool - m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] - m_Radius: float - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_ProvidesContacts: Optional[bool] = None + m_Center: Vector3f + m_Direction: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_Height: float + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Radius: float + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None @unitypy_define class CharacterController(Collider): - m_Center: Vector3f - m_GameObject: PPtr[GameObject] - m_Height: float - m_MinMoveDistance: float - m_Radius: float - m_SkinWidth: float - m_SlopeLimit: float - m_StepOffset: float - m_Enabled: Optional[bool] = None - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_IsTrigger: Optional[bool] = None - m_LayerOverridePriority: Optional[int] = None - m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None - m_ProvidesContacts: Optional[bool] = None + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_Height: float + m_MinMoveDistance: float + m_Radius: float + m_SkinWidth: float + m_SlopeLimit: float + m_StepOffset: float + m_Enabled: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_IsTrigger: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None + m_ProvidesContacts: Optional[bool] = None @unitypy_define class MeshCollider(Collider): - m_Convex: bool - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] - m_Mesh: PPtr[Mesh] - m_CookingOptions: Optional[int] = None - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_InflateMesh: Optional[bool] = None - m_LayerOverridePriority: Optional[int] = None - m_ProvidesContacts: Optional[bool] = None - m_SkinWidth: Optional[float] = None - m_SmoothSphereCollisions: Optional[bool] = None + m_Convex: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Mesh: PPtr[Mesh] + m_CookingOptions: Optional[int] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_InflateMesh: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + m_SkinWidth: Optional[float] = None + m_SmoothSphereCollisions: Optional[bool] = None @unitypy_define class RaycastCollider(Collider): - m_Center: Vector3f - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Length: float - m_Material: PPtr[PhysicMaterial] + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Length: float + m_Material: PPtr[PhysicMaterial] @unitypy_define class SphereCollider(Collider): - m_Center: Vector3f - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_IsTrigger: bool - m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] - m_Radius: float - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_ProvidesContacts: Optional[bool] = None + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Radius: float + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None @unitypy_define class TerrainCollider(Collider): - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_TerrainData: PPtr[TerrainData] - m_CreateTreeColliders: Optional[bool] = None - m_EnableTreeColliders: Optional[bool] = None - m_ExcludeLayers: Optional[BitField] = None - m_IncludeLayers: Optional[BitField] = None - m_IsTrigger: Optional[bool] = None - m_LayerOverridePriority: Optional[int] = None - m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None - m_ProvidesContacts: Optional[bool] = None + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_TerrainData: PPtr[TerrainData] + m_CreateTreeColliders: Optional[bool] = None + m_EnableTreeColliders: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_IsTrigger: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None + m_ProvidesContacts: Optional[bool] = None @unitypy_define class WheelCollider(Collider): - m_Center: Vector3f - m_ForwardFriction: WheelFrictionCurve - m_GameObject: PPtr[GameObject] - m_Mass: float - m_Radius: float - m_SidewaysFriction: WheelFrictionCurve - m_SuspensionDistance: float - m_SuspensionSpring: JointSpring - m_Enabled: Optional[bool] = None - m_ExcludeLayers: Optional[BitField] = None - m_ForceAppPointDistance: Optional[float] = None - m_IncludeLayers: Optional[BitField] = None - m_LayerOverridePriority: Optional[int] = None - m_ProvidesContacts: Optional[bool] = None - m_WheelDampingRate: Optional[float] = None + m_Center: Vector3f + m_ForwardFriction: WheelFrictionCurve + m_GameObject: PPtr[GameObject] + m_Mass: float + m_Radius: float + m_SidewaysFriction: WheelFrictionCurve + m_SuspensionDistance: float + m_SuspensionSpring: JointSpring + m_Enabled: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceAppPointDistance: Optional[float] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + m_WheelDampingRate: Optional[float] = None @unitypy_define class FakeComponent(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class Joint(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class CharacterJoint(Joint): - m_Anchor: Vector3f - m_Axis: Vector3f - m_BreakForce: float - m_BreakTorque: float - m_ConnectedBody: PPtr[Rigidbody] - m_GameObject: PPtr[GameObject] - m_HighTwistLimit: SoftJointLimit - m_LowTwistLimit: SoftJointLimit - m_Swing1Limit: SoftJointLimit - m_Swing2Limit: SoftJointLimit - m_SwingAxis: Vector3f - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_ConnectedAnchor: Optional[Vector3f] = None - m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None - m_ConnectedMassScale: Optional[float] = None - m_EnableCollision: Optional[bool] = None - m_EnablePreprocessing: Optional[bool] = None - m_EnableProjection: Optional[bool] = None - m_Enabled: Optional[bool] = None - m_MassScale: Optional[float] = None - m_ProjectionAngle: Optional[float] = None - m_ProjectionDistance: Optional[float] = None - m_SwingLimitSpring: Optional[SoftJointLimitSpring] = None - m_TwistLimitSpring: Optional[SoftJointLimitSpring] = None + m_Anchor: Vector3f + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_HighTwistLimit: SoftJointLimit + m_LowTwistLimit: SoftJointLimit + m_Swing1Limit: SoftJointLimit + m_Swing2Limit: SoftJointLimit + m_SwingAxis: Vector3f + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_EnableProjection: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None + m_ProjectionAngle: Optional[float] = None + m_ProjectionDistance: Optional[float] = None + m_SwingLimitSpring: Optional[SoftJointLimitSpring] = None + m_TwistLimitSpring: Optional[SoftJointLimitSpring] = None @unitypy_define class ConfigurableJoint(Joint): - m_Anchor: Vector3f - m_AngularXDrive: JointDrive - m_AngularXMotion: int - m_AngularYLimit: SoftJointLimit - m_AngularYMotion: int - m_AngularYZDrive: JointDrive - m_AngularZLimit: SoftJointLimit - m_AngularZMotion: int - m_Axis: Vector3f - m_BreakForce: float - m_BreakTorque: float - m_ConfiguredInWorldSpace: bool - m_ConnectedBody: PPtr[Rigidbody] - m_GameObject: PPtr[GameObject] - m_HighAngularXLimit: SoftJointLimit - m_LinearLimit: SoftJointLimit - m_LowAngularXLimit: SoftJointLimit - m_ProjectionAngle: float - m_ProjectionDistance: float - m_ProjectionMode: int - m_RotationDriveMode: int - m_SecondaryAxis: Vector3f - m_SlerpDrive: JointDrive - m_TargetAngularVelocity: Vector3f - m_TargetPosition: Vector3f - m_TargetRotation: Quaternionf - m_TargetVelocity: Vector3f - m_XDrive: JointDrive - m_XMotion: int - m_YDrive: JointDrive - m_YMotion: int - m_ZDrive: JointDrive - m_ZMotion: int - m_AngularXLimitSpring: Optional[SoftJointLimitSpring] = None - m_AngularYZLimitSpring: Optional[SoftJointLimitSpring] = None - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_ConnectedAnchor: Optional[Vector3f] = None - m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None - m_ConnectedMassScale: Optional[float] = None - m_EnableCollision: Optional[bool] = None - m_EnablePreprocessing: Optional[bool] = None - m_Enabled: Optional[bool] = None - m_LinearLimitSpring: Optional[SoftJointLimitSpring] = None - m_MassScale: Optional[float] = None - m_SwapBodies: Optional[bool] = None + m_Anchor: Vector3f + m_AngularXDrive: JointDrive + m_AngularXMotion: int + m_AngularYLimit: SoftJointLimit + m_AngularYMotion: int + m_AngularYZDrive: JointDrive + m_AngularZLimit: SoftJointLimit + m_AngularZMotion: int + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConfiguredInWorldSpace: bool + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_HighAngularXLimit: SoftJointLimit + m_LinearLimit: SoftJointLimit + m_LowAngularXLimit: SoftJointLimit + m_ProjectionAngle: float + m_ProjectionDistance: float + m_ProjectionMode: int + m_RotationDriveMode: int + m_SecondaryAxis: Vector3f + m_SlerpDrive: JointDrive + m_TargetAngularVelocity: Vector3f + m_TargetPosition: Vector3f + m_TargetRotation: Quaternionf + m_TargetVelocity: Vector3f + m_XDrive: JointDrive + m_XMotion: int + m_YDrive: JointDrive + m_YMotion: int + m_ZDrive: JointDrive + m_ZMotion: int + m_AngularXLimitSpring: Optional[SoftJointLimitSpring] = None + m_AngularYZLimitSpring: Optional[SoftJointLimitSpring] = None + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_LinearLimitSpring: Optional[SoftJointLimitSpring] = None + m_MassScale: Optional[float] = None + m_SwapBodies: Optional[bool] = None @unitypy_define class FixedJoint(Joint): - m_BreakForce: float - m_BreakTorque: float - m_ConnectedBody: PPtr[Rigidbody] - m_GameObject: PPtr[GameObject] - m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None - m_ConnectedMassScale: Optional[float] = None - m_EnableCollision: Optional[bool] = None - m_EnablePreprocessing: Optional[bool] = None - m_Enabled: Optional[bool] = None - m_MassScale: Optional[float] = None + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None @unitypy_define class HingeJoint(Joint): - m_Anchor: Vector3f - m_Axis: Vector3f - m_BreakForce: float - m_BreakTorque: float - m_ConnectedBody: PPtr[Rigidbody] - m_GameObject: PPtr[GameObject] - m_Limits: JointLimits - m_Motor: JointMotor - m_Spring: JointSpring - m_UseLimits: bool - m_UseMotor: bool - m_UseSpring: bool - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_ConnectedAnchor: Optional[Vector3f] = None - m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None - m_ConnectedMassScale: Optional[float] = None - m_EnableCollision: Optional[bool] = None - m_EnablePreprocessing: Optional[bool] = None - m_Enabled: Optional[bool] = None - m_ExtendedLimits: Optional[bool] = None - m_MassScale: Optional[float] = None - m_UseAcceleration: Optional[bool] = None + m_Anchor: Vector3f + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_Limits: JointLimits + m_Motor: JointMotor + m_Spring: JointSpring + m_UseLimits: bool + m_UseMotor: bool + m_UseSpring: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_ExtendedLimits: Optional[bool] = None + m_MassScale: Optional[float] = None + m_UseAcceleration: Optional[bool] = None @unitypy_define class SpringJoint(Joint): - m_Anchor: Vector3f - m_BreakForce: float - m_BreakTorque: float - m_ConnectedBody: PPtr[Rigidbody] - m_Damper: float - m_GameObject: PPtr[GameObject] - m_MaxDistance: float - m_MinDistance: float - m_Spring: float - m_AutoConfigureConnectedAnchor: Optional[bool] = None - m_Axis: Optional[Vector3f] = None - m_ConnectedAnchor: Optional[Vector3f] = None - m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None - m_ConnectedMassScale: Optional[float] = None - m_EnableCollision: Optional[bool] = None - m_EnablePreprocessing: Optional[bool] = None - m_Enabled: Optional[bool] = None - m_MassScale: Optional[float] = None - m_Tolerance: Optional[float] = None + m_Anchor: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_Damper: float + m_GameObject: PPtr[GameObject] + m_MaxDistance: float + m_MinDistance: float + m_Spring: float + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_Axis: Optional[Vector3f] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None + m_Tolerance: Optional[float] = None @unitypy_define class LODGroup(Component): - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LODs: List[LOD] - m_LocalReferencePoint: Vector3f - m_Size: float - m_AnimateCrossFading: Optional[bool] = None - m_FadeMode: Optional[int] = None - m_LastLODIsBillboard: Optional[bool] = None - m_ScreenRelativeTransitionHeight: Optional[float] = None + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LODs: List[LOD] + m_LocalReferencePoint: Vector3f + m_Size: float + m_AnimateCrossFading: Optional[bool] = None + m_FadeMode: Optional[int] = None + m_GlobalIlluminationLOD: Optional[int] = None + m_LastLODIsBillboard: Optional[bool] = None + m_ScreenRelativeTransitionHeight: Optional[float] = None @unitypy_define class MeshFilter(Component): - m_GameObject: PPtr[GameObject] - m_Mesh: PPtr[Mesh] + m_GameObject: PPtr[GameObject] + m_Mesh: PPtr[Mesh] @unitypy_define class MultiplayerRolesData(Component): - m_ComponentsRolesMasks: List[ObjectRolePair] - m_GameObject: PPtr[GameObject] - m_GameObjectRolesMask: int + m_ComponentsRolesMasks: List[ObjectRolePair] + m_GameObject: PPtr[GameObject] + m_GameObjectRolesMask: int @unitypy_define class OcclusionArea(Component): - m_Center: Vector3f - m_GameObject: PPtr[GameObject] - m_IsViewVolume: bool - m_Size: Vector3f - m_IsTargetVolume: Optional[bool] = None - m_TargetResolution: Optional[int] = None + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_IsViewVolume: bool + m_Size: Vector3f + m_IsTargetVolume: Optional[bool] = None + m_TargetResolution: Optional[int] = None @unitypy_define class OcclusionPortal(Component): - m_Center: Vector3f - m_GameObject: PPtr[GameObject] - m_Open: bool - m_Size: Vector3f + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_Open: bool + m_Size: Vector3f @unitypy_define class ParticleAnimator(Component): - Does_Animate_Color: bool - autodestruct: bool - colorAnimation_0_: ColorRGBA - colorAnimation_1_: ColorRGBA - colorAnimation_2_: ColorRGBA - colorAnimation_3_: ColorRGBA - colorAnimation_4_: ColorRGBA - damping: float - force: Vector3f - localRotationAxis: Vector3f - m_GameObject: PPtr[GameObject] - rndForce: Vector3f - sizeGrow: float - stopSimulation: bool - worldRotationAxis: Vector3f + Does_Animate_Color: bool + autodestruct: bool + colorAnimation_0_: ColorRGBA + colorAnimation_1_: ColorRGBA + colorAnimation_2_: ColorRGBA + colorAnimation_3_: ColorRGBA + colorAnimation_4_: ColorRGBA + damping: float + force: Vector3f + localRotationAxis: Vector3f + m_GameObject: PPtr[GameObject] + rndForce: Vector3f + sizeGrow: float + stopSimulation: bool + worldRotationAxis: Vector3f @unitypy_define class ParticleEmitter(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class EllipsoidParticleEmitter(ParticleEmitter): - Simulate_in_Worldspace: bool - angularVelocity: float - emitterVelocityScale: float - localVelocity: Vector3f - m_Ellipsoid: Vector3f - m_Emit: bool - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_MinEmitterRange: float - m_OneShot: bool - maxEmission: float - maxEnergy: float - maxSize: float - minEmission: float - minEnergy: float - minSize: float - rndAngularVelocity: float - rndRotation: bool - rndVelocity: Vector3f - tangentVelocity: Vector3f - worldVelocity: Vector3f + Simulate_in_Worldspace: bool + angularVelocity: float + emitterVelocityScale: float + localVelocity: Vector3f + m_Ellipsoid: Vector3f + m_Emit: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_MinEmitterRange: float + m_OneShot: bool + maxEmission: float + maxEnergy: float + maxSize: float + minEmission: float + minEnergy: float + minSize: float + rndAngularVelocity: float + rndRotation: bool + rndVelocity: Vector3f + tangentVelocity: Vector3f + worldVelocity: Vector3f @unitypy_define class MeshParticleEmitter(ParticleEmitter): - Simulate_in_Worldspace: bool - angularVelocity: float - emitterVelocityScale: float - localVelocity: Vector3f - m_Emit: bool - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_InterpolateTriangles: bool - m_MaxNormalVelocity: float - m_Mesh: PPtr[Mesh] - m_MinNormalVelocity: float - m_OneShot: bool - m_Systematic: bool - maxEmission: float - maxEnergy: float - maxSize: float - minEmission: float - minEnergy: float - minSize: float - rndAngularVelocity: float - rndRotation: bool - rndVelocity: Vector3f - tangentVelocity: Vector3f - worldVelocity: Vector3f + Simulate_in_Worldspace: bool + angularVelocity: float + emitterVelocityScale: float + localVelocity: Vector3f + m_Emit: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_InterpolateTriangles: bool + m_MaxNormalVelocity: float + m_Mesh: PPtr[Mesh] + m_MinNormalVelocity: float + m_OneShot: bool + m_Systematic: bool + maxEmission: float + maxEnergy: float + maxSize: float + minEmission: float + minEnergy: float + minSize: float + rndAngularVelocity: float + rndRotation: bool + rndVelocity: Vector3f + tangentVelocity: Vector3f + worldVelocity: Vector3f @unitypy_define class ParticleSystem(Component): - ClampVelocityModule: ClampVelocityModule - CollisionModule: CollisionModule - ColorBySpeedModule: ColorBySpeedModule - ColorModule: ColorModule - EmissionModule: EmissionModule - ForceModule: ForceModule - InitialModule: InitialModule - RotationBySpeedModule: RotationBySpeedModule - RotationModule: RotationModule - ShapeModule: ShapeModule - SizeBySpeedModule: SizeBySpeedModule - SizeModule: SizeModule - SubModule: SubModule - UVModule: UVModule - VelocityModule: VelocityModule - lengthInSec: float - looping: bool - m_GameObject: PPtr[GameObject] - moveWithTransform: Union[bool, int] - playOnAwake: bool - prewarm: bool - randomSeed: int - startDelay: Union[MinMaxCurve, float] - CustomDataModule: Optional[CustomDataModule] = None - ExternalForcesModule: Optional[ExternalForcesModule] = None - InheritVelocityModule: Optional[InheritVelocityModule] = None - LifetimeByEmitterSpeedModule: Optional[LifetimeByEmitterSpeedModule] = None - LightsModule: Optional[LightsModule] = None - NoiseModule: Optional[NoiseModule] = None - TrailModule: Optional[TrailModule] = None - TriggerModule: Optional[TriggerModule] = None - autoRandomSeed: Optional[bool] = None - cullingMode: Optional[int] = None - emitterVelocityMode: Optional[int] = None - moveWithCustomTransform: Optional[PPtr[Transform]] = None - ringBufferLoopRange: Optional[Vector2f] = None - ringBufferMode: Optional[int] = None - scalingMode: Optional[int] = None - simulationSpeed: Optional[float] = None - speed: Optional[float] = None - stopAction: Optional[int] = None - useRigidbodyForVelocity: Optional[bool] = None - useUnscaledTime: Optional[bool] = None + ClampVelocityModule: ClampVelocityModule + CollisionModule: CollisionModule + ColorBySpeedModule: ColorBySpeedModule + ColorModule: ColorModule + EmissionModule: EmissionModule + ForceModule: ForceModule + InitialModule: InitialModule + RotationBySpeedModule: RotationBySpeedModule + RotationModule: RotationModule + ShapeModule: ShapeModule + SizeBySpeedModule: SizeBySpeedModule + SizeModule: SizeModule + SubModule: SubModule + UVModule: UVModule + VelocityModule: VelocityModule + lengthInSec: float + looping: bool + m_GameObject: PPtr[GameObject] + moveWithTransform: Union[bool, int] + playOnAwake: bool + prewarm: bool + randomSeed: int + startDelay: Union[MinMaxCurve, float] + CustomDataModule: Optional[CustomDataModule] = None + ExternalForcesModule: Optional[ExternalForcesModule] = None + InheritVelocityModule: Optional[InheritVelocityModule] = None + LifetimeByEmitterSpeedModule: Optional[LifetimeByEmitterSpeedModule] = None + LightsModule: Optional[LightsModule] = None + NoiseModule: Optional[NoiseModule] = None + TrailModule: Optional[TrailModule] = None + TriggerModule: Optional[TriggerModule] = None + autoRandomSeed: Optional[bool] = None + cullingMode: Optional[int] = None + emitterVelocityMode: Optional[int] = None + moveWithCustomTransform: Optional[PPtr[Transform]] = None + ringBufferLoopRange: Optional[Vector2f] = None + ringBufferMode: Optional[int] = None + scalingMode: Optional[int] = None + simulationSpeed: Optional[float] = None + speed: Optional[float] = None + stopAction: Optional[int] = None + useRigidbodyForVelocity: Optional[bool] = None + useUnscaledTime: Optional[bool] = None @unitypy_define class Pipeline(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class Renderer(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class BillboardRenderer(Renderer): - m_Billboard: PPtr[BillboardAsset] - m_CastShadows: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_Materials: List[PPtr[Material]] - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: Union[bool, int] - m_ReflectionProbeUsage: int - m_SortingOrder: int - m_StaticBatchRoot: PPtr[Transform] - m_DynamicOccludee: Optional[int] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_MotionVectors: Optional[int] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + m_Billboard: PPtr[BillboardAsset] + m_CastShadows: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_Materials: List[PPtr[Material]] + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: Union[bool, int] + m_ReflectionProbeUsage: int + m_SortingOrder: int + m_StaticBatchRoot: PPtr[Transform] + m_DynamicOccludee: Optional[int] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class ClothRenderer(Renderer): - m_CastShadows: bool - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_PauseWhenNotVisible: bool - m_ReceiveShadows: bool - m_StaticBatchRoot: PPtr[Transform] - m_SubsetIndices: List[int] - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_UseLightProbes: Optional[bool] = None + m_CastShadows: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_PauseWhenNotVisible: bool + m_ReceiveShadows: bool + m_StaticBatchRoot: PPtr[Transform] + m_SubsetIndices: List[int] + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class LineRenderer(Renderer): - m_CastShadows: Union[bool, int] - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_Parameters: LineParameters - m_Positions: List[Vector3f] - m_ReceiveShadows: Union[bool, int] - m_StaticBatchRoot: PPtr[Transform] - m_UseWorldSpace: bool - m_ApplyActiveColorSpace: Optional[bool] = None - m_DynamicOccludee: Optional[int] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_Loop: Optional[bool] = None - m_MaskInteraction: Optional[int] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_Parameters: LineParameters + m_Positions: List[Vector3f] + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_UseWorldSpace: bool + m_ApplyActiveColorSpace: Optional[bool] = None + m_DynamicOccludee: Optional[int] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_Loop: Optional[bool] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class RendererFake(LineRenderer): - m_CastShadows: int - m_DynamicOccludee: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightProbeUsage: int - m_LightProbeVolumeOverride: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_Loop: bool - m_Materials: List[PPtr[Material]] - m_MotionVectors: int - m_Parameters: LineParameters - m_Positions: List[Vector3f] - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: int - m_ReflectionProbeUsage: int - m_RendererPriority: int - m_RenderingLayerMask: int - m_SortingLayer: int - m_SortingLayerID: int - m_SortingOrder: int - m_StaticBatchInfo: StaticBatchInfo - m_StaticBatchRoot: PPtr[Transform] - m_UseWorldSpace: bool - m_RayTraceProcedural: Optional[int] = None - m_RayTracingMode: Optional[int] = None + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_Loop: bool + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_Parameters: LineParameters + m_Positions: List[Vector3f] + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_UseWorldSpace: bool + m_RayTraceProcedural: Optional[int] = None + m_RayTracingMode: Optional[int] = None @unitypy_define class MeshRenderer(Renderer): - m_CastShadows: Union[bool, int] - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_ReceiveShadows: Union[bool, int] - m_StaticBatchRoot: PPtr[Transform] - m_AdditionalVertexStreams: Optional[PPtr[Mesh]] = None - m_DynamicOccludee: Optional[int] = None - m_EnlightenVertexStream: Optional[PPtr[Mesh]] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_AdditionalVertexStreams: Optional[PPtr[Mesh]] = None + m_DynamicOccludee: Optional[int] = None + m_EnlightenVertexStream: Optional[PPtr[Mesh]] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + + +@unitypy_define +class PanelRenderer(Renderer): + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_ForceMeshLod: int + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MeshLodSelectionBias: float + m_MotionVectors: int + m_PanelSettings: PPtr[MonoBehaviour] + m_ParentUI: PPtr[PanelRenderer] + m_Pivot: int + m_PivotReferenceSize: int + m_Position: int + m_ProbeAnchor: PPtr[Transform] + m_RayTraceProcedural: int + m_RayTracingAccelStructBuildFlags: int + m_RayTracingAccelStructBuildFlagsOverride: int + m_RayTracingMode: int + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SmallMeshCulling: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_StaticShadowCaster: int + m_WorldSpaceHeight: float + m_WorldSpaceSizeMode: int + m_WorldSpaceWidth: float + sourceAsset: PPtr[MonoBehaviour] @unitypy_define class ParticleRenderer(Renderer): - UV_Animation: UVAnimation - m_CameraVelocityScale: float - m_CastShadows: Union[bool, int] - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LengthScale: float - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_MaxParticleSize: float - m_ReceiveShadows: Union[bool, int] - m_StaticBatchRoot: PPtr[Transform] - m_StretchParticles: int - m_VelocityScale: float - m_DynamicOccludee: Optional[int] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + UV_Animation: UVAnimation + m_CameraVelocityScale: float + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LengthScale: float + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MaxParticleSize: float + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_StretchParticles: int + m_VelocityScale: float + m_DynamicOccludee: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class ParticleSystemRenderer(Renderer): - m_CameraVelocityScale: float - m_CastShadows: Union[bool, int] - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LengthScale: float - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_MaxParticleSize: float - m_Mesh: PPtr[Mesh] - m_ReceiveShadows: Union[bool, int] - m_RenderMode: int - m_SortMode: int - m_SortingFudge: float - m_StaticBatchRoot: PPtr[Transform] - m_VelocityScale: float - m_AllowRoll: Optional[bool] = None - m_ApplyActiveColorSpace: Optional[bool] = None - m_DynamicOccludee: Optional[int] = None - m_EnableGPUInstancing: Optional[bool] = None - m_Flip: Optional[Vector3f] = None - m_FreeformStretching: Optional[bool] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MaskInteraction: Optional[int] = None - m_Mesh1: Optional[PPtr[Mesh]] = None - m_Mesh2: Optional[PPtr[Mesh]] = None - m_Mesh3: Optional[PPtr[Mesh]] = None - m_MeshDistribution: Optional[int] = None - m_MeshWeighting: Optional[float] = None - m_MeshWeighting1: Optional[float] = None - m_MeshWeighting2: Optional[float] = None - m_MeshWeighting3: Optional[float] = None - m_MinParticleSize: Optional[float] = None - m_MotionVectors: Optional[int] = None - m_NormalDirection: Optional[float] = None - m_Pivot: Optional[Vector3f] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RenderAlignment: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_RotateWithStretchDirection: Optional[bool] = None - m_ShadowBias: Optional[float] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_TrailVertexStreams: Optional[List[int]] = None - m_UseCustomTrailVertexStreams: Optional[bool] = None - m_UseCustomVertexStreams: Optional[bool] = None - m_UseLightProbes: Optional[bool] = None - m_VertexStreamMask: Optional[int] = None - m_VertexStreams: Optional[List[int]] = None + m_CameraVelocityScale: float + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LengthScale: float + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MaxParticleSize: float + m_Mesh: PPtr[Mesh] + m_ReceiveShadows: Union[bool, int] + m_RenderMode: int + m_SortMode: int + m_SortingFudge: float + m_StaticBatchRoot: PPtr[Transform] + m_VelocityScale: float + m_AllowRoll: Optional[bool] = None + m_ApplyActiveColorSpace: Optional[bool] = None + m_DynamicOccludee: Optional[int] = None + m_EnableGPUInstancing: Optional[bool] = None + m_Flip: Optional[Vector3f] = None + m_ForceMeshLod: Optional[int] = None + m_FreeformStretching: Optional[bool] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_Mesh1: Optional[PPtr[Mesh]] = None + m_Mesh2: Optional[PPtr[Mesh]] = None + m_Mesh3: Optional[PPtr[Mesh]] = None + m_MeshDistribution: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MeshWeighting: Optional[float] = None + m_MeshWeighting1: Optional[float] = None + m_MeshWeighting2: Optional[float] = None + m_MeshWeighting3: Optional[float] = None + m_MinParticleSize: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_NormalDirection: Optional[float] = None + m_Pivot: Optional[Vector3f] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RenderAlignment: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_RotateWithStretchDirection: Optional[bool] = None + m_ShadowBias: Optional[float] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_TrailVertexStreams: Optional[List[int]] = None + m_UseCustomTrailVertexStreams: Optional[bool] = None + m_UseCustomVertexStreams: Optional[bool] = None + m_UseLightProbes: Optional[bool] = None + m_VertexStreamMask: Optional[int] = None + m_VertexStreams: Optional[List[int]] = None + + +@unitypy_define +class RenderAs2D(Renderer): + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_ForceMeshLod: int + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MeshLodSelectionBias: float + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_RayTraceProcedural: int + m_RayTracingAccelStructBuildFlags: int + m_RayTracingAccelStructBuildFlagsOverride: int + m_RayTracingMode: int + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SmallMeshCulling: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_StaticShadowCaster: int + m_Owner: Optional[PPtr[Component]] = None + m_OwningSortingGroup: Optional[PPtr[SortingGroup]] = None @unitypy_define class SkinnedMeshRenderer(Renderer): - m_AABB: AABB - m_Bones: List[PPtr[Transform]] - m_CastShadows: Union[bool, int] - m_DirtyAABB: bool - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_Mesh: PPtr[Mesh] - m_Quality: int - m_ReceiveShadows: Union[bool, int] - m_StaticBatchRoot: PPtr[Transform] - m_UpdateWhenOffscreen: bool - m_BlendShapeWeights: Optional[List[float]] = None - m_DynamicOccludee: Optional[int] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_RootBone: Optional[PPtr[Transform]] = None - m_SkinnedMotionVectors: Optional[bool] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + m_AABB: AABB + m_Bones: List[PPtr[Transform]] + m_CastShadows: Union[bool, int] + m_DirtyAABB: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_Mesh: PPtr[Mesh] + m_Quality: int + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_UpdateWhenOffscreen: bool + m_BlendShapeWeights: Optional[List[float]] = None + m_DynamicOccludee: Optional[int] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_RootBone: Optional[PPtr[Transform]] = None + m_SkinnedMotionVectors: Optional[bool] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class SpriteMask(Renderer): - m_BackSortingLayer: int - m_BackSortingOrder: int - m_CastShadows: int - m_Enabled: bool - m_FrontSortingLayer: int - m_FrontSortingOrder: int - m_GameObject: PPtr[GameObject] - m_IsCustomRangeActive: bool - m_LightProbeUsage: int - m_LightProbeVolumeOverride: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_MaskAlphaCutoff: float - m_Materials: List[PPtr[Material]] - m_MotionVectors: int - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: int - m_ReflectionProbeUsage: int - m_SortingLayer: int - m_SortingLayerID: int - m_SortingOrder: int - m_Sprite: PPtr[Sprite] - m_StaticBatchInfo: StaticBatchInfo - m_StaticBatchRoot: PPtr[Transform] - m_BackSortingLayerID: Optional[int] = None - m_DynamicOccludee: Optional[int] = None - m_FrontSortingLayerID: Optional[int] = None - m_MaskSource: Optional[int] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SpriteSortPoint: Optional[int] = None - m_StaticShadowCaster: Optional[int] = None + m_BackSortingLayer: int + m_BackSortingOrder: int + m_CastShadows: int + m_Enabled: bool + m_FrontSortingLayer: int + m_FrontSortingOrder: int + m_GameObject: PPtr[GameObject] + m_IsCustomRangeActive: bool + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskAlphaCutoff: float + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_Sprite: PPtr[Sprite] + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_BackSortingLayerID: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_ForceMeshLod: Optional[int] = None + m_FrontSortingLayerID: Optional[int] = None + m_MaskInteraction: Optional[int] = None + m_MaskSource: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None @unitypy_define class SpriteRenderer(Renderer): - m_CastShadows: Union[bool, int] - m_Color: ColorRGBA - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_ReceiveShadows: Union[bool, int] - m_SortingOrder: int - m_Sprite: PPtr[Sprite] - m_StaticBatchRoot: PPtr[Transform] - m_AdaptiveModeThreshold: Optional[float] = None - m_DrawMode: Optional[int] = None - m_DynamicOccludee: Optional[int] = None - m_FlipX: Optional[bool] = None - m_FlipY: Optional[bool] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MaskInteraction: Optional[int] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_Size: Optional[Vector2f] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SpriteSortPoint: Optional[int] = None - m_SpriteTileMode: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None - m_WasSpriteAssigned: Optional[bool] = None + m_CastShadows: Union[bool, int] + m_Color: ColorRGBA + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_ReceiveShadows: Union[bool, int] + m_SortingOrder: int + m_Sprite: PPtr[Sprite] + m_StaticBatchRoot: PPtr[Transform] + m_AdaptiveModeThreshold: Optional[float] = None + m_BlendShapeWeights: Optional[List[float]] = None + m_DrawMode: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_FlipX: Optional[bool] = None + m_FlipY: Optional[bool] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_Size: Optional[Vector2f] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_SpriteTileMode: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + m_WasSpriteAssigned: Optional[bool] = None @unitypy_define class SpriteShapeRenderer(Renderer): - m_CastShadows: int - m_Color: ColorRGBA - m_DynamicOccludee: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightProbeUsage: int - m_LightProbeVolumeOverride: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_LocalAABB: AABB - m_MaskInteraction: int - m_Materials: List[PPtr[Material]] - m_MotionVectors: int - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: int - m_ReflectionProbeUsage: int - m_RenderingLayerMask: int - m_ShapeTexture: PPtr[Texture2D] - m_SortingLayer: int - m_SortingLayerID: int - m_SortingOrder: int - m_Sprites: List[PPtr[Sprite]] - m_StaticBatchInfo: StaticBatchInfo - m_StaticBatchRoot: PPtr[Transform] - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SpriteSortPoint: Optional[int] = None - m_StaticShadowCaster: Optional[int] = None + m_CastShadows: int + m_Color: ColorRGBA + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_LocalAABB: AABB + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RenderingLayerMask: int + m_ShapeTexture: PPtr[Texture2D] + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_Sprites: List[PPtr[Sprite]] + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_ForceMeshLod: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None @unitypy_define class TilemapRenderer(Renderer): - m_CastShadows: int - m_ChunkSize: int3_storage - m_DynamicOccludee: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightProbeUsage: int - m_LightProbeVolumeOverride: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_MaskInteraction: int - m_Materials: List[PPtr[Material]] - m_MaxChunkCount: int - m_MaxFrameAge: int - m_MotionVectors: int - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: int - m_ReflectionProbeUsage: int - m_SortOrder: int - m_SortingLayer: int - m_SortingLayerID: int - m_SortingOrder: int - m_StaticBatchInfo: StaticBatchInfo - m_StaticBatchRoot: PPtr[Transform] - m_ChunkCullingBounds: Optional[Vector3f] = None - m_DetectChunkCullingBounds: Optional[int] = None - m_Mode: Optional[int] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_StaticShadowCaster: Optional[int] = None + m_CastShadows: int + m_ChunkSize: int3_storage + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MaxChunkCount: int + m_MaxFrameAge: int + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_SortOrder: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_ChunkCullingBounds: Optional[Vector3f] = None + m_DetectChunkCullingBounds: Optional[int] = None + m_ForceMeshLod: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_Mode: Optional[int] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None @unitypy_define class TrailRenderer(Renderer): - m_Autodestruct: bool - m_CastShadows: Union[bool, int] - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapTilingOffset: Vector4f - m_Materials: List[PPtr[Material]] - m_MinVertexDistance: float - m_ReceiveShadows: Union[bool, int] - m_StaticBatchRoot: PPtr[Transform] - m_Time: float - m_ApplyActiveColorSpace: Optional[bool] = None - m_Colors: Optional[Gradient] = None - m_DynamicOccludee: Optional[int] = None - m_Emitting: Optional[bool] = None - m_EndWidth: Optional[float] = None - m_LightProbeAnchor: Optional[PPtr[Transform]] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_MaskInteraction: Optional[int] = None - m_MotionVectors: Optional[int] = None - m_Parameters: Optional[LineParameters] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StartWidth: Optional[float] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticShadowCaster: Optional[int] = None - m_SubsetIndices: Optional[List[int]] = None - m_UseLightProbes: Optional[bool] = None + m_Autodestruct: bool + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MinVertexDistance: float + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_Time: float + m_ApplyActiveColorSpace: Optional[bool] = None + m_Colors: Optional[Gradient] = None + m_DynamicOccludee: Optional[int] = None + m_Emitting: Optional[bool] = None + m_EndWidth: Optional[float] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_Parameters: Optional[LineParameters] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StartWidth: Optional[float] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None @unitypy_define class UIRenderer(Renderer): - m_GameObject: PPtr[GameObject] - m_CastShadows: Optional[int] = None - m_DynamicOccludee: Optional[int] = None - m_Enabled: Optional[bool] = None - m_LightProbeUsage: Optional[int] = None - m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None - m_LightmapIndex: Optional[int] = None - m_LightmapIndexDynamic: Optional[int] = None - m_LightmapTilingOffset: Optional[Vector4f] = None - m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None - m_Materials: Optional[List[PPtr[Material]]] = None - m_MotionVectors: Optional[int] = None - m_ProbeAnchor: Optional[PPtr[Transform]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_ReceiveShadows: Optional[int] = None - m_ReflectionProbeUsage: Optional[int] = None - m_RendererPriority: Optional[int] = None - m_RenderingLayerMask: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_SortingLayer: Optional[int] = None - m_SortingLayerID: Optional[int] = None - m_SortingOrder: Optional[int] = None - m_StaticBatchInfo: Optional[StaticBatchInfo] = None - m_StaticBatchRoot: Optional[PPtr[Transform]] = None - m_StaticShadowCaster: Optional[int] = None + m_GameObject: PPtr[GameObject] + m_CastShadows: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_Enabled: Optional[bool] = None + m_ForceMeshLod: Optional[int] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndex: Optional[int] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffset: Optional[Vector4f] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_Materials: Optional[List[PPtr[Material]]] = None + m_MeshLodSelectionBias: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReceiveShadows: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticBatchRoot: Optional[PPtr[Transform]] = None + m_StaticShadowCaster: Optional[int] = None @unitypy_define class VFXRenderer(Renderer): - m_CastShadows: int - m_DynamicOccludee: int - m_Enabled: bool - m_GameObject: PPtr[GameObject] - m_LightProbeUsage: int - m_LightProbeVolumeOverride: PPtr[GameObject] - m_LightmapIndex: int - m_LightmapIndexDynamic: int - m_LightmapTilingOffset: Vector4f - m_LightmapTilingOffsetDynamic: Vector4f - m_MotionVectors: int - m_ProbeAnchor: PPtr[Transform] - m_ReceiveShadows: int - m_ReflectionProbeUsage: int - m_RendererPriority: int - m_RenderingLayerMask: int - m_SortingLayer: int - m_SortingLayerID: int - m_SortingOrder: int - m_StaticBatchInfo: StaticBatchInfo - m_StaticBatchRoot: PPtr[Transform] - m_Materials: Optional[List[PPtr[Material]]] = None - m_RayTraceProcedural: Optional[int] = None - m_RayTracingAccelStructBuildFlags: Optional[int] = None - m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None - m_RayTracingMode: Optional[int] = None - m_SmallMeshCulling: Optional[int] = None - m_StaticShadowCaster: Optional[int] = None + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_ForceMeshLod: Optional[int] = None + m_MaskInteraction: Optional[int] = None + m_Materials: Optional[List[PPtr[Material]]] = None + m_MeshLodSelectionBias: Optional[float] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None @unitypy_define class Rigidbody(Component): - m_AngularDrag: float - m_CollisionDetection: int - m_Constraints: int - m_Drag: float - m_GameObject: PPtr[GameObject] - m_Interpolate: int - m_IsKinematic: bool - m_Mass: float - m_UseGravity: bool - m_CenterOfMass: Optional[Vector3f] = None - m_ExcludeLayers: Optional[BitField] = None - m_ImplicitCom: Optional[bool] = None - m_ImplicitTensor: Optional[bool] = None - m_IncludeLayers: Optional[BitField] = None - m_InertiaRotation: Optional[Quaternionf] = None - m_InertiaTensor: Optional[Vector3f] = None + m_CollisionDetection: int + m_Constraints: int + m_GameObject: PPtr[GameObject] + m_Interpolate: int + m_IsKinematic: bool + m_Mass: float + m_UseGravity: bool + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_CenterOfMass: Optional[Vector3f] = None + m_Drag: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ImplicitCom: Optional[bool] = None + m_ImplicitTensor: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_InertiaRotation: Optional[Quaternionf] = None + m_InertiaTensor: Optional[Vector3f] = None + m_LinearDamping: Optional[float] = None @unitypy_define class Rigidbody2D(Component): - m_CollisionDetection: int - m_GameObject: PPtr[GameObject] - m_GravityScale: float - m_Interpolate: int - m_Mass: float - m_SleepingMode: int - m_AngularDamping: Optional[float] = None - m_AngularDrag: Optional[float] = None - m_BodyType: Optional[int] = None - m_Constraints: Optional[int] = None - m_ExcludeLayers: Optional[BitField] = None - m_FixedAngle: Optional[bool] = None - m_IncludeLayers: Optional[BitField] = None - m_IsKinematic: Optional[bool] = None - m_LinearDamping: Optional[float] = None - m_LinearDrag: Optional[float] = None - m_Material: Optional[PPtr[PhysicsMaterial2D]] = None - m_Simulated: Optional[bool] = None - m_UseAutoMass: Optional[bool] = None - m_UseFullKinematicContacts: Optional[bool] = None + m_CollisionDetection: int + m_GameObject: PPtr[GameObject] + m_GravityScale: float + m_Interpolate: int + m_Mass: float + m_SleepingMode: int + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_BodyType: Optional[int] = None + m_Constraints: Optional[int] = None + m_ExcludeLayers: Optional[BitField] = None + m_FixedAngle: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_IsKinematic: Optional[bool] = None + m_LinearDamping: Optional[float] = None + m_LinearDrag: Optional[float] = None + m_Material: Optional[PPtr[PhysicsMaterial2D]] = None + m_Simulated: Optional[bool] = None + m_UseAutoMass: Optional[bool] = None + m_UseFullKinematicContacts: Optional[bool] = None @unitypy_define class TextMesh(Component): - m_Alignment: int - m_Anchor: int - m_CharacterSize: float - m_Font: PPtr[Font] - m_FontSize: int - m_FontStyle: int - m_GameObject: PPtr[GameObject] - m_LineSpacing: float - m_OffsetZ: float - m_TabSize: float - m_Text: str - m_Color: Optional[ColorRGBA] = None - m_RichText: Optional[bool] = None + m_Alignment: int + m_Anchor: int + m_CharacterSize: float + m_Font: PPtr[Font] + m_FontSize: int + m_FontStyle: int + m_GameObject: PPtr[GameObject] + m_LineSpacing: float + m_OffsetZ: float + m_TabSize: float + m_Text: str + m_Color: Optional[ColorRGBA] = None + m_RichText: Optional[bool] = None @unitypy_define class Transform(Component): - m_Children: List[PPtr[Transform]] - m_Father: PPtr[Transform] - m_GameObject: PPtr[GameObject] - m_LocalPosition: Vector3f - m_LocalRotation: Quaternionf - m_LocalScale: Vector3f + m_Children: List[PPtr[Transform]] + m_Father: PPtr[Transform] + m_GameObject: PPtr[GameObject] + m_LocalPosition: Vector3f + m_LocalRotation: Quaternionf + m_LocalScale: Vector3f @unitypy_define class RectTransform(Transform): - m_AnchorMax: Vector2f - m_AnchorMin: Vector2f - m_GameObject: PPtr[GameObject] - m_Pivot: Vector2f - m_SizeDelta: Vector2f - m_AnchoredPosition: Optional[Vector2f] = None - m_Children: Optional[List[PPtr[Transform]]] = None - m_Father: Optional[PPtr[Transform]] = None - m_LocalPosition: Optional[Vector3f] = None - m_LocalRotation: Optional[Quaternionf] = None - m_LocalScale: Optional[Vector3f] = None - m_Position: Optional[Vector2f] = None + m_AnchorMax: Vector2f + m_AnchorMin: Vector2f + m_GameObject: PPtr[GameObject] + m_Pivot: Vector2f + m_SizeDelta: Vector2f + m_AnchoredPosition: Optional[Vector2f] = None + m_Children: Optional[List[PPtr[Transform]]] = None + m_Father: Optional[PPtr[Transform]] = None + m_LocalPosition: Optional[Vector3f] = None + m_LocalRotation: Optional[Quaternionf] = None + m_LocalScale: Optional[Vector3f] = None + m_Position: Optional[Vector2f] = None @unitypy_define class Tree(Component): - m_GameObject: PPtr[GameObject] - m_SpeedTreeWindAsset: Optional[PPtr[SpeedTreeWindAsset]] = None + m_GameObject: PPtr[GameObject] + m_SpeedTreeWindAsset: Optional[PPtr[SpeedTreeWindAsset]] = None @unitypy_define class WorldAnchor(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class WorldParticleCollider(Component): - m_BounceFactor: float - m_CollidesWith: BitField - m_CollisionEnergyLoss: float - m_GameObject: PPtr[GameObject] - m_MinKillVelocity: float - m_SendCollisionMessage: bool + m_BounceFactor: float + m_CollidesWith: BitField + m_CollisionEnergyLoss: float + m_GameObject: PPtr[GameObject] + m_MinKillVelocity: float + m_SendCollisionMessage: bool @unitypy_define class GameObject(EditorExtension): - m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] - m_IsActive: Union[bool, int] - m_Layer: int - m_Name: str - m_Tag: int + m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] + m_IsActive: Union[bool, int] + m_Layer: int + m_Name: str + m_Tag: int @unitypy_define class NamedObject(EditorExtension, ABC): - pass + pass @unitypy_define class AnimatorState(NamedObject): - m_CycleOffset: float - m_IKOnFeet: bool - m_Mirror: bool - m_Motion: PPtr[Motion] - m_Name: str - m_Position: Vector3f - m_Speed: float - m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] - m_Tag: str - m_Transitions: List[PPtr[AnimatorStateTransition]] - m_WriteDefaultValues: bool - m_CycleOffsetParameter: Optional[str] = None - m_CycleOffsetParameterActive: Optional[bool] = None - m_MirrorParameter: Optional[str] = None - m_MirrorParameterActive: Optional[bool] = None - m_SpeedParameter: Optional[str] = None - m_SpeedParameterActive: Optional[bool] = None - m_TimeParameter: Optional[str] = None - m_TimeParameterActive: Optional[bool] = None + m_CycleOffset: float + m_IKOnFeet: bool + m_Mirror: bool + m_Motion: PPtr[Motion] + m_Name: str + m_Position: Vector3f + m_Speed: float + m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] + m_Tag: str + m_Transitions: List[PPtr[AnimatorStateTransition]] + m_WriteDefaultValues: bool + m_CycleOffsetParameter: Optional[str] = None + m_CycleOffsetParameterActive: Optional[bool] = None + m_MirrorParameter: Optional[str] = None + m_MirrorParameterActive: Optional[bool] = None + m_SpeedParameter: Optional[str] = None + m_SpeedParameterActive: Optional[bool] = None + m_TimeParameter: Optional[str] = None + m_TimeParameterActive: Optional[bool] = None @unitypy_define class AnimatorStateMachine(NamedObject): - m_AnyStatePosition: Vector3f - m_AnyStateTransitions: List[PPtr[AnimatorStateTransition]] - m_ChildStateMachines: List[ChildAnimatorStateMachine] - m_ChildStates: List[ChildAnimatorState] - m_DefaultState: PPtr[AnimatorState] - m_EntryPosition: Vector3f - m_EntryTransitions: List[PPtr[AnimatorTransition]] - m_ExitPosition: Vector3f - m_Name: str - m_ParentStateMachinePosition: Vector3f - m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] - m_StateMachineTransitions: List[ - Tuple[PPtr[AnimatorStateMachine], List[PPtr[AnimatorTransition]]] - ] + m_AnyStatePosition: Vector3f + m_AnyStateTransitions: List[PPtr[AnimatorStateTransition]] + m_ChildStateMachines: List[ChildAnimatorStateMachine] + m_ChildStates: List[ChildAnimatorState] + m_DefaultState: PPtr[AnimatorState] + m_EntryPosition: Vector3f + m_EntryTransitions: List[PPtr[AnimatorTransition]] + m_ExitPosition: Vector3f + m_Name: str + m_ParentStateMachinePosition: Vector3f + m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] + m_StateMachineTransitions: List[Tuple[PPtr[AnimatorStateMachine], List[PPtr[AnimatorTransition]]]] @unitypy_define class AnimatorTransitionBase(NamedObject): - m_Conditions: List[AnimatorCondition] - m_DstState: PPtr[AnimatorState] - m_DstStateMachine: PPtr[AnimatorStateMachine] - m_IsExit: bool - m_Mute: bool - m_Name: str - m_Solo: bool + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_IsExit: bool + m_Mute: bool + m_Name: str + m_Solo: bool @unitypy_define class AnimatorStateTransition(AnimatorTransitionBase): - m_CanTransitionToSelf: bool - m_Conditions: List[AnimatorCondition] - m_DstState: PPtr[AnimatorState] - m_DstStateMachine: PPtr[AnimatorStateMachine] - m_ExitTime: float - m_HasExitTime: bool - m_InterruptionSource: int - m_IsExit: bool - m_Mute: bool - m_Name: str - m_OrderedInterruption: bool - m_Solo: bool - m_TransitionDuration: float - m_TransitionOffset: float - m_HasFixedDuration: Optional[bool] = None + m_CanTransitionToSelf: bool + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_ExitTime: float + m_HasExitTime: bool + m_InterruptionSource: int + m_IsExit: bool + m_Mute: bool + m_Name: str + m_OrderedInterruption: bool + m_Solo: bool + m_TransitionDuration: float + m_TransitionOffset: float + m_HasFixedDuration: Optional[bool] = None @unitypy_define class AnimatorTransition(AnimatorTransitionBase): - m_Conditions: List[AnimatorCondition] - m_DstState: PPtr[AnimatorState] - m_DstStateMachine: PPtr[AnimatorStateMachine] - m_IsExit: bool - m_Mute: bool - m_Name: str - m_Solo: bool + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_IsExit: bool + m_Mute: bool + m_Name: str + m_Solo: bool @unitypy_define class AssetBundle(NamedObject): - m_Container: List[Tuple[str, AssetInfo]] - m_MainAsset: AssetInfo - m_Name: str - m_PreloadTable: List[PPtr[Object]] - m_AssetBundleName: Optional[str] = None - m_ClassCompatibility: Optional[List[Tuple[int, int]]] = None - m_ClassVersionMap: Optional[List[Tuple[int, int]]] = None - m_Dependencies: Optional[List[str]] = None - m_ExplicitDataLayout: Optional[int] = None - m_IsStreamedSceneAssetBundle: Optional[bool] = None - m_PathFlags: Optional[int] = None - m_RuntimeCompatibility: Optional[int] = None - m_SceneHashes: Optional[List[Tuple[str, str]]] = None - m_ScriptCompatibility: Optional[List[AssetBundleScriptInfo]] = None + m_Container: List[Tuple[str, AssetInfo]] + m_MainAsset: AssetInfo + m_Name: str + m_PreloadTable: List[PPtr[Object]] + m_AssetBundleName: Optional[str] = None + m_ClassCompatibility: Optional[List[Tuple[int, int]]] = None + m_ClassVersionMap: Optional[List[Tuple[int, int]]] = None + m_Dependencies: Optional[List[str]] = None + m_ExplicitDataLayout: Optional[int] = None + m_IsStreamedSceneAssetBundle: Optional[bool] = None + m_PathFlags: Optional[int] = None + m_RuntimeCompatibility: Optional[int] = None + m_SceneHashes: Optional[List[Tuple[str, str]]] = None + m_ScriptCompatibility: Optional[List[AssetBundleScriptInfo]] = None @unitypy_define class AssetBundleManifest(NamedObject): - AssetBundleInfos: List[Tuple[int, AssetBundleInfo]] - AssetBundleNames: List[Tuple[int, str]] - AssetBundlesWithVariant: List[int] - m_Name: str + AssetBundleInfos: List[Tuple[int, AssetBundleInfo]] + AssetBundleNames: List[Tuple[int, str]] + AssetBundlesWithVariant: List[int] + m_Name: str @unitypy_define class AssetImportInProgressProxy(NamedObject): - m_Name: str + m_Name: str @unitypy_define class AssetImporter(NamedObject, ABC): - pass + pass @unitypy_define class ASTCImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_Name: str - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str @unitypy_define class AndroidAssetPackImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class AssemblyDefinitionImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UserData: str - m_UsedFileIDs: Optional[List[int]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class AssemblyDefinitionReferenceImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class AudioImporter(AssetImporter): - m_3D: bool - m_ForceToMono: bool - m_Name: str - audio_preview_data: Optional[bytes] = None - m_Ambisonic: Optional[bool] = None - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_DefaultSettings: Optional[SampleSettings] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_Format: Optional[int] = None - m_LoadInBackground: Optional[bool] = None - m_Loopable: Optional[bool] = None - m_NewHashIdentity: Optional[MdFour] = None - m_Normalize: Optional[bool] = None - m_OldHashIdentity: Optional[MdFour] = None - m_Output: Optional[Union[AudioImporterOutput, Output]] = None - m_PlatformSettingOverrides: Optional[ - Union[List[Tuple[str, SampleSettings]], List[Tuple[int, SampleSettings]]] - ] = None - m_PreloadAudioData: Optional[bool] = None - m_PreviewData: Optional[PreviewData] = None - m_PreviewDataLength: Optional[int] = None - m_Quality: Optional[float] = None - m_Stream: Optional[int] = None - m_UseHardware: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_3D: bool + m_ForceToMono: bool + m_Name: str + audio_preview_data: Optional[bytes] = None + m_Ambisonic: Optional[bool] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DefaultSettings: Optional[SampleSettings] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_Format: Optional[int] = None + m_LoadInBackground: Optional[bool] = None + m_Loopable: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_Normalize: Optional[bool] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[Union[AudioImporterOutput, Output]] = None + m_PlatformSettingOverrides: Optional[Union[List[Tuple[int, SampleSettings]], List[Tuple[str, SampleSettings]]]] = None + m_PreloadAudioData: Optional[bool] = None + m_PreviewData: Optional[PreviewData] = None + m_PreviewDataLength: Optional[int] = None + m_Quality: Optional[float] = None + m_Stream: Optional[int] = None + m_UseHardware: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + + +@unitypy_define +class BlockShaderImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_EmbedBlocksInGeneratedShader: bool + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class BuildArchiveImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class BuildInstructionImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class BuildMetaDataImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class C4DImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class ComputeShaderImporter(AssetImporter): - m_Name: str - m_UserData: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_CurrentAPIMask: Optional[int] = None - m_CurrentBuildTarget: Optional[int] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_PreprocessorOverride: Optional[int] = None - m_UsedFileIDs: Optional[List[int]] = None + m_Name: str + m_UserData: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_CurrentAPIMask: Optional[int] = None + m_CurrentBuildTarget: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_PreprocessorOverride: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class DDSImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_IsReadable: Optional[bool] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_IsReadable: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None @unitypy_define class DefaultImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class IHVImageFormatImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_IsReadable: bool - m_Name: str - m_TextureSettings: GLTextureSettings - m_UserData: str - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_StreamingMipmaps: Optional[bool] = None - m_StreamingMipmapsPriority: Optional[int] = None - m_UsedFileIDs: Optional[List[int]] = None - m_sRGBTexture: Optional[bool] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_IsReadable: bool + m_Name: str + m_TextureSettings: GLTextureSettings + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_sRGBTexture: Optional[bool] = None @unitypy_define class KTXImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_Name: str - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str @unitypy_define class LibraryAssetImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class LocalizationImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UserData: str - m_UsedFileIDs: Optional[List[int]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class ModelImporter(AssetImporter, ABC): - pass + pass @unitypy_define class FBXImporter(ModelImporter): - m_AddColliders: bool - m_AnimationCompression: int - m_AnimationPositionError: float - m_AnimationRotationError: float - m_AnimationScaleError: float - m_AnimationWrapMode: int - m_BakeSimulation: bool - m_ClipAnimations: List[ClipAnimationInfo] - m_GlobalScale: float - m_HasExtraRoot: bool - m_ImportedRoots: List[PPtr[GameObject]] - m_MeshCompression: int - m_Name: str - m_UseFileUnits: bool - normalSmoothAngle: float - bakeAxisConversion: Optional[bool] = None - blendShapeNormalImportMode: Optional[int] = None - generateSecondaryUV: Optional[bool] = None - indexFormat: Optional[int] = None - keepQuads: Optional[bool] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( - None - ) - m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None - m_AdditionalBone: Optional[bool] = None - m_AnimationDoRetargetingWarnings: Optional[bool] = None - m_AnimationImportErrors: Optional[str] = None - m_AnimationImportWarnings: Optional[str] = None - m_AnimationRetargetingWarnings: Optional[str] = None - m_AnimationType: Optional[int] = None - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None - m_AutoMapExternalMaterials: Optional[bool] = None - m_AvatarSetup: Optional[int] = None - m_ContainsAnimation: Optional[bool] = None - m_CopyAvatar: Optional[bool] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_ExtraExposedTransformPaths: Optional[List[str]] = None - m_ExtraUserProperties: Optional[List[str]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_FileIdsGeneration: Optional[int] = None - m_FileScale: Optional[float] = None - m_FileScaleFactor: Optional[float] = None - m_FileScaleUnit: Optional[str] = None - m_FirstImportVersion: Optional[int] = None - m_GenerateAnimations: Optional[int] = None - m_GenerateMaterials: Optional[int] = None - m_HasEmbeddedTextures: Optional[bool] = None - m_HasPreviousCalculatedGlobalScale: Optional[bool] = None - m_HumanDescription: Optional[HumanDescription] = None - m_HumanoidOversampling: Optional[int] = None - m_ImportAnimatedCustomProperties: Optional[bool] = None - m_ImportAnimation: Optional[bool] = None - m_ImportBlendShapeDeformPercent: Optional[bool] = None - m_ImportBlendShapes: Optional[bool] = None - m_ImportCameras: Optional[bool] = None - m_ImportConstraints: Optional[bool] = None - m_ImportLights: Optional[bool] = None - m_ImportMaterials: Optional[bool] = None - m_ImportPhysicalCameras: Optional[bool] = None - m_ImportVisibility: Optional[bool] = None - m_ImportedTakeInfos: Optional[List[TakeInfo]] = None - m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None - m_IsReadable: Optional[bool] = None - m_LODScreenPercentages: Optional[List[float]] = None - m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None - m_LegacyGenerateAnimations: Optional[int] = None - m_MaterialImportMode: Optional[int] = None - m_MaterialLocation: Optional[int] = None - m_MaterialName: Optional[int] = None - m_MaterialSearch: Optional[int] = None - m_Materials: Optional[List[SourceAssetIdentifier]] = None - m_MeshSettings_generateSecondaryUV: Optional[bool] = None - m_MeshSettings_normalImportMode: Optional[int] = None - m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None - m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None - m_MeshSettings_secondaryUVHardAngle: Optional[float] = None - m_MeshSettings_secondaryUVPackMargin: Optional[float] = None - m_MeshSettings_swapUVChannels: Optional[bool] = None - m_MeshSettings_tangentImportMode: Optional[int] = None - m_MotionNodeName: Optional[str] = None - m_NewHashIdentity: Optional[MdFour] = None - m_NodeNameCollisionStrategy: Optional[int] = None - m_OldHashIdentity: Optional[MdFour] = None - m_OptimizeGameObjects: Optional[bool] = None - m_PreserveHierarchy: Optional[bool] = None - m_PreviousCalculatedGlobalScale: Optional[float] = None - m_ReferencedClips: Optional[List[GUID]] = None - m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None - m_RemoveConstantScaleCurves: Optional[bool] = None - m_ResampleCurves: Optional[bool] = None - m_ResampleRotations: Optional[bool] = None - m_RigImportErrors: Optional[str] = None - m_RigImportWarnings: Optional[str] = None - m_SortHierarchyByName: Optional[bool] = None - m_SplitAnimations: Optional[bool] = None - m_StrictVertexDataChecks: Optional[bool] = None - m_SupportsEmbeddedMaterials: Optional[bool] = None - m_UseFileScale: Optional[bool] = None - m_UseSRGBMaterialColor: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None - maxBonesPerVertex: Optional[int] = None - meshOptimizationFlags: Optional[int] = None - minBoneWeight: Optional[float] = None - normalCalculationMode: Optional[int] = None - normalImportMode: Optional[int] = None - normalSmoothingSource: Optional[int] = None - optimizeBones: Optional[bool] = None - optimizeMesh: Optional[bool] = None - optimizeMeshForGPU: Optional[bool] = None - secondaryUVAngleDistortion: Optional[float] = None - secondaryUVAreaDistortion: Optional[float] = None - secondaryUVHardAngle: Optional[float] = None - secondaryUVMarginMethod: Optional[int] = None - secondaryUVMinLightmapResolution: Optional[float] = None - secondaryUVMinObjectScale: Optional[float] = None - secondaryUVPackMargin: Optional[float] = None - skinWeightsMode: Optional[int] = None - splitTangentsAcrossUV: Optional[bool] = None - swapUVChannels: Optional[bool] = None - tangentImportMode: Optional[int] = None - weldVertices: Optional[bool] = None + m_AddColliders: bool + m_AnimationCompression: int + m_AnimationPositionError: float + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationWrapMode: int + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_GlobalScale: float + m_HasExtraRoot: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_MeshCompression: int + m_Name: str + m_UseFileUnits: bool + normalSmoothAngle: float + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + calculateBlendshapeNormalsDeltaFromImportedNormals: Optional[bool] = None + generateMeshLods: Optional[bool] = None + generateSecondaryUV: Optional[bool] = None + importUVs: Optional[int] = None + importVertexColors: Optional[bool] = None + indexFormat: Optional[int] = None + keepQuads: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AdditionalBone: Optional[bool] = None + m_AnimationDoRetargetingWarnings: Optional[bool] = None + m_AnimationImportErrors: Optional[str] = None + m_AnimationImportWarnings: Optional[str] = None + m_AnimationRetargetingWarnings: Optional[str] = None + m_AnimationType: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraExposedTransformPaths: Optional[List[str]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScale: Optional[float] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_FirstImportVersion: Optional[int] = None + m_GenerateAnimations: Optional[int] = None + m_GenerateMaterials: Optional[int] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanDescription: Optional[HumanDescription] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportAnimation: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportBlendShapes: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_ImportedTakeInfos: Optional[List[TakeInfo]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_IsReadable: Optional[bool] = None + m_LODScreenPercentages: Optional[List[float]] = None + m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None + m_LegacyGenerateAnimations: Optional[int] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_MaterialName: Optional[int] = None + m_MaterialSearch: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MeshSettings_generateSecondaryUV: Optional[bool] = None + m_MeshSettings_normalImportMode: Optional[int] = None + m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None + m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None + m_MeshSettings_secondaryUVHardAngle: Optional[float] = None + m_MeshSettings_secondaryUVPackMargin: Optional[float] = None + m_MeshSettings_swapUVChannels: Optional[bool] = None + m_MeshSettings_tangentImportMode: Optional[int] = None + m_MotionNodeName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_OldHashIdentity: Optional[MdFour] = None + m_OptimizeGameObjects: Optional[bool] = None + m_PreBakeConvexCollisionMesh: Optional[bool] = None + m_PreBakeTriangleCollisionMesh: Optional[bool] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_ReferencedClips: Optional[List[GUID]] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SearchTexturesGlobally: Optional[bool] = None + m_SortHierarchyByName: Optional[bool] = None + m_SplitAnimations: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseFileScale: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + maxBonesPerVertex: Optional[int] = None + maximumMeshLod: Optional[int] = None + meshLodGenerationFlags: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalImportMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMesh: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVAngleDistortion: Optional[float] = None + secondaryUVAreaDistortion: Optional[float] = None + secondaryUVHardAngle: Optional[float] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + secondaryUVPackMargin: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None + swapUVChannels: Optional[bool] = None + tangentImportMode: Optional[int] = None + weldVertices: Optional[bool] = None @unitypy_define class Mesh3DSImporter(ModelImporter): - m_AddColliders: bool - m_AnimationCompression: int - m_AnimationPositionError: float - m_AnimationRotationError: float - m_AnimationScaleError: float - m_AnimationWrapMode: int - m_BakeSimulation: bool - m_ClipAnimations: List[ClipAnimationInfo] - m_GlobalScale: float - m_HasExtraRoot: bool - m_ImportedRoots: List[PPtr[GameObject]] - m_MeshCompression: int - m_Name: str - m_UseFileUnits: bool - normalSmoothAngle: float - bakeAxisConversion: Optional[bool] = None - blendShapeNormalImportMode: Optional[int] = None - generateSecondaryUV: Optional[bool] = None - indexFormat: Optional[int] = None - keepQuads: Optional[bool] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( - None - ) - m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None - m_AdditionalBone: Optional[bool] = None - m_AnimationDoRetargetingWarnings: Optional[bool] = None - m_AnimationImportErrors: Optional[str] = None - m_AnimationImportWarnings: Optional[str] = None - m_AnimationRetargetingWarnings: Optional[str] = None - m_AnimationType: Optional[int] = None - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None - m_AutoMapExternalMaterials: Optional[bool] = None - m_AvatarSetup: Optional[int] = None - m_ContainsAnimation: Optional[bool] = None - m_CopyAvatar: Optional[bool] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_ExtraExposedTransformPaths: Optional[List[str]] = None - m_ExtraUserProperties: Optional[List[str]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_FileIdsGeneration: Optional[int] = None - m_FileScale: Optional[float] = None - m_FileScaleFactor: Optional[float] = None - m_FileScaleUnit: Optional[str] = None - m_FirstImportVersion: Optional[int] = None - m_GenerateAnimations: Optional[int] = None - m_GenerateMaterials: Optional[int] = None - m_HasEmbeddedTextures: Optional[bool] = None - m_HasPreviousCalculatedGlobalScale: Optional[bool] = None - m_HumanDescription: Optional[HumanDescription] = None - m_HumanoidOversampling: Optional[int] = None - m_ImportAnimatedCustomProperties: Optional[bool] = None - m_ImportAnimation: Optional[bool] = None - m_ImportBlendShapeDeformPercent: Optional[bool] = None - m_ImportBlendShapes: Optional[bool] = None - m_ImportCameras: Optional[bool] = None - m_ImportConstraints: Optional[bool] = None - m_ImportLights: Optional[bool] = None - m_ImportMaterials: Optional[bool] = None - m_ImportPhysicalCameras: Optional[bool] = None - m_ImportVisibility: Optional[bool] = None - m_ImportedTakeInfos: Optional[List[TakeInfo]] = None - m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None - m_IsReadable: Optional[bool] = None - m_LODScreenPercentages: Optional[List[float]] = None - m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None - m_LegacyGenerateAnimations: Optional[int] = None - m_MaterialImportMode: Optional[int] = None - m_MaterialLocation: Optional[int] = None - m_MaterialName: Optional[int] = None - m_MaterialSearch: Optional[int] = None - m_Materials: Optional[List[SourceAssetIdentifier]] = None - m_MeshSettings_generateSecondaryUV: Optional[bool] = None - m_MeshSettings_normalImportMode: Optional[int] = None - m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None - m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None - m_MeshSettings_secondaryUVHardAngle: Optional[float] = None - m_MeshSettings_secondaryUVPackMargin: Optional[float] = None - m_MeshSettings_swapUVChannels: Optional[bool] = None - m_MeshSettings_tangentImportMode: Optional[int] = None - m_MotionNodeName: Optional[str] = None - m_NewHashIdentity: Optional[MdFour] = None - m_NodeNameCollisionStrategy: Optional[int] = None - m_OldHashIdentity: Optional[MdFour] = None - m_OptimizeGameObjects: Optional[bool] = None - m_PreserveHierarchy: Optional[bool] = None - m_PreviousCalculatedGlobalScale: Optional[float] = None - m_ReferencedClips: Optional[List[GUID]] = None - m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None - m_RemoveConstantScaleCurves: Optional[bool] = None - m_ResampleCurves: Optional[bool] = None - m_ResampleRotations: Optional[bool] = None - m_RigImportErrors: Optional[str] = None - m_RigImportWarnings: Optional[str] = None - m_SortHierarchyByName: Optional[bool] = None - m_SplitAnimations: Optional[bool] = None - m_StrictVertexDataChecks: Optional[bool] = None - m_SupportsEmbeddedMaterials: Optional[bool] = None - m_UseFileScale: Optional[bool] = None - m_UseSRGBMaterialColor: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None - maxBonesPerVertex: Optional[int] = None - meshOptimizationFlags: Optional[int] = None - minBoneWeight: Optional[float] = None - normalCalculationMode: Optional[int] = None - normalImportMode: Optional[int] = None - normalSmoothingSource: Optional[int] = None - optimizeBones: Optional[bool] = None - optimizeMesh: Optional[bool] = None - optimizeMeshForGPU: Optional[bool] = None - secondaryUVAngleDistortion: Optional[float] = None - secondaryUVAreaDistortion: Optional[float] = None - secondaryUVHardAngle: Optional[float] = None - secondaryUVMarginMethod: Optional[int] = None - secondaryUVMinLightmapResolution: Optional[float] = None - secondaryUVMinObjectScale: Optional[float] = None - secondaryUVPackMargin: Optional[float] = None - skinWeightsMode: Optional[int] = None - splitTangentsAcrossUV: Optional[bool] = None - swapUVChannels: Optional[bool] = None - tangentImportMode: Optional[int] = None - weldVertices: Optional[bool] = None + m_AddColliders: bool + m_AnimationCompression: int + m_AnimationPositionError: float + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationWrapMode: int + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_GlobalScale: float + m_HasExtraRoot: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_MeshCompression: int + m_Name: str + m_UseFileUnits: bool + normalSmoothAngle: float + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + calculateBlendshapeNormalsDeltaFromImportedNormals: Optional[bool] = None + generateMeshLods: Optional[bool] = None + generateSecondaryUV: Optional[bool] = None + importUVs: Optional[int] = None + importVertexColors: Optional[bool] = None + indexFormat: Optional[int] = None + keepQuads: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AdditionalBone: Optional[bool] = None + m_AnimationDoRetargetingWarnings: Optional[bool] = None + m_AnimationImportErrors: Optional[str] = None + m_AnimationImportWarnings: Optional[str] = None + m_AnimationRetargetingWarnings: Optional[str] = None + m_AnimationType: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraExposedTransformPaths: Optional[List[str]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScale: Optional[float] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_FirstImportVersion: Optional[int] = None + m_GenerateAnimations: Optional[int] = None + m_GenerateMaterials: Optional[int] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanDescription: Optional[HumanDescription] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportAnimation: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportBlendShapes: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_ImportedTakeInfos: Optional[List[TakeInfo]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_IsReadable: Optional[bool] = None + m_LODScreenPercentages: Optional[List[float]] = None + m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None + m_LegacyGenerateAnimations: Optional[int] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_MaterialName: Optional[int] = None + m_MaterialSearch: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MeshSettings_generateSecondaryUV: Optional[bool] = None + m_MeshSettings_normalImportMode: Optional[int] = None + m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None + m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None + m_MeshSettings_secondaryUVHardAngle: Optional[float] = None + m_MeshSettings_secondaryUVPackMargin: Optional[float] = None + m_MeshSettings_swapUVChannels: Optional[bool] = None + m_MeshSettings_tangentImportMode: Optional[int] = None + m_MotionNodeName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_OldHashIdentity: Optional[MdFour] = None + m_OptimizeGameObjects: Optional[bool] = None + m_PreBakeConvexCollisionMesh: Optional[bool] = None + m_PreBakeTriangleCollisionMesh: Optional[bool] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_ReferencedClips: Optional[List[GUID]] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SearchTexturesGlobally: Optional[bool] = None + m_SortHierarchyByName: Optional[bool] = None + m_SplitAnimations: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseFileScale: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + maxBonesPerVertex: Optional[int] = None + maximumMeshLod: Optional[int] = None + meshLodGenerationFlags: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalImportMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMesh: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVAngleDistortion: Optional[float] = None + secondaryUVAreaDistortion: Optional[float] = None + secondaryUVHardAngle: Optional[float] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + secondaryUVPackMargin: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None + swapUVChannels: Optional[bool] = None + tangentImportMode: Optional[int] = None + weldVertices: Optional[bool] = None @unitypy_define class SketchUpImporter(ModelImporter): - generateSecondaryUV: bool - keepQuads: bool - m_AddColliders: bool - m_AdditionalBone: bool - m_AnimationCompression: int - m_AnimationDoRetargetingWarnings: bool - m_AnimationImportErrors: str - m_AnimationImportWarnings: str - m_AnimationPositionError: float - m_AnimationRetargetingWarnings: str - m_AnimationRotationError: float - m_AnimationScaleError: float - m_AnimationType: int - m_AnimationWrapMode: int - m_AssetBundleName: str - m_AssetBundleVariant: str - m_AssetHash: Hash128 - m_BakeSimulation: bool - m_ClipAnimations: List[ClipAnimationInfo] - m_ExtraExposedTransformPaths: List[str] - m_FileScale: float - m_FileUnit: int - m_GenerateBackFace: bool - m_GlobalScale: float - m_HasExtraRoot: bool - m_HumanDescription: HumanDescription - m_ImportAnimation: bool - m_ImportBlendShapes: bool - m_ImportedRoots: List[PPtr[GameObject]] - m_ImportedTakeInfos: List[TakeInfo] - m_IsReadable: bool - m_LODScreenPercentages: List[float] - m_LastHumanDescriptionAvatarSource: PPtr[Avatar] - m_Latitude: float - m_LegacyGenerateAnimations: int - m_Longitude: float - m_MaterialName: int - m_MaterialSearch: int - m_MergeCoplanarFaces: bool - m_MeshCompression: int - m_MotionNodeName: str - m_Name: str - m_NorthCorrection: float - m_OptimizeGameObjects: bool - m_ReferencedClips: List[GUID] - m_SelectedNodes: List[int] - m_SketchUpImportData: SketchUpImportData - m_UseFileScale: bool - m_UseFileUnits: bool - m_UserData: str - normalImportMode: int - normalSmoothAngle: float - secondaryUVAngleDistortion: float - secondaryUVAreaDistortion: float - secondaryUVHardAngle: float - secondaryUVPackMargin: float - swapUVChannels: bool - tangentImportMode: int - weldVertices: bool - bakeAxisConversion: Optional[bool] = None - blendShapeNormalImportMode: Optional[int] = None - indexFormat: Optional[int] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( - None - ) - m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None - m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None - m_AutoMapExternalMaterials: Optional[bool] = None - m_AvatarSetup: Optional[int] = None - m_ContainsAnimation: Optional[bool] = None - m_CopyAvatar: Optional[bool] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_ExtraUserProperties: Optional[List[str]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_FileIdsGeneration: Optional[int] = None - m_FileScaleFactor: Optional[float] = None - m_FileScaleUnit: Optional[str] = None - m_HasEmbeddedTextures: Optional[bool] = None - m_HasPreviousCalculatedGlobalScale: Optional[bool] = None - m_HumanoidOversampling: Optional[int] = None - m_ImportAnimatedCustomProperties: Optional[bool] = None - m_ImportBlendShapeDeformPercent: Optional[bool] = None - m_ImportCameras: Optional[bool] = None - m_ImportConstraints: Optional[bool] = None - m_ImportLights: Optional[bool] = None - m_ImportMaterials: Optional[bool] = None - m_ImportPhysicalCameras: Optional[bool] = None - m_ImportVisibility: Optional[bool] = None - m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None - m_MaterialImportMode: Optional[int] = None - m_MaterialLocation: Optional[int] = None - m_Materials: Optional[List[SourceAssetIdentifier]] = None - m_NodeNameCollisionStrategy: Optional[int] = None - m_PreserveHierarchy: Optional[bool] = None - m_PreviousCalculatedGlobalScale: Optional[float] = None - m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None - m_RemoveConstantScaleCurves: Optional[bool] = None - m_ResampleCurves: Optional[bool] = None - m_ResampleRotations: Optional[bool] = None - m_RigImportErrors: Optional[str] = None - m_RigImportWarnings: Optional[str] = None - m_SortHierarchyByName: Optional[bool] = None - m_StrictVertexDataChecks: Optional[bool] = None - m_SupportsEmbeddedMaterials: Optional[bool] = None - m_UseSRGBMaterialColor: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - maxBonesPerVertex: Optional[int] = None - meshOptimizationFlags: Optional[int] = None - minBoneWeight: Optional[float] = None - normalCalculationMode: Optional[int] = None - normalSmoothingSource: Optional[int] = None - optimizeBones: Optional[bool] = None - optimizeMeshForGPU: Optional[bool] = None - secondaryUVMarginMethod: Optional[int] = None - secondaryUVMinLightmapResolution: Optional[float] = None - secondaryUVMinObjectScale: Optional[float] = None - skinWeightsMode: Optional[int] = None - splitTangentsAcrossUV: Optional[bool] = None + generateSecondaryUV: bool + keepQuads: bool + m_AddColliders: bool + m_AdditionalBone: bool + m_AnimationCompression: int + m_AnimationDoRetargetingWarnings: bool + m_AnimationImportErrors: str + m_AnimationImportWarnings: str + m_AnimationPositionError: float + m_AnimationRetargetingWarnings: str + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationType: int + m_AnimationWrapMode: int + m_AssetBundleName: str + m_AssetBundleVariant: str + m_AssetHash: Hash128 + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_ExtraExposedTransformPaths: List[str] + m_FileScale: float + m_FileUnit: int + m_GenerateBackFace: bool + m_GlobalScale: float + m_HasExtraRoot: bool + m_HumanDescription: HumanDescription + m_ImportAnimation: bool + m_ImportBlendShapes: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_ImportedTakeInfos: List[TakeInfo] + m_IsReadable: bool + m_LODScreenPercentages: List[float] + m_LastHumanDescriptionAvatarSource: PPtr[Avatar] + m_Latitude: float + m_LegacyGenerateAnimations: int + m_Longitude: float + m_MaterialName: int + m_MaterialSearch: int + m_MergeCoplanarFaces: bool + m_MeshCompression: int + m_MotionNodeName: str + m_Name: str + m_NorthCorrection: float + m_OptimizeGameObjects: bool + m_ReferencedClips: List[GUID] + m_SelectedNodes: List[int] + m_SketchUpImportData: SketchUpImportData + m_UseFileScale: bool + m_UseFileUnits: bool + m_UserData: str + normalImportMode: int + normalSmoothAngle: float + secondaryUVAngleDistortion: float + secondaryUVAreaDistortion: float + secondaryUVHardAngle: float + secondaryUVPackMargin: float + swapUVChannels: bool + tangentImportMode: int + weldVertices: bool + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + calculateBlendshapeNormalsDeltaFromImportedNormals: Optional[bool] = None + generateMeshLods: Optional[bool] = None + importUVs: Optional[int] = None + importVertexColors: Optional[bool] = None + indexFormat: Optional[int] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_PreBakeConvexCollisionMesh: Optional[bool] = None + m_PreBakeTriangleCollisionMesh: Optional[bool] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SearchTexturesGlobally: Optional[bool] = None + m_SortHierarchyByName: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + maxBonesPerVertex: Optional[int] = None + maximumMeshLod: Optional[int] = None + meshLodGenerationFlags: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None @unitypy_define class MonoImporter(AssetImporter): - executionOrder: int - icon: PPtr[Texture2D] - m_DefaultReferences: List[Tuple[str, PPtr[Object]]] - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + executionOrder: int + icon: PPtr[Texture2D] + m_DefaultReferences: List[Tuple[str, PPtr[Object]]] + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class MovieImporter(AssetImporter): - m_Name: str - m_Quality: float - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_LinearTexture: Optional[bool] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_Quality: float + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_LinearTexture: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class MultiArtifactTestImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class NativeFormatImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_MainObjectFileID: Optional[int] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_MainObjectFileID: Optional[int] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class PVRImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None @unitypy_define class PackageManifestImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class PluginImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExecutionOrder: List[Tuple[str, int]] - m_IconMap: List[Tuple[str, PPtr[Texture2D]]] - m_IsPreloaded: bool - m_Name: str - m_Output: PluginImportOutput - m_PlatformData: Union[ - List[Tuple[str, PlatformSettingsData]], - List[Tuple[Tuple[str, str], PlatformSettingsData]], - ] - m_UserData: str - m_DefineConstraints: Optional[List[str]] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_IsExplicitlyReferenced: Optional[bool] = None - m_IsOverridable: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_ValidateReferences: Optional[bool] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExecutionOrder: List[Tuple[str, int]] + m_IconMap: List[Tuple[str, PPtr[Texture2D]]] + m_IsPreloaded: bool + m_Name: str + m_Output: PluginImportOutput + m_PlatformData: Union[List[Tuple[Tuple[str, str], PlatformSettingsData]], List[Tuple[str, PlatformSettingsData]]] + m_UserData: str + m_DefineConstraints: Optional[List[str]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_IsExplicitlyReferenced: Optional[bool] = None + m_IsOverridable: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_ValidateReferences: Optional[bool] = None @unitypy_define class PrefabImporter(AssetImporter): - m_AddedObjectFileIDs: List[int] - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_IsPrefabVariant: bool - m_Name: str - m_UserData: str - m_UnableToImportOnPreviousDomainReload: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_VariantParentGUID: Optional[GUID] = None + m_AddedObjectFileIDs: List[int] + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_IsPrefabVariant: bool + m_Name: str + m_UserData: str + m_UnableToImportOnPreviousDomainReload: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_VariantParentGUID: Optional[GUID] = None @unitypy_define class PreviewImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class RayTracingShaderImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str - m_CurrentAPIMask: Optional[int] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + m_CurrentAPIMask: Optional[int] = None @unitypy_define class ReferencesArtifactGenerator(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class RoslynAdditionalFileImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class RoslynAnalyzerConfigImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class RuleSetFileImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class ScriptedImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_Name: str - m_Script: PPtr[MonoScript] - m_UserData: str - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None - m_UsedFileIDs: Optional[List[int]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_Script: PPtr[MonoScript] + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class ShaderImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_DefaultTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None - m_OldHashIdentity: Optional[MdFour] = None - m_PreprocessorOverride: Optional[int] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DefaultTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_OldHashIdentity: Optional[MdFour] = None + m_PreprocessorOverride: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class ShaderIncludeImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str @unitypy_define class SpeedTreeImporter(AssetImporter): - m_AlphaTestRef: float - m_AssetBundleName: str - m_AssetBundleVariant: str - m_BestWindQuality: int - m_BillboardTransitionCrossFadeWidth: float - m_EnableSmoothLODTransition: bool - m_FadeOutWidth: float - m_HasBillboard: bool - m_HueVariation: ColorRGBA - m_LODSettings: List[PerLODSettings] - m_MainColor: ColorRGBA - m_Name: str - m_ScaleFactor: float - m_UserData: str - m_AnimateCrossFading: Optional[bool] = None - m_EnableBumpMapping: Optional[bool] = None - m_EnableHueVariation: Optional[bool] = None - m_EnableLightProbes: Optional[bool] = None - m_EnableShadowCasting: Optional[bool] = None - m_EnableShadowReceiving: Optional[bool] = None - m_EnableSubsurfaceScattering: Optional[bool] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDType: Optional[int] = None - m_GenerateColliders: Optional[bool] = None - m_GenerateRigidbody: Optional[bool] = None - m_MaterialLocation: Optional[int] = None - m_MaterialVersion: Optional[int] = None - m_Materials: Optional[List[SourceAssetIdentifier]] = None - m_MotionVectorModeEnumValue: Optional[int] = None - m_ReflectionProbeEnumValue: Optional[int] = None - m_SelectedWindQuality: Optional[int] = None - m_Shininess: Optional[float] = None - m_SpecColor: Optional[ColorRGBA] = None - m_SupportsEmbeddedMaterials: Optional[bool] = None - m_UnitConversionEnumValue: Optional[int] = None - m_UsedFileIDs: Optional[List[int]] = None + m_AlphaTestRef: float + m_AssetBundleName: str + m_AssetBundleVariant: str + m_BestWindQuality: int + m_BillboardTransitionCrossFadeWidth: float + m_EnableSmoothLODTransition: bool + m_FadeOutWidth: float + m_HasBillboard: bool + m_HueVariation: ColorRGBA + m_LODSettings: List[PerLODSettings] + m_MainColor: ColorRGBA + m_Name: str + m_ScaleFactor: float + m_UserData: str + m_AnimateCrossFading: Optional[bool] = None + m_EnableBumpMapping: Optional[bool] = None + m_EnableHueVariation: Optional[bool] = None + m_EnableLightProbes: Optional[bool] = None + m_EnableShadowCasting: Optional[bool] = None + m_EnableShadowReceiving: Optional[bool] = None + m_EnableSubsurfaceScattering: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDType: Optional[int] = None + m_GenerateColliders: Optional[bool] = None + m_GenerateRigidbody: Optional[bool] = None + m_MaterialLocation: Optional[int] = None + m_MaterialVersion: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MotionVectorModeEnumValue: Optional[int] = None + m_ReflectionProbeEnumValue: Optional[int] = None + m_SelectedWindQuality: Optional[int] = None + m_Shininess: Optional[float] = None + m_SpecColor: Optional[ColorRGBA] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UnitConversionEnumValue: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class SpriteAtlasImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UsedFileIDs: List[int] - m_UserData: str - m_BindAsDefault: Optional[bool] = None - m_PackingSettings: Optional[PackingSettings] = None - m_PlatformSettings: Optional[List[TextureImporterPlatformSettings]] = None - m_SecondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = ( - None - ) - m_TextureSettings: Optional[TextureSettings] = None - m_VariantMultiplier: Optional[float] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + m_BindAsDefault: Optional[bool] = None + m_PackingSettings: Optional[PackingSettings] = None + m_PlatformSettings: Optional[List[TextureImporterPlatformSettings]] = None + m_SecondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + m_TextureSettings: Optional[TextureSettings] = None + m_VariantMultiplier: Optional[float] = None @unitypy_define class StyleSheetImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_Name: str - m_UserData: str + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str @unitypy_define class SubstanceImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_DeletedPrototypes: Optional[List[str]] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_IsFirstImport: Optional[int] = None - m_MaterialImportOutputs: Optional[List[MaterialImportOutput]] = None - m_MaterialInstances: Optional[List[MaterialInstanceSettings]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DeletedPrototypes: Optional[List[str]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_IsFirstImport: Optional[int] = None + m_MaterialImportOutputs: Optional[List[MaterialImportOutput]] = None + m_MaterialInstances: Optional[List[MaterialInstanceSettings]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class TextScriptImporter(AssetImporter): - m_Name: str - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class TextureImporter(AssetImporter): - m_BorderMipMap: int - m_ConvertToNormalMap: int - m_EnableMipMap: int - m_ExternalNormalMap: int - m_FadeOut: int - m_GenerateCubemap: int - m_GrayScaleToAlpha: int - m_HeightScale: float - m_IsReadable: int - m_Lightmap: int - m_MaxTextureSize: int - m_MipMapFadeDistanceEnd: int - m_MipMapFadeDistanceStart: int - m_MipMapMode: int - m_NPOTScale: int - m_Name: str - m_NormalMapFilter: int - m_TextureFormat: int - m_TextureSettings: GLTextureSettings - m_TextureType: int - correctGamma: Optional[int] = None - m_Alignment: Optional[int] = None - m_AllowsAlphaSplitting: Optional[int] = None - m_AlphaIsTransparency: Optional[int] = None - m_AlphaTestReferenceValue: Optional[float] = None - m_AlphaUsage: Optional[int] = None - m_ApplyGammaDecoding: Optional[int] = None - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_BuildTargetSettings: Optional[List[BuildTargetSettings]] = None - m_CompressionQuality: Optional[int] = None - m_CompressionQualitySet: Optional[int] = None - m_CookieLightType: Optional[int] = None - m_CorrectGamma: Optional[int] = None - m_CubemapConvolution: Optional[int] = None - m_CubemapConvolutionExponent: Optional[float] = None - m_CubemapConvolutionSteps: Optional[int] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_FlipGreenChannel: Optional[int] = None - m_FlipbookColumns: Optional[int] = None - m_FlipbookRows: Optional[int] = None - m_IgnoreMasterTextureLimit: Optional[int] = None - m_IgnoreMipmapLimit: Optional[int] = None - m_IgnorePngGamma: Optional[Union[bool, int]] = None - m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None - m_LinearTexture: Optional[int] = None - m_MaxTextureSizeSet: Optional[int] = None - m_MipMapsPreserveCoverage: Optional[int] = None - m_MipmapLimitGroupName: Optional[str] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_Output: Optional[TextureImportOutput] = None - m_PSDRemoveMatte: Optional[bool] = None - m_PSDShowRemoveMatteOption: Optional[bool] = None - m_PlatformSettings: Optional[ - Union[List[TextureImporterPlatformSettings], List[PlatformSettings]] - ] = None - m_PushPullDilation: Optional[int] = None - m_RGBM: Optional[int] = None - m_RecommendedTextureFormat: Optional[int] = None - m_SeamlessCubemap: Optional[int] = None - m_SingleChannelComponent: Optional[int] = None - m_SourceTextureInformation: Optional[SourceTextureInformation] = None - m_SpriteBorder: Optional[Vector4f] = None - m_SpriteExtrude: Optional[int] = None - m_SpriteGenerateFallbackPhysicsShape: Optional[int] = None - m_SpriteMeshType: Optional[int] = None - m_SpriteMode: Optional[int] = None - m_SpritePackingTag: Optional[str] = None - m_SpritePivot: Optional[Vector2f] = None - m_SpritePixelsToUnits: Optional[float] = None - m_SpriteSheet: Optional[SpriteSheetMetaData] = None - m_SpriteTessellationDetail: Optional[float] = None - m_StreamingMipmaps: Optional[int] = None - m_StreamingMipmapsPriority: Optional[int] = None - m_Swizzle: Optional[int] = None - m_TextureFormatSet: Optional[int] = None - m_TextureShape: Optional[int] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None - m_VTOnly: Optional[int] = None - m_sRGBTexture: Optional[int] = None + m_BorderMipMap: int + m_ConvertToNormalMap: int + m_EnableMipMap: int + m_ExternalNormalMap: int + m_FadeOut: int + m_GenerateCubemap: int + m_GrayScaleToAlpha: int + m_HeightScale: float + m_IsReadable: int + m_Lightmap: int + m_MaxTextureSize: int + m_MipMapFadeDistanceEnd: int + m_MipMapFadeDistanceStart: int + m_MipMapMode: int + m_NPOTScale: int + m_Name: str + m_NormalMapFilter: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_TextureType: int + correctGamma: Optional[int] = None + m_Alignment: Optional[int] = None + m_AllowsAlphaSplitting: Optional[int] = None + m_AlphaIsTransparency: Optional[int] = None + m_AlphaTestReferenceValue: Optional[float] = None + m_AlphaUsage: Optional[int] = None + m_ApplyGammaDecoding: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_BuildTargetSettings: Optional[List[BuildTargetSettings]] = None + m_CompressionQuality: Optional[int] = None + m_CompressionQualitySet: Optional[int] = None + m_CookieLightType: Optional[int] = None + m_CorrectGamma: Optional[int] = None + m_CubemapConvolution: Optional[int] = None + m_CubemapConvolutionExponent: Optional[float] = None + m_CubemapConvolutionSteps: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FlipGreenChannel: Optional[int] = None + m_FlipbookColumns: Optional[int] = None + m_FlipbookRows: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[int] = None + m_IgnoreMipmapLimit: Optional[int] = None + m_IgnorePngGamma: Optional[Union[bool, int]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_LinearTexture: Optional[int] = None + m_MaxTextureSizeSet: Optional[int] = None + m_MipMapsPreserveCoverage: Optional[int] = None + m_MipmapLimitGroupName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[TextureImportOutput] = None + m_PSDRemoveMatte: Optional[bool] = None + m_PSDShowRemoveMatteOption: Optional[bool] = None + m_PlatformSettings: Optional[Union[List[PlatformSettings], List[TextureImporterPlatformSettings]]] = None + m_PushPullDilation: Optional[int] = None + m_RGBM: Optional[int] = None + m_RecommendedTextureFormat: Optional[int] = None + m_SeamlessCubemap: Optional[int] = None + m_SingleChannelComponent: Optional[int] = None + m_SourceTextureInformation: Optional[SourceTextureInformation] = None + m_SpriteBorder: Optional[Vector4f] = None + m_SpriteExtrude: Optional[int] = None + m_SpriteGenerateFallbackPhysicsShape: Optional[int] = None + m_SpriteGeometrySubdivision: Optional[float] = None + m_SpriteMeshType: Optional[int] = None + m_SpriteMode: Optional[int] = None + m_SpritePackingTag: Optional[str] = None + m_SpritePivot: Optional[Vector2f] = None + m_SpritePixelsToUnits: Optional[float] = None + m_SpriteSheet: Optional[SpriteSheetMetaData] = None + m_SpriteTessellationDetail: Optional[float] = None + m_SpriteTessellationMethod: Optional[int] = None + m_StreamingMipmaps: Optional[int] = None + m_StreamingMipmapsPriority: Optional[int] = None + m_Swizzle: Optional[int] = None + m_TextureFormatSet: Optional[int] = None + m_TextureShape: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + m_VTOnly: Optional[int] = None + m_sRGBTexture: Optional[int] = None @unitypy_define class TrueTypeFontImporter(AssetImporter): - m_FontNames: List[str] - m_FontSize: int - m_ForceTextureCase: int - m_IncludeFontData: bool - m_Name: str - m_AscentCalculationMode: Optional[int] = None - m_AssetBundleName: Optional[str] = None - m_AssetBundleVariant: Optional[str] = None - m_CharacterPadding: Optional[int] = None - m_CharacterSpacing: Optional[int] = None - m_CustomCharacters: Optional[str] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FallbackFontReferences: Optional[List[PPtr[Font]]] = None - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_FontColor: Optional[ColorRGBA] = None - m_FontName: Optional[str] = None - m_FontRenderingMode: Optional[int] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_Output: Optional[Output] = None - m_RenderMode: Optional[int] = None - m_ShouldRoundAdvanceValue: Optional[bool] = None - m_Style: Optional[int] = None - m_Use2xBehaviour: Optional[bool] = None - m_UseLegacyBoundsCalculation: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None - m_UserData: Optional[str] = None + m_FontNames: List[str] + m_FontSize: int + m_ForceTextureCase: int + m_IncludeFontData: bool + m_Name: str + m_AscentCalculationMode: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_CharacterPadding: Optional[int] = None + m_CharacterSpacing: Optional[int] = None + m_CustomCharacters: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FallbackFontReferences: Optional[List[PPtr[Font]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FontColor: Optional[ColorRGBA] = None + m_FontName: Optional[str] = None + m_FontRenderingMode: Optional[int] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[Output] = None + m_RenderMode: Optional[int] = None + m_ShouldRoundAdvanceValue: Optional[bool] = None + m_Style: Optional[int] = None + m_Use2xBehaviour: Optional[bool] = None + m_UseLegacyBoundsCalculation: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None @unitypy_define class VideoClipImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ColorSpace: int - m_Deinterlace: int - m_EncodeAlpha: bool - m_EndFrame: int - m_FlipHorizontal: bool - m_FlipVertical: bool - m_FrameRange: int - m_Name: str - m_Output: VideoClipImporterOutput - m_StartFrame: int - m_TargetSettings: Union[ - List[Tuple[int, VideoClipImporterTargetSettings]], - List[Tuple[str, VideoClipImporterTargetSettings]], - ] - m_UserData: str - m_AudioImportMode: Optional[int] = None - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None - m_FrameCount: Optional[int] = None - m_FrameRate: Optional[float] = None - m_ImportAudio: Optional[bool] = None - m_IsColorLinear: Optional[bool] = None - m_OriginalHeight: Optional[int] = None - m_OriginalWidth: Optional[int] = None - m_PixelAspectRatioDenominator: Optional[int] = None - m_PixelAspectRatioNumerator: Optional[int] = None - m_Quality: Optional[float] = None - m_SourceAudioChannelCount: Optional[List[int]] = None - m_SourceAudioSampleRate: Optional[List[int]] = None - m_SourceFileSize: Optional[int] = None - m_SourceHasAlpha: Optional[bool] = None - m_UseLegacyImporter: Optional[bool] = None - m_UsedFileIDs: Optional[List[int]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ColorSpace: int + m_Deinterlace: int + m_EncodeAlpha: bool + m_EndFrame: int + m_FlipHorizontal: bool + m_FlipVertical: bool + m_FrameRange: int + m_Name: str + m_Output: VideoClipImporterOutput + m_StartFrame: int + m_TargetSettings: Union[List[Tuple[int, VideoClipImporterTargetSettings]], List[Tuple[str, VideoClipImporterTargetSettings]]] + m_UserData: str + m_AudioImportMode: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FrameCount: Optional[int] = None + m_FrameRate: Optional[float] = None + m_ImportAudio: Optional[bool] = None + m_IsColorLinear: Optional[bool] = None + m_OriginalHeight: Optional[int] = None + m_OriginalWidth: Optional[int] = None + m_PixelAspectRatioDenominator: Optional[int] = None + m_PixelAspectRatioNumerator: Optional[int] = None + m_Quality: Optional[float] = None + m_SourceAudioChannelCount: Optional[List[int]] = None + m_SourceAudioSampleRate: Optional[List[int]] = None + m_SourceFileSize: Optional[int] = None + m_SourceHasAlpha: Optional[bool] = None + m_UseLegacyImporter: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class VisualEffectImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] - m_Name: str - m_UserData: str - m_Template: Optional[VFXTemplate] = None - m_UsedFileIDs: Optional[List[int]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_Template: Optional[VFXTemplate] = None + m_UseAsTemplate: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None @unitypy_define class AudioContainerElement(NamedObject): - m_AudioClip: PPtr[AudioClip] - m_Enabled: bool - m_Name: str - m_Volume: float + m_AudioClip: PPtr[AudioClip] + m_Enabled: bool + m_Name: str + m_Volume: float @unitypy_define class AudioMixer(NamedObject): - m_EnableSuspend: bool - m_MasterGroup: PPtr[AudioMixerGroup] - m_MixerConstant: AudioMixerConstant - m_Name: str - m_OutputGroup: PPtr[AudioMixerGroup] - m_Snapshots: List[PPtr[AudioMixerSnapshot]] - m_StartSnapshot: PPtr[AudioMixerSnapshot] - m_SuspendThreshold: float - m_UpdateMode: Optional[int] = None + m_EnableSuspend: bool + m_MasterGroup: PPtr[AudioMixerGroup] + m_MixerConstant: AudioMixerConstant + m_Name: str + m_OutputGroup: PPtr[AudioMixerGroup] + m_Snapshots: List[PPtr[AudioMixerSnapshot]] + m_StartSnapshot: PPtr[AudioMixerSnapshot] + m_SuspendThreshold: float + m_UpdateMode: Optional[int] = None @unitypy_define class AudioMixerController(AudioMixer): - m_EnableSuspend: bool - m_MasterGroup: PPtr[AudioMixerGroup] - m_MixerConstant: AudioMixerConstant - m_Name: str - m_OutputGroup: PPtr[AudioMixerGroup] - m_Snapshots: List[PPtr[AudioMixerSnapshot]] - m_StartSnapshot: PPtr[AudioMixerSnapshot] - m_SuspendThreshold: float - m_UpdateMode: Optional[int] = None + m_EnableSuspend: bool + m_MasterGroup: PPtr[AudioMixerGroup] + m_MixerConstant: AudioMixerConstant + m_Name: str + m_OutputGroup: PPtr[AudioMixerGroup] + m_Snapshots: List[PPtr[AudioMixerSnapshot]] + m_StartSnapshot: PPtr[AudioMixerSnapshot] + m_SuspendThreshold: float + m_UpdateMode: Optional[int] = None @unitypy_define class AudioMixerEffectController(NamedObject): - m_Bypass: bool - m_EffectID: GUID - m_EffectName: str - m_EnableWetMix: bool - m_MixLevel: GUID - m_Name: str - m_Parameters: List[Parameter] - m_SendTarget: PPtr[AudioMixerEffectController] + m_Bypass: bool + m_EffectID: GUID + m_EffectName: str + m_EnableWetMix: bool + m_MixLevel: GUID + m_Name: str + m_Parameters: List[Parameter] + m_SendTarget: PPtr[AudioMixerEffectController] @unitypy_define class AudioMixerGroup(NamedObject): - m_AudioMixer: PPtr[AudioMixer] - m_Children: List[PPtr[AudioMixerGroup]] - m_GroupID: GUID - m_Name: str + m_AudioMixer: PPtr[AudioMixer] + m_Children: List[PPtr[AudioMixerGroup]] + m_GroupID: GUID + m_Name: str @unitypy_define class AudioMixerGroupController(AudioMixerGroup): - m_AudioMixer: PPtr[AudioMixer] - m_Children: List[PPtr[AudioMixerGroup]] - m_GroupID: GUID - m_Name: str + m_AudioMixer: PPtr[AudioMixer] + m_Children: List[PPtr[AudioMixerGroup]] + m_GroupID: GUID + m_Name: str @unitypy_define class AudioMixerSnapshot(NamedObject): - m_AudioMixer: PPtr[AudioMixer] - m_Name: str - m_SnapshotID: GUID + m_AudioMixer: PPtr[AudioMixer] + m_Name: str + m_SnapshotID: GUID @unitypy_define class AudioMixerSnapshotController(AudioMixerSnapshot): - m_AudioMixer: PPtr[AudioMixer] - m_Name: str - m_SnapshotID: GUID + m_AudioMixer: PPtr[AudioMixer] + m_Name: str + m_SnapshotID: GUID @unitypy_define class AudioResource(NamedObject): - m_Name: str + m_Name: str @unitypy_define class AudioRandomContainer(AudioResource): - m_AutomaticTriggerMode: int - m_AutomaticTriggerTime: float - m_AutomaticTriggerTimeRandomizationEnabled: bool - m_AutomaticTriggerTimeRandomizationRange: Vector2f - m_AvoidRepeatingLast: int - m_Elements: List[PPtr[AudioContainerElement]] - m_LoopCount: int - m_LoopCountRandomizationEnabled: bool - m_LoopCountRandomizationRange: Vector2f - m_LoopMode: int - m_Name: str - m_Pitch: float - m_PitchRandomizationEnabled: bool - m_PitchRandomizationRange: Vector2f - m_PlaybackMode: int - m_TriggerMode: int - m_Volume: float - m_VolumeRandomizationEnabled: bool - m_VolumeRandomizationRange: Vector2f + m_AutomaticTriggerMode: int + m_AutomaticTriggerTime: float + m_AutomaticTriggerTimeRandomizationEnabled: bool + m_AutomaticTriggerTimeRandomizationRange: Vector2f + m_AvoidRepeatingLast: int + m_Elements: List[PPtr[AudioContainerElement]] + m_LoopCount: int + m_LoopCountRandomizationEnabled: bool + m_LoopCountRandomizationRange: Vector2f + m_LoopMode: int + m_Name: str + m_Pitch: float + m_PitchRandomizationEnabled: bool + m_PitchRandomizationRange: Vector2f + m_PlaybackMode: int + m_TriggerMode: int + m_Volume: float + m_VolumeRandomizationEnabled: bool + m_VolumeRandomizationRange: Vector2f @unitypy_define class SampleClip(AudioResource): - m_Name: str + m_Name: str @unitypy_define class AudioClip(SampleClip): - m_Name: str - m_3D: Optional[bool] = None - m_Ambisonic: Optional[bool] = None - m_AudioData: Optional[List[int]] = None - m_BitsPerSample: Optional[int] = None - m_Channels: Optional[int] = None - m_CompressionFormat: Optional[int] = None - m_Format: Optional[int] = None - m_Frequency: Optional[int] = None - m_IsTrackerFormat: Optional[bool] = None - m_Legacy3D: Optional[bool] = None - m_Length: Optional[float] = None - m_LoadInBackground: Optional[bool] = None - m_LoadType: Optional[int] = None - m_PreloadAudioData: Optional[bool] = None - m_Resource: Optional[StreamedResource] = None - m_Stream: Optional[int] = None - m_SubsoundIndex: Optional[int] = None - m_Type: Optional[int] = None - m_UseHardware: Optional[bool] = None + m_Name: str + m_3D: Optional[bool] = None + m_Ambisonic: Optional[bool] = None + m_AudioData: Optional[List[int]] = None + m_BitsPerSample: Optional[int] = None + m_Channels: Optional[int] = None + m_CompressionFormat: Optional[int] = None + m_Format: Optional[int] = None + m_Frequency: Optional[int] = None + m_IsTrackerFormat: Optional[bool] = None + m_Legacy3D: Optional[bool] = None + m_Length: Optional[float] = None + m_LoadInBackground: Optional[bool] = None + m_LoadType: Optional[int] = None + m_PreloadAudioData: Optional[bool] = None + m_Resource: Optional[StreamedResource] = None + m_Stream: Optional[int] = None + m_SubsoundIndex: Optional[int] = None + m_Type: Optional[int] = None + m_UseHardware: Optional[bool] = None @unitypy_define class Avatar(NamedObject): - m_Avatar: AvatarConstant - m_AvatarSize: int - m_Name: str - m_TOS: List[Tuple[int, str]] - m_HumanDescription: Optional[HumanDescription] = None + m_Avatar: AvatarConstant + m_AvatarSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] + m_HumanDescription: Optional[HumanDescription] = None @unitypy_define class AvatarMask(NamedObject): - m_Elements: List[TransformMaskElement] - m_Mask: List[int] - m_Name: str + m_Elements: List[TransformMaskElement] + m_Mask: List[int] + m_Name: str @unitypy_define class AvatarSkeletonMask(NamedObject): - elements: List[AvatarSkeletonMaskElement] - m_Name: str + elements: List[AvatarSkeletonMaskElement] + m_Name: str @unitypy_define class BaseAnimationTrack(NamedObject, ABC): - pass + pass @unitypy_define class NewAnimationTrack(BaseAnimationTrack): - m_ClassID: int - m_Curves: List[Channel] - m_Name: str + m_ClassID: int + m_Curves: List[Channel] + m_Name: str @unitypy_define class BillboardAsset(NamedObject): - bottom: float - height: float - imageTexCoords: List[Vector4f] - indices: List[int] - m_Name: str - material: PPtr[Material] - vertices: List[Vector2f] - width: float - rotated: Optional[List[int]] = None + bottom: float + height: float + imageTexCoords: List[Vector4f] + indices: List[int] + m_Name: str + material: PPtr[Material] + vertices: List[Vector2f] + width: float + rotated: Optional[List[int]] = None + + +@unitypy_define +class BlobObject(NamedObject): + m_BlobData: List[int] + m_BlobTypeHash: int + m_Name: str + m_NestedBlobObjectReferenceOffsets: List[int] + m_NestedBlobObjectReferences: List[PPtr[BlobObject]] + + +@unitypy_define +class BlockShaderContainer(NamedObject): + blob: List[int] + dependencies: List[PPtr[BlockShaderContainer]] + generatedPaths: List[str] + guid: GUID + m_Name: str + state: int + + +@unitypy_define +class BlockShaderErrors(NamedObject): + errors: List[Error] + filePath: str + m_Name: str + + +@unitypy_define +class BlockShaderSyntaxTree(NamedObject): + filePath: str + m_Name: str + source: str + + +@unitypy_define +class BuildProfilePlayerSettings(NamedObject): + AID: Hash128 + AndroidEnableSustainedPerformanceMode: bool + AndroidFilterTouchesWhenObscured: bool + AndroidProfiler: bool + Force_IOS_Speakers_When_Recording: bool + Prepare_IOS_For_Recording: bool + accelerometerFrequency: int + activeInputHandler: int + adjustIOSFPSUsingThermalState: bool + allowFullscreenSwitch: bool + allowHDRDisplaySupport: bool + allowedAutorotateToLandscapeLeft: bool + allowedAutorotateToLandscapeRight: bool + allowedAutorotateToPortrait: bool + allowedAutorotateToPortraitUpsideDown: bool + allowedHttpConnections: int + androidApplicationEntry: int + androidAutoRotationBehavior: int + androidBlitType: int + androidDefaultWindowHeight: int + androidDefaultWindowWidth: int + androidDisplayOptions: int + androidFullscreenMode: int + androidMaxAspectRatio: float + androidMinAspectRatio: float + androidMinimumWindowHeight: int + androidMinimumWindowWidth: int + androidPredictiveBackSupport: bool + androidRenderOutsideSafeArea: bool + androidRequestedVisibleInsets: int + androidResizeableActivity: bool + androidShowActivityIndicatorOnLoading: int + androidStartInFullscreen: bool + androidSupportedAspectRatio: int + androidSystemBarsBehavior: int + androidUseSwappy: bool + androidVulkanAllowFilterList: List[AndroidDeviceFilterData] + androidVulkanDenyFilterList: List[AndroidDeviceFilterData] + androidVulkanDeviceFilterListAsset: PPtr[VulkanDeviceFilterLists] + audioSpatialExperience: int + bakeCollisionMeshes: bool + bundleVersion: str + callOnDisableOnAssetBundleUnload: bool + cloudEnabled: bool + cloudProjectId: str + companyName: str + cursorHotspot: Vector2f + d3d12DeviceFilterListAsset: PPtr[D3D12DeviceFilterLists] + dedicatedServerOptimizations: bool + defaultCursor: PPtr[Texture2D] + defaultIsNativeResolution: bool + defaultScreenHeight: int + defaultScreenHeightWeb: int + defaultScreenOrientation: int + defaultScreenWidth: int + defaultScreenWidthWeb: int + deferSystemGesturesMode: int + disableDepthAndStencilBuffers: bool + enableDirectStorage: bool + enableFrameTimingStats: bool + enableOpenGLProfilerGPURecorders: bool + forceSingleInstance: bool + framebufferDepthMemorylessMode: int + fullscreenMode: int + gpuSkinning: bool + hdrBitDepth: int + hideHomeButton: bool + hmiLoadingImage: PPtr[Texture2D] + insecureHttpOption: int + invalidatedPatternTexture: PPtr[Texture2D] + iosShowActivityIndicatorOnLoading: int + iosUseCustomAppBackgroundBehavior: bool + legacyClampBlendShapeWeights: bool + loadStoreDebugModeEnabled: bool + m_ActiveColorSpace: int + m_ColorGamuts: List[int] + m_MTRendering: bool + m_Name: str + m_ShowUnitySplashLogo: bool + m_ShowUnitySplashScreen: bool + m_SplashScreenAnimation: int + m_SplashScreenBackgroundAnimationZoom: float + m_SplashScreenBackgroundColor: ColorRGBA + m_SplashScreenBackgroundLandscape: PPtr[Texture2D] + m_SplashScreenBackgroundLandscapeAspect: float + m_SplashScreenBackgroundLandscapeUvs: Rectf + m_SplashScreenBackgroundPortrait: PPtr[Texture2D] + m_SplashScreenBackgroundPortraitAspect: float + m_SplashScreenBackgroundPortraitUvs: Rectf + m_SplashScreenDrawMode: int + m_SplashScreenLogoAnimationZoom: float + m_SplashScreenLogoStyle: int + m_SplashScreenLogos: List[SplashScreenLogo] + m_SplashScreenOverlayOpacity: float + m_SpriteBatchMaxVertexCount: int + m_SpriteBatchVertexThreshold: int + m_StackTraceTypes: List[int] + m_StereoRenderingPath: int + m_UnitySplashLogo: PPtr[Sprite] + m_VirtualRealitySplashScreen: PPtr[Texture2D] + macAppStoreCategory: str + macRetinaSupport: bool + meshDeformation: int + metalFramebufferOnly: bool + metalUseMetalDisplayLink: bool + metroInputSource: int + mipStripping: bool + mobileMTRenderingBaked: bool + muteOtherAudioSources: bool + numberOfMipsStripped: int + numberOfMipsStrippedPerMipmapLimitGroup: List[Tuple[str, int]] + organizationId: str + platformRequiresReadableAssets: bool + playerMinOpenGLESVersion: int + preloadedAssets: List[PPtr[Object]] + preserveFramebufferAlpha: bool + productGUID: GUID + productName: str + projectName: str + qualitySettingsNames: List[str] + resetResolutionOnWindowResize: bool + resizableWindow: bool + resolutionScalingMode: int + runInBackground: bool + submitAnalytics: bool + switchAllowGpuScratchShrinking: bool + switchGpuScratchPoolGranularity: int + switchGraphicsJobsSyncAfterKick: bool + switchMaxWorkerMultiple: int + switchNVNDefaultPoolsGranularity: int + switchNVNGraphicsFirmwareMemory: int + switchNVNMaxPublicSamplerIDCount: int + switchNVNMaxPublicTextureIDCount: int + switchNVNOtherPoolsGranularity: int + switchNVNShaderPoolsGranularity: int + switchQueueCommandMemory: int + switchQueueComputeMemory: int + switchQueueControlMemory: int + targetDevice: int + targetPixelDensity: int + thermalStateCriticalIOSFPS: int + thermalStateSeriousIOSFPS: int + tvOSBundleVersion: str + unsupportedMSAAFallback: int + use32BitDisplayBuffer: bool + useFlipModelSwapchain: bool + useHDRDisplay: bool + useMacAppStoreValidation: bool + useOSAutorotation: bool + useOnDemandResources: bool + usePlayerLog: bool + virtualTexturingSupportEnabled: bool + visibleInBackground: bool + visionOSBundleVersion: str + vrSettings: VRSettings + vulkanEnableCommandBufferRecycling: bool + vulkanEnableLateAcquireNextImage: bool + vulkanEnablePreTransform: bool + vulkanEnableSetSRGBWrite: bool + vulkanNumSwapchainBuffers: int + webGPUDeviceFilterListAsset: PPtr[WebGPUDeviceFilterLists] + windowsGamepadBackendHint: int + wsaTransparentSwapchain: bool + xboxEnableAvatar: bool + xboxEnableFitness: bool + xboxEnableGuest: bool + xboxEnableHeadOrientation: bool + xboxEnableKinect: bool + xboxEnableKinectAutoTracking: bool + xboxEnablePIXSampling: bool + xboxOneDisableEsram: bool + xboxOneDisableKinectGpuReservation: bool + xboxOneEnable7thCore: bool + xboxOneEnableTypeOptimization: bool + xboxOneLoggingLevel: int + xboxOneMonoLoggingLevel: int + xboxOnePresentImmediateThreshold: int + xboxOneResolution: int + xboxOneSResolution: int + xboxOneXResolution: int + xboxPIXTextureCapture: bool + xboxSpeechDB: int + webProgressiveAssetLoading: Optional[bool] = None @unitypy_define class BuildReport(NamedObject): - m_Appendices: List[PPtr[Object]] - m_BuildSteps: List[BuildStepInfo] - m_Files: List[BuildReportFile] - m_Name: str - m_Summary: BuildSummary + m_Appendices: List[PPtr[Object]] + m_BuildSteps: List[BuildStepInfo] + m_Files: List[BuildReportFile] + m_Name: str + m_Summary: BuildSummary + m_RootAssetPaths: Optional[List[str]] = None @unitypy_define class CachedSpriteAtlas(NamedObject): - frames: List[Tuple[Tuple[GUID, int], SpriteRenderData]] - textures: List[PPtr[Texture2D]] - alphaTextures: Optional[List[PPtr[Texture2D]]] = None + frames: List[Tuple[Tuple[GUID, int], SpriteRenderData]] + textures: List[PPtr[Texture2D]] + alphaTextures: Optional[List[PPtr[Texture2D]]] = None @unitypy_define class CachedSpriteAtlasRuntimeData(NamedObject): - alphaTextures: List[PPtr[Texture2D]] - frames: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] - textures: List[PPtr[Texture2D]] - currentPackingHash: Optional[Hash128] = None + alphaTextures: List[PPtr[Texture2D]] + frames: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] + textures: List[PPtr[Texture2D]] + currentPackingHash: Optional[Hash128] = None @unitypy_define class ComputeShader(NamedObject): - m_Name: str - constantBuffers: Optional[List[ComputeShaderCB]] = None - kernels: Optional[List[ComputeShaderKernel]] = None - variants: Optional[ - Union[List[ComputeShaderVariant], List[ComputeShaderPlatformVariant]] - ] = None + m_Name: str + constantBuffers: Optional[List[ComputeShaderCB]] = None + kernels: Optional[List[ComputeShaderKernel]] = None + variants: Optional[Union[List[ComputeShaderPlatformVariant], List[ComputeShaderVariant]]] = None + + +@unitypy_define +class D3D12DeviceFilterLists(NamedObject): + m_AllowFilterList: List[D3D12DeviceFilterData] + m_DenyFilterList: List[D3D12DeviceFilterData] + m_GraphicsJobsFilterList: List[D3D12GraphicsJobsDeviceFilterData] + m_Name: str @unitypy_define class DefaultAsset(NamedObject): - m_Name: str - m_IsWarning: Optional[bool] = None - m_Message: Optional[str] = None + m_Name: str + m_ErrorCode: Optional[int] = None + m_IsWarning: Optional[bool] = None + m_Message: Optional[str] = None @unitypy_define class BrokenPrefabAsset(DefaultAsset): - m_BrokenParentPrefab: PPtr[BrokenPrefabAsset] - m_IsPrefabFileValid: bool - m_IsVariant: bool - m_IsWarning: bool - m_Message: str - m_Name: str + m_BrokenParentPrefab: PPtr[BrokenPrefabAsset] + m_IsPrefabFileValid: bool + m_IsVariant: bool + m_IsWarning: bool + m_Message: str + m_Name: str + m_ErrorCode: Optional[int] = None @unitypy_define class SceneAsset(DefaultAsset): - m_Name: str - m_IsWarning: Optional[bool] = None - m_Message: Optional[str] = None + m_Name: str + m_ErrorCode: Optional[int] = None + m_IsWarning: Optional[bool] = None + m_Message: Optional[str] = None @unitypy_define class EditorProjectAccess(NamedObject): - m_Name: str + m_Name: str @unitypy_define class Flare(NamedObject): - m_Elements: List[FlareElement] - m_FlareTexture: PPtr[Texture] - m_Name: str - m_TextureLayout: int - m_UseFog: bool + m_Elements: List[FlareElement] + m_FlareTexture: PPtr[Texture] + m_Name: str + m_TextureLayout: int + m_UseFog: bool @unitypy_define class Font(NamedObject): - m_Ascent: float - m_AsciiStartOffset: int - m_CharacterRects: List[CharacterInfo] - m_ConvertCase: int - m_DefaultMaterial: PPtr[Material] - m_DefaultStyle: int - m_FontData: List[str] - m_FontNames: List[str] - m_FontSize: float - m_KerningValues: List[Tuple[Tuple[int, int], float]] - m_LineSpacing: float - m_Name: str - m_Texture: PPtr[Texture] - m_CharacterPadding: Optional[int] = None - m_CharacterSpacing: Optional[int] = None - m_Descent: Optional[float] = None - m_FallbackFonts: Optional[List[PPtr[Font]]] = None - m_FontCountX: Optional[int] = None - m_FontCountY: Optional[int] = None - m_FontRenderingMode: Optional[int] = None - m_GridFont: Optional[bool] = None - m_Kerning: Optional[float] = None - m_PerCharacterKerning: Optional[List[Tuple[int, float]]] = None - m_PixelScale: Optional[float] = None - m_ShouldRoundAdvanceValue: Optional[bool] = None - m_Tracking: Optional[float] = None - m_UseLegacyBoundsCalculation: Optional[bool] = None + m_Ascent: float + m_AsciiStartOffset: int + m_CharacterRects: List[CharacterInfo] + m_ConvertCase: int + m_DefaultMaterial: PPtr[Material] + m_DefaultStyle: int + m_FontData: List[int] + m_FontNames: List[str] + m_FontSize: float + m_KerningValues: List[Tuple[Tuple[int, int], float]] + m_LineSpacing: float + m_Name: str + m_Texture: PPtr[Texture] + m_CharacterPadding: Optional[int] = None + m_CharacterSpacing: Optional[int] = None + m_Descent: Optional[float] = None + m_FallbackFonts: Optional[List[PPtr[Font]]] = None + m_FontCountX: Optional[int] = None + m_FontCountY: Optional[int] = None + m_FontRenderingMode: Optional[int] = None + m_GridFont: Optional[bool] = None + m_Kerning: Optional[float] = None + m_PerCharacterKerning: Optional[List[Tuple[int, float]]] = None + m_PixelScale: Optional[float] = None + m_ShouldRoundAdvanceValue: Optional[bool] = None + m_Tracking: Optional[float] = None + m_UseLegacyBoundsCalculation: Optional[bool] = None @unitypy_define class GameObjectRecorder(NamedObject): - m_Name: str + m_Name: str @unitypy_define class GraphicsStateCollection(NamedObject): - m_DeviceRenderer: int - m_Name: str - m_QualityLevelName: str - m_RenderPassInfoMap: List[Tuple[int, RenderPassInfo]] - m_RenderStateMap: List[Tuple[int, RenderStateInfo]] - m_RuntimePlatform: int - m_VariantInfoMap: List[Tuple[Hash128, VariantInfo]] - m_Version: int - m_VertexLayoutInfoMap: List[Tuple[int, VertexLayoutInfo]] + m_DeviceRenderer: int + m_Name: str + m_QualityLevelName: str + m_RenderPassInfoMap: List[Tuple[int, RenderPassInfo]] + m_RenderStateMap: List[Tuple[int, RenderStateInfo]] + m_RuntimePlatform: int + m_VariantInfoMap: List[Tuple[Hash128, VariantInfo]] + m_Version: int + m_VertexLayoutInfoMap: List[Tuple[int, VertexLayoutInfo]] @unitypy_define class HumanTemplate(NamedObject): - m_BoneTemplate: List[Tuple[str, str]] - m_Name: str + m_BoneTemplate: List[Tuple[str, str]] + m_Name: str @unitypy_define class ImportLog(NamedObject): - m_Logs: List[ImportLog_ImportLogEntry] - m_Name: str + m_Logs: List[ImportLog_ImportLogEntry] + m_Name: str @unitypy_define class LightProbes(NamedObject): - m_Name: str - bakedCoefficients: Optional[List[LightmapData]] = None - bakedPositions: Optional[List[Vector3f]] = None - hullRays: Optional[List[Vector3f]] = None - m_BakedCoefficients: Optional[List[SphericalHarmonicsL2]] = None - m_BakedLightOcclusion: Optional[List[LightProbeOcclusion]] = None - m_Data: Optional[LightProbeData] = None - m_HasBeenEdited: Optional[bool] = None - tetrahedra: Optional[List[Tetrahedron]] = None + m_Name: str + bakedCoefficients: Optional[List[LightmapData]] = None + bakedPositions: Optional[List[Vector3f]] = None + hullRays: Optional[List[Vector3f]] = None + m_BakedCoefficients: Optional[List[SphericalHarmonicsL2]] = None + m_BakedLightOcclusion: Optional[List[LightProbeOcclusion]] = None + m_Data: Optional[LightProbeData] = None + m_HasBeenEdited: Optional[bool] = None + tetrahedra: Optional[List[Tetrahedron]] = None @unitypy_define class LightingDataAsset(NamedObject): - m_BakedAmbientProbeInLinear: SphericalHarmonicsL2 - m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] - m_BakedReflectionProbes: List[SceneObjectIdentifier] - m_EnlightenData: List[int] - m_EnlightenSceneMapping: EnlightenSceneMapping - m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] - m_LightProbes: PPtr[LightProbes] - m_LightmappedRendererData: List[RendererData] - m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] - m_Lightmaps: List[LightmapData] - m_Lights: List[SceneObjectIdentifier] - m_Name: str - m_AOTextures: Optional[List[PPtr[Texture2D]]] = None - m_BakedLightIndices: Optional[List[int]] = None - m_BakedReflectionProbeCubemapCacheFiles: Optional[List[str]] = None - m_EnlightenDataVersion: Optional[int] = None - m_LightBakingOutputs: Optional[List[LightBakingOutput]] = None - m_LightmapsCacheFiles: Optional[List[str]] = None - m_LightmapsMode: Optional[int] = None - m_Scene: Optional[PPtr[SceneAsset]] = None - m_SceneGUID: Optional[GUID] = None + m_BakedAmbientProbeInLinear: SphericalHarmonicsL2 + m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] + m_BakedReflectionProbes: List[SceneObjectIdentifier] + m_EnlightenData: List[int] + m_EnlightenSceneMapping: EnlightenSceneMapping + m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] + m_LightProbes: PPtr[LightProbes] + m_LightmappedRendererData: List[RendererData] + m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] + m_Lightmaps: List[LightmapData] + m_Lights: List[SceneObjectIdentifier] + m_Name: str + m_AOTextures: Optional[List[PPtr[Texture2D]]] = None + m_BakedLightIndices: Optional[List[int]] = None + m_BakedReflectionProbeCubemapCacheFiles: Optional[List[str]] = None + m_EnlightenDataVersion: Optional[int] = None + m_LightBakingOutputs: Optional[List[LightBakingOutput]] = None + m_LightmapsCacheFiles: Optional[List[str]] = None + m_LightmapsMode: Optional[int] = None + m_Scene: Optional[PPtr[SceneAsset]] = None + m_SceneGUID: Optional[GUID] = None @unitypy_define class LightingDataAssetParent(NamedObject): - m_Name: str + m_Name: str @unitypy_define class LightingSettings(NamedObject): - m_AlbedoBoost: float - m_BounceScale: float - m_EnableBakedLightmaps: bool - m_EnableRealtimeLightmaps: bool - m_Name: str - m_RealtimeEnvironmentLighting: bool - m_UsingShadowmask: bool - m_AO: Optional[bool] = None - m_AOMaxDistance: Optional[float] = None - m_BakeBackend: Optional[int] = None - m_BakeResolution: Optional[float] = None - m_CompAOExponent: Optional[float] = None - m_CompAOExponentDirect: Optional[float] = None - m_ExportTrainingData: Optional[bool] = None - m_ExtractAO: Optional[bool] = None - m_FilterMode: Optional[int] = None - m_FinalGather: Optional[bool] = None - m_FinalGatherFiltering: Optional[bool] = None - m_FinalGatherRayCount: Optional[int] = None - m_ForceUpdates: Optional[bool] = None - m_ForceWhiteAlbedo: Optional[bool] = None - m_GIWorkflowMode: Optional[int] = None - m_IndirectOutputScale: Optional[float] = None - m_LightmapMaxSize: Optional[int] = None - m_LightmapParameters: Optional[PPtr[LightmapParameters]] = None - m_LightmapsBakeMode: Optional[int] = None - m_MixedBakeMode: Optional[int] = None - m_PVRBounces: Optional[int] = None - m_PVRCulling: Optional[bool] = None - m_PVRDenoiserTypeAO: Optional[int] = None - m_PVRDenoiserTypeDirect: Optional[int] = None - m_PVRDenoiserTypeIndirect: Optional[int] = None - m_PVRDirectSampleCount: Optional[int] = None - m_PVREnvironmentMIS: Optional[int] = None - m_PVREnvironmentReferencePointCount: Optional[int] = None - m_PVREnvironmentSampleCount: Optional[int] = None - m_PVRFilterTypeAO: Optional[int] = None - m_PVRFilterTypeDirect: Optional[int] = None - m_PVRFilterTypeIndirect: Optional[int] = None - m_PVRFilteringAtrousPositionSigmaAO: Optional[float] = None - m_PVRFilteringAtrousPositionSigmaDirect: Optional[float] = None - m_PVRFilteringAtrousPositionSigmaIndirect: Optional[float] = None - m_PVRFilteringGaussRadiusAO: Optional[int] = None - m_PVRFilteringGaussRadiusDirect: Optional[int] = None - m_PVRFilteringGaussRadiusIndirect: Optional[int] = None - m_PVRFilteringMode: Optional[int] = None - m_PVRSampleCount: Optional[int] = None - m_PVRSampling: Optional[int] = None - m_Padding: Optional[int] = None - m_RealtimeResolution: Optional[float] = None - m_TextureCompression: Optional[bool] = None - m_TrainingDataDestination: Optional[str] = None + m_AlbedoBoost: float + m_BounceScale: float + m_EnableBakedLightmaps: bool + m_EnableRealtimeLightmaps: bool + m_Name: str + m_RealtimeEnvironmentLighting: bool + m_UsingShadowmask: bool + m_AO: Optional[bool] = None + m_AOMaxDistance: Optional[float] = None + m_BakeBackend: Optional[int] = None + m_BakeResolution: Optional[float] = None + m_CompAOExponent: Optional[float] = None + m_CompAOExponentDirect: Optional[float] = None + m_ExportTrainingData: Optional[bool] = None + m_ExtractAO: Optional[bool] = None + m_FilterMode: Optional[int] = None + m_FinalGather: Optional[bool] = None + m_FinalGatherFiltering: Optional[bool] = None + m_FinalGatherRayCount: Optional[int] = None + m_ForceUpdates: Optional[bool] = None + m_ForceWhiteAlbedo: Optional[bool] = None + m_GIWorkflowMode: Optional[int] = None + m_IndirectOutputScale: Optional[float] = None + m_LightmapMaxSize: Optional[int] = None + m_LightmapParameters: Optional[PPtr[LightmapParameters]] = None + m_LightmapsBakeMode: Optional[int] = None + m_MixedBakeMode: Optional[int] = None + m_PVRBounces: Optional[int] = None + m_PVRCulling: Optional[bool] = None + m_PVRDenoiserTypeAO: Optional[int] = None + m_PVRDenoiserTypeDirect: Optional[int] = None + m_PVRDenoiserTypeIndirect: Optional[int] = None + m_PVRDirectSampleCount: Optional[int] = None + m_PVREnvironmentMIS: Optional[int] = None + m_PVREnvironmentReferencePointCount: Optional[int] = None + m_PVREnvironmentSampleCount: Optional[int] = None + m_PVRFilterTypeAO: Optional[int] = None + m_PVRFilterTypeDirect: Optional[int] = None + m_PVRFilterTypeIndirect: Optional[int] = None + m_PVRFilteringAtrousPositionSigmaAO: Optional[float] = None + m_PVRFilteringAtrousPositionSigmaDirect: Optional[float] = None + m_PVRFilteringAtrousPositionSigmaIndirect: Optional[float] = None + m_PVRFilteringGaussRadiusAO: Optional[int] = None + m_PVRFilteringGaussRadiusDirect: Optional[int] = None + m_PVRFilteringGaussRadiusIndirect: Optional[int] = None + m_PVRFilteringMode: Optional[int] = None + m_PVRSampleCount: Optional[int] = None + m_PVRSampling: Optional[int] = None + m_Padding: Optional[int] = None + m_RealtimeResolution: Optional[float] = None + m_TextureCompression: Optional[bool] = None + m_TrainingDataDestination: Optional[str] = None @unitypy_define class LightmapParameters(NamedObject): - AOAntiAliasingSamples: int - AOQuality: int - antiAliasingSamples: int - backFaceTolerance: float - bakedLightmapTag: int - blurRadius: int - clusterResolution: float - directLightQuality: int - edgeStitching: int - irradianceBudget: int - irradianceQuality: int - isTransparent: int - m_Name: str - modellingTolerance: float - resolution: float - systemTag: int - limitLightmapCount: Optional[bool] = None - maxLightmapCount: Optional[int] = None - pushoff: Optional[float] = None + AOAntiAliasingSamples: int + AOQuality: int + antiAliasingSamples: int + backFaceTolerance: float + bakedLightmapTag: int + blurRadius: int + clusterResolution: float + directLightQuality: int + edgeStitching: int + irradianceBudget: int + irradianceQuality: int + isTransparent: int + m_Name: str + modellingTolerance: float + resolution: float + systemTag: int + limitLightmapCount: Optional[bool] = None + maxLightmapCount: Optional[int] = None + pushoff: Optional[float] = None @unitypy_define class LocalizationAsset(NamedObject): - Editor_Asset: bool - Locale_ISO_Code: str - String_Table: List[Tuple[str, str]] - m_Name: str + Editor_Asset: bool + Locale_ISO_Code: str + String_Table: List[Tuple[str, str]] + m_Name: str @unitypy_define class Material(NamedObject): - m_Name: str - m_SavedProperties: UnityPropertySheet - m_Shader: PPtr[Shader] - disabledShaderPasses: Optional[List[str]] = None - m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None - m_CustomRenderQueue: Optional[int] = None - m_DoubleSidedGI: Optional[bool] = None - m_EnableInstancingVariants: Optional[bool] = None - m_InvalidKeywords: Optional[List[str]] = None - m_LightmapFlags: Optional[int] = None - m_ShaderKeywords: Optional[Union[str, List[str]]] = None - m_ValidKeywords: Optional[List[str]] = None - stringTagMap: Optional[List[Tuple[str, str]]] = None + m_Name: str + m_SavedProperties: UnityPropertySheet + m_Shader: PPtr[Shader] + disabledShaderPasses: Optional[List[str]] = None + m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None + m_CustomRenderQueue: Optional[int] = None + m_DoubleSidedGI: Optional[bool] = None + m_EnableInstancingVariants: Optional[bool] = None + m_InvalidKeywords: Optional[List[str]] = None + m_LightmapFlags: Optional[int] = None + m_ShaderKeywords: Optional[Union[List[str], str]] = None + m_ValidKeywords: Optional[List[str]] = None + stringTagMap: Optional[List[Tuple[str, str]]] = None @unitypy_define class ProceduralMaterial(Material): - m_Name: str - m_SavedProperties: UnityPropertySheet - m_Shader: PPtr[Shader] - disabledShaderPasses: Optional[List[str]] = None - m_AnimationUpdateRate: Optional[int] = None - m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None - m_CacheSize: Optional[int] = None - m_CustomRenderQueue: Optional[int] = None - m_DoubleSidedGI: Optional[bool] = None - m_EnableInstancingVariants: Optional[bool] = None - m_Flags: Optional[int] = None - m_GenerateMipmaps: Optional[bool] = None - m_Hash: Optional[Hash128] = None - m_Height: Optional[int] = None - m_Inputs: Optional[List[SubstanceInput]] = None - m_InvalidKeywords: Optional[List[str]] = None - m_LightmapFlags: Optional[int] = None - m_LoadingBehavior: Optional[int] = None - m_MaximumSize: Optional[int] = None - m_PrototypeName: Optional[str] = None - m_ShaderKeywords: Optional[Union[str, List[str]]] = None - m_SubstancePackage: Optional[PPtr[SubstanceArchive]] = None - m_Textures: Optional[List[PPtr[ProceduralTexture]]] = None - m_ValidKeywords: Optional[List[str]] = None - m_Width: Optional[int] = None - stringTagMap: Optional[List[Tuple[str, str]]] = None + m_Name: str + m_SavedProperties: UnityPropertySheet + m_Shader: PPtr[Shader] + disabledShaderPasses: Optional[List[str]] = None + m_AnimationUpdateRate: Optional[int] = None + m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None + m_CacheSize: Optional[int] = None + m_CustomRenderQueue: Optional[int] = None + m_DoubleSidedGI: Optional[bool] = None + m_EnableInstancingVariants: Optional[bool] = None + m_Flags: Optional[int] = None + m_GenerateMipmaps: Optional[bool] = None + m_Hash: Optional[Hash128] = None + m_Height: Optional[int] = None + m_Inputs: Optional[List[SubstanceInput]] = None + m_InvalidKeywords: Optional[List[str]] = None + m_LightmapFlags: Optional[int] = None + m_LoadingBehavior: Optional[int] = None + m_MaximumSize: Optional[int] = None + m_PrototypeName: Optional[str] = None + m_ShaderKeywords: Optional[Union[List[str], str]] = None + m_SubstancePackage: Optional[PPtr[SubstanceArchive]] = None + m_Textures: Optional[List[PPtr[ProceduralTexture]]] = None + m_ValidKeywords: Optional[List[str]] = None + m_Width: Optional[int] = None + stringTagMap: Optional[List[Tuple[str, str]]] = None @unitypy_define class Mesh(NamedObject): - m_BindPose: List[Matrix4x4f] - m_CompressedMesh: CompressedMesh - m_IndexBuffer: List[int] - m_LocalAABB: AABB - m_MeshCompression: int - m_MeshUsageFlags: int - m_Name: str - m_SubMeshes: List[SubMesh] - m_BakedConvexCollisionMesh: Optional[List[int]] = None - m_BakedTriangleCollisionMesh: Optional[List[int]] = None - m_BoneNameHashes: Optional[List[int]] = None - m_BonesAABB: Optional[List[MinMaxAABB]] = None - m_CollisionTriangles: Optional[List[int]] = None - m_CollisionVertexCount: Optional[int] = None - m_Colors: Optional[List[ColorRGBA]] = None - m_CookingOptions: Optional[int] = None - m_IndexFormat: Optional[int] = None - m_IsReadable: Optional[bool] = None - m_KeepIndices: Optional[bool] = None - m_KeepVertices: Optional[bool] = None - m_MeshMetrics_0_: Optional[float] = None - m_MeshMetrics_1_: Optional[float] = None - m_Normals: Optional[List[Vector3f]] = None - m_RootBoneNameHash: Optional[int] = None - m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None - m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None - m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None - m_StreamCompression: Optional[int] = None - m_StreamData: Optional[StreamingInfo] = None - m_Tangents: Optional[List[Vector4f]] = None - m_UV: Optional[List[Vector2f]] = None - m_UV1: Optional[List[Vector2f]] = None - m_Use16BitIndices: Optional[int] = None - m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None - m_VertexData: Optional[VertexData] = None - m_Vertices: Optional[List[Vector3f]] = None + m_BindPose: List[Matrix4x4f] + m_CompressedMesh: CompressedMesh + m_IndexBuffer: List[int] + m_LocalAABB: AABB + m_MeshCompression: int + m_Name: str + m_SubMeshes: List[SubMesh] + m_BakedConvexCollisionMesh: Optional[List[int]] = None + m_BakedTriangleCollisionMesh: Optional[List[int]] = None + m_BoneNameHashes: Optional[List[int]] = None + m_BonesAABB: Optional[List[MinMaxAABB]] = None + m_CollisionTriangles: Optional[List[int]] = None + m_CollisionVertexCount: Optional[int] = None + m_Colors: Optional[List[ColorRGBA]] = None + m_CookingOptions: Optional[int] = None + m_IndexFormat: Optional[int] = None + m_IsReadable: Optional[bool] = None + m_KeepIndices: Optional[bool] = None + m_KeepVertices: Optional[bool] = None + m_MeshLodInfo: Optional[MeshLodInfo] = None + m_MeshMetrics_0_: Optional[float] = None + m_MeshMetrics_1_: Optional[float] = None + m_MeshUsageFlags: Optional[int] = None + m_Normals: Optional[List[Vector3f]] = None + m_PreBakeConvexCollisionMesh: Optional[bool] = None + m_PreBakeTriangleCollisionMesh: Optional[bool] = None + m_RootBoneNameHash: Optional[int] = None + m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None + m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None + m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None + m_StreamCompression: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_Tangents: Optional[List[Vector4f]] = None + m_UV: Optional[List[Vector2f]] = None + m_UV1: Optional[List[Vector2f]] = None + m_Use16BitIndices: Optional[int] = None + m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None + m_VertexData: Optional[VertexData] = None + m_Vertices: Optional[List[Vector3f]] = None @unitypy_define class Motion(NamedObject, ABC): - pass + pass @unitypy_define class AnimationClip(Motion): - m_Bounds: AABB - m_Compressed: bool - m_CompressedRotationCurves: List[CompressedAnimationCurve] - m_Events: List[AnimationEvent] - m_FloatCurves: List[FloatCurve] - m_Name: str - m_PositionCurves: List[Vector3Curve] - m_RotationCurves: List[QuaternionCurve] - m_SampleRate: float - m_ScaleCurves: List[Vector3Curve] - m_WrapMode: int - m_AnimationType: Optional[int] = None - m_ClipBindingConstant: Optional[AnimationClipBindingConstant] = None - m_EulerCurves: Optional[List[Vector3Curve]] = None - m_HasGenericRootTransform: Optional[bool] = None - m_HasMotionFloatCurves: Optional[bool] = None - m_Legacy: Optional[bool] = None - m_MuscleClip: Optional[ClipMuscleConstant] = None - m_MuscleClipSize: Optional[int] = None - m_PPtrCurves: Optional[List[PPtrCurve]] = None - m_UseHighQualityCurve: Optional[bool] = None + m_Bounds: AABB + m_Compressed: bool + m_CompressedRotationCurves: List[CompressedAnimationCurve] + m_Events: List[AnimationEvent] + m_FloatCurves: List[FloatCurve] + m_Name: str + m_PositionCurves: List[Vector3Curve] + m_RotationCurves: List[QuaternionCurve] + m_SampleRate: float + m_ScaleCurves: List[Vector3Curve] + m_WrapMode: int + m_AnimationType: Optional[int] = None + m_ClipBindingConstant: Optional[AnimationClipBindingConstant] = None + m_EulerCurves: Optional[List[Vector3Curve]] = None + m_HasGenericRootTransform: Optional[bool] = None + m_HasMotionFloatCurves: Optional[bool] = None + m_Legacy: Optional[bool] = None + m_MuscleClip: Optional[ClipMuscleConstant] = None + m_MuscleClipSize: Optional[int] = None + m_PPtrCurves: Optional[List[PPtrCurve]] = None + m_UseHighQualityCurve: Optional[bool] = None @unitypy_define class PreviewAnimationClip(AnimationClip): - m_Bounds: AABB - m_ClipBindingConstant: AnimationClipBindingConstant - m_Compressed: bool - m_CompressedRotationCurves: List[CompressedAnimationCurve] - m_EulerCurves: List[Vector3Curve] - m_Events: List[AnimationEvent] - m_FloatCurves: List[FloatCurve] - m_Legacy: bool - m_MuscleClip: ClipMuscleConstant - m_MuscleClipSize: int - m_Name: str - m_PPtrCurves: List[PPtrCurve] - m_PositionCurves: List[Vector3Curve] - m_RotationCurves: List[QuaternionCurve] - m_SampleRate: float - m_ScaleCurves: List[Vector3Curve] - m_UseHighQualityCurve: bool - m_WrapMode: int - m_HasGenericRootTransform: Optional[bool] = None - m_HasMotionFloatCurves: Optional[bool] = None + m_Bounds: AABB + m_ClipBindingConstant: AnimationClipBindingConstant + m_Compressed: bool + m_CompressedRotationCurves: List[CompressedAnimationCurve] + m_EulerCurves: List[Vector3Curve] + m_Events: List[AnimationEvent] + m_FloatCurves: List[FloatCurve] + m_Legacy: bool + m_MuscleClip: ClipMuscleConstant + m_MuscleClipSize: int + m_Name: str + m_PPtrCurves: List[PPtrCurve] + m_PositionCurves: List[Vector3Curve] + m_RotationCurves: List[QuaternionCurve] + m_SampleRate: float + m_ScaleCurves: List[Vector3Curve] + m_UseHighQualityCurve: bool + m_WrapMode: int + m_HasGenericRootTransform: Optional[bool] = None + m_HasMotionFloatCurves: Optional[bool] = None @unitypy_define class BlendTree(Motion): - m_Childs: Union[List[Child], List[ChildMotion]] - m_MaxThreshold: float - m_MinThreshold: float - m_Name: str - m_UseAutomaticThresholds: bool - m_BlendEvent: Optional[str] = None - m_BlendEventY: Optional[str] = None - m_BlendParameter: Optional[str] = None - m_BlendParameterY: Optional[str] = None - m_BlendType: Optional[int] = None - m_NormalizedBlendValues: Optional[bool] = None + m_Childs: Union[List[ChildMotion], List[Child]] + m_MaxThreshold: float + m_MinThreshold: float + m_Name: str + m_UseAutomaticThresholds: bool + m_BlendEvent: Optional[str] = None + m_BlendEventY: Optional[str] = None + m_BlendParameter: Optional[str] = None + m_BlendParameterY: Optional[str] = None + m_BlendType: Optional[int] = None + m_NormalizedBlendValues: Optional[bool] = None @unitypy_define class NavMeshData(NamedObject): - m_HeightMeshes: List[HeightMeshData] - m_Heightmaps: List[HeightmapData] - m_Name: str - m_NavMeshTiles: List[NavMeshTileData] - m_OffMeshLinks: List[AutoOffMeshLinkData] - m_AgentTypeID: Optional[int] = None - m_NavMeshBuildSettings: Optional[NavMeshBuildSettings] = None - m_NavMeshParams: Optional[NavMeshParams] = None - m_Position: Optional[Vector3f] = None - m_Rotation: Optional[Quaternionf] = None - m_SourceBounds: Optional[AABB] = None + m_HeightMeshes: List[HeightMeshData] + m_Heightmaps: List[HeightmapData] + m_Name: str + m_NavMeshTiles: List[NavMeshTileData] + m_OffMeshLinks: List[AutoOffMeshLinkData] + m_AgentTypeID: Optional[int] = None + m_NavMeshBuildSettings: Optional[NavMeshBuildSettings] = None + m_NavMeshParams: Optional[NavMeshParams] = None + m_Position: Optional[Vector3f] = None + m_Rotation: Optional[Quaternionf] = None + m_SourceBounds: Optional[AABB] = None @unitypy_define class NavMeshObsolete(NamedObject): - m_Name: str + m_Name: str @unitypy_define class OcclusionCullingData(NamedObject): - m_Name: str - m_PVSData: List[int] - m_Scenes: List[OcclusionScene] + m_Name: str + m_PVSData: List[int] + m_Scenes: List[OcclusionScene] @unitypy_define class PhysicsMaterial(NamedObject): - m_Name: str - bounceCombine: Optional[int] = None - bounciness: Optional[float] = None - dynamicFriction: Optional[float] = None - frictionCombine: Optional[int] = None - m_BounceCombine: Optional[int] = None - m_Bounciness: Optional[float] = None - m_DynamicFriction: Optional[float] = None - m_FrictionCombine: Optional[int] = None - m_StaticFriction: Optional[float] = None - staticFriction: Optional[float] = None + m_Name: str + bounceCombine: Optional[int] = None + bounciness: Optional[float] = None + dynamicFriction: Optional[float] = None + frictionCombine: Optional[int] = None + m_BounceCombine: Optional[int] = None + m_Bounciness: Optional[float] = None + m_DynamicFriction: Optional[float] = None + m_FrictionCombine: Optional[int] = None + m_StaticFriction: Optional[float] = None + staticFriction: Optional[float] = None @unitypy_define class PhysicsMaterial2D(NamedObject): - bounciness: float - friction: float - m_Name: str - m_BounceCombine: Optional[int] = None - m_FrictionCombine: Optional[int] = None + bounciness: float + friction: float + m_Name: str + m_BounceCombine: Optional[int] = None + m_FrictionCombine: Optional[int] = None @unitypy_define class PreloadData(NamedObject): - m_Assets: List[PPtr[Object]] - m_Name: str - m_Dependencies: Optional[List[str]] = None - m_ExplicitDataLayout: Optional[bool] = None + m_Assets: List[PPtr[Object]] + m_Name: str + m_Dependencies: Optional[List[str]] = None + m_ExplicitDataLayout: Optional[bool] = None @unitypy_define class Preset(NamedObject): - m_Name: str - m_Properties: List[PropertyModification] - m_TargetType: PresetType - m_CoupledProperties: Optional[List[PropertyModification]] = None - m_CoupledType: Optional[PresetType] = None - m_ExcludedProperties: Optional[List[str]] = None + m_Name: str + m_Properties: List[PropertyModification] + m_TargetType: PresetType + m_CoupledProperties: Optional[List[PropertyModification]] = None + m_CoupledType: Optional[PresetType] = None + m_ExcludedProperties: Optional[List[str]] = None @unitypy_define class RayTracingShader(NamedObject): - m_MaxRecursionDepth: int - m_Name: str - variants: List[RayTracingShaderVariant] - m_EnableRayPayloadSizeChecks: Optional[bool] = None + m_MaxRecursionDepth: int + m_Name: str + variants: Union[List[RayTracingShaderPlatformVariant], List[RayTracingShaderVariant]] + m_EnableRayPayloadSizeChecks: Optional[bool] = None @unitypy_define class RoslynAdditionalFileAsset(NamedObject): - m_Name: str + m_Name: str @unitypy_define class RoslynAnalyzerConfigAsset(NamedObject): - m_Name: str + m_Name: str @unitypy_define class RuntimeAnimatorController(NamedObject): - m_AnimationClips: List[PPtr[AnimationClip]] - m_Controller: ControllerConstant - m_ControllerSize: int - m_Name: str - m_TOS: List[Tuple[int, str]] + m_AnimationClips: List[PPtr[AnimationClip]] + m_Controller: ControllerConstant + m_ControllerSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] @unitypy_define class AnimatorController(RuntimeAnimatorController): - m_AnimationClips: List[PPtr[AnimationClip]] - m_Controller: ControllerConstant - m_ControllerSize: int - m_Name: str - m_TOS: List[Tuple[int, str]] - m_MultiThreadedStateMachine: Optional[bool] = None - m_StateMachineBehaviourVectorDescription: Optional[ - StateMachineBehaviourVectorDescription - ] = None - m_StateMachineBehaviours: Optional[List[PPtr[MonoBehaviour]]] = None + m_AnimationClips: List[PPtr[AnimationClip]] + m_Controller: ControllerConstant + m_ControllerSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] + m_EvaluateTransitionsOnStart: Optional[bool] = None + m_MultiThreadedStateMachine: Optional[bool] = None + m_StateMachineBehaviourVectorDescription: Optional[StateMachineBehaviourVectorDescription] = None + m_StateMachineBehaviours: Optional[List[PPtr[MonoBehaviour]]] = None @unitypy_define class AnimatorOverrideController(RuntimeAnimatorController): - m_Clips: List[AnimationClipOverride] - m_Controller: PPtr[RuntimeAnimatorController] - m_Name: str + m_Clips: List[AnimationClipOverride] + m_Controller: PPtr[RuntimeAnimatorController] + m_Name: str @unitypy_define class Shader(NamedObject): - m_Name: str - compressedBlob: Optional[List[int]] = None - compressedLengths: Optional[Union[List[int], List[List[int]]]] = None - decompressedLengths: Optional[Union[List[int], List[List[int]]]] = None - decompressedSize: Optional[int] = None - m_AssetGUID: Optional[GUID] = None - m_Dependencies: Optional[List[PPtr[Shader]]] = None - m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None - m_ParsedForm: Optional[SerializedShader] = None - m_PathName: Optional[str] = None - m_Script: Optional[str] = None - m_ShaderIsBaked: Optional[bool] = None - m_SubProgramBlob: Optional[List[int]] = None - offsets: Optional[Union[List[int], List[List[int]]]] = None - platforms: Optional[List[int]] = None - stageCounts: Optional[List[int]] = None + m_Name: str + compressedBlob: Optional[List[int]] = None + compressedLengths: Optional[Union[List[List[int]], List[int]]] = None + decompressedLengths: Optional[Union[List[List[int]], List[int]]] = None + decompressedSize: Optional[int] = None + m_AssetGUID: Optional[GUID] = None + m_AssetLocalIdentifierInFile: Optional[int] = None + m_Dependencies: Optional[List[PPtr[Shader]]] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ParsedForm: Optional[SerializedShader] = None + m_PathName: Optional[str] = None + m_Script: Optional[str] = None + m_ShaderIsBaked: Optional[bool] = None + m_SubProgramBlob: Optional[List[int]] = None + offsets: Optional[Union[List[List[int]], List[int]]] = None + platforms: Optional[List[int]] = None + stageCounts: Optional[List[int]] = None @unitypy_define class ShaderVariantCollection(NamedObject): - m_Name: str - m_Shaders: List[Tuple[PPtr[Shader], ShaderInfo]] + m_Name: str + m_Shaders: List[Tuple[PPtr[Shader], ShaderInfo]] @unitypy_define class SpeedTreeWindAsset(NamedObject): - m_Name: str - m_Config8: Optional[SpeedTreeWindConfig8] = None - m_Config9: Optional[SpeedTreeWindConfig9] = None - m_Wind: Optional[SpeedTreeWind] = None - m_eVersion: Optional[int] = None + m_Name: str + m_Config8: Optional[SpeedTreeWindConfig8] = None + m_Config9: Optional[SpeedTreeWindConfig9] = None + m_Wind: Optional[SpeedTreeWind] = None + m_eVersion: Optional[int] = None @unitypy_define class Sprite(NamedObject): - m_Extrude: int - m_Name: str - m_Offset: Vector2f - m_PixelsToUnits: float - m_RD: SpriteRenderData - m_Rect: Rectf - m_AtlasTags: Optional[List[str]] = None - m_Bones: Optional[List[SpriteBone]] = None - m_Border: Optional[Vector4f] = None - m_IsPolygon: Optional[bool] = None - m_PhysicsShape: Optional[List[List[Vector2f]]] = None - m_Pivot: Optional[Vector2f] = None - m_RenderDataKey: Optional[Tuple[GUID, int]] = None - m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None - m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None + m_Extrude: int + m_Name: str + m_Offset: Vector2f + m_PixelsToUnits: float + m_RD: SpriteRenderData + m_Rect: Rectf + m_AtlasTags: Optional[List[str]] = None + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_IsPolygon: Optional[bool] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_Pivot: Optional[Vector2f] = None + m_RenderDataKey: Optional[Tuple[GUID, int]] = None + m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None + m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None @unitypy_define class SpriteAtlas(NamedObject): - m_IsVariant: bool - m_Name: str - m_PackedSpriteNamesToIndex: List[str] - m_PackedSprites: List[PPtr[Sprite]] - m_RenderDataMap: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] - m_Tag: str + m_IsVariant: bool + m_Name: str + m_RenderDataMap: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] + m_Tag: str + m_Guid: Optional[GUID] = None + m_PackedSpriteNamesToIndex: Optional[List[str]] = None + m_PackedSprites: Optional[List[PPtr[Sprite]]] = None @unitypy_define class SpriteAtlasAsset(NamedObject): - m_ImporterData: Union[SpriteAtlasEditorData, SpriteAtlasAssetData] - m_IsVariant: bool - m_MasterAtlas: PPtr[SpriteAtlas] - m_Name: str - m_ScriptablePacker: Optional[PPtr[Object]] = None + m_ImporterData: Union[SpriteAtlasAssetData, SpriteAtlasEditorData] + m_IsVariant: bool + m_MasterAtlas: PPtr[SpriteAtlas] + m_Name: str + m_ScriptablePacker: Optional[PPtr[Object]] = None @unitypy_define class SubstanceArchive(NamedObject): - m_Name: str - m_PackageData: Optional[List[int]] = None + m_Name: str + m_PackageData: Optional[List[int]] = None @unitypy_define class TerrainData(NamedObject): - m_DetailDatabase: DetailDatabase - m_Heightmap: Heightmap - m_Name: str - m_SplatDatabase: SplatDatabase - m_PreloadShaders: Optional[List[PPtr[Shader]]] = None + m_DetailDatabase: DetailDatabase + m_Heightmap: Heightmap + m_Name: str + m_SplatDatabase: SplatDatabase + m_PreloadShaders: Optional[List[PPtr[Shader]]] = None @unitypy_define class TerrainLayer(NamedObject): - m_DiffuseRemapMax: Vector4f - m_DiffuseRemapMin: Vector4f - m_DiffuseTexture: PPtr[Texture2D] - m_MaskMapRemapMax: Vector4f - m_MaskMapRemapMin: Vector4f - m_MaskMapTexture: PPtr[Texture2D] - m_Metallic: float - m_Name: str - m_NormalMapTexture: PPtr[Texture2D] - m_NormalScale: float - m_Smoothness: float - m_Specular: ColorRGBA - m_TileOffset: Vector2f - m_TileSize: Vector2f - m_SmoothnessSource: Optional[int] = None + m_DiffuseRemapMax: Vector4f + m_DiffuseRemapMin: Vector4f + m_DiffuseTexture: PPtr[Texture2D] + m_MaskMapRemapMax: Vector4f + m_MaskMapRemapMin: Vector4f + m_MaskMapTexture: PPtr[Texture2D] + m_Metallic: float + m_Name: str + m_NormalMapTexture: PPtr[Texture2D] + m_NormalScale: float + m_Smoothness: float + m_Specular: ColorRGBA + m_TileOffset: Vector2f + m_TileSize: Vector2f + m_SmoothnessSource: Optional[int] = None @unitypy_define class TextAsset(NamedObject): - m_Name: str - m_Script: str - m_PathName: Optional[str] = None + m_Name: str + m_Script: str + m_PathName: Optional[str] = None @unitypy_define class AssemblyDefinitionAsset(TextAsset): - m_Name: str - m_Script: str + m_Name: str + m_Script: str @unitypy_define class AssemblyDefinitionReferenceAsset(TextAsset): - m_Name: str - m_Script: str + m_Name: str + m_Script: str @unitypy_define class MonoScript(TextAsset): - m_AssemblyName: str - m_ClassName: str - m_ExecutionOrder: int - m_Name: str - m_Namespace: str - m_PropertiesHash: Union[Hash128, int] - m_IsEditorScript: Optional[bool] = None + m_AssemblyName: str + m_ClassName: str + m_ExecutionOrder: int + m_Name: str + m_Namespace: str + m_PropertiesHash: Union[Hash128, int] + m_IsEditorScript: Optional[bool] = None @unitypy_define class PackageManifest(TextAsset): - m_Name: str - m_Script: str + m_Name: str + m_Script: str @unitypy_define class RuleSetFileAsset(TextAsset): - m_Name: str - m_Script: str + m_Name: str + m_Script: str @unitypy_define class ShaderInclude(TextAsset): - m_Name: str - m_Script: Optional[str] = None + m_Name: str + m_Script: Optional[str] = None @unitypy_define class Texture(NamedObject, ABC): - pass + pass @unitypy_define class BaseVideoTexture(Texture, ABC): - pass + pass @unitypy_define class WebCamTexture(BaseVideoTexture): - m_Name: str - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None + m_Name: str + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None @unitypy_define class CubemapArray(Texture): - image_data: bytes - m_ColorSpace: int - m_CubemapCount: int - m_DataSize: int - m_Format: int - m_IsReadable: bool - m_MipCount: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_StreamData: Optional[StreamingInfo] = None - m_UsageMode: Optional[int] = None + image_data: bytes + m_ColorSpace: int + m_CubemapCount: int + m_DataSize: int + m_Format: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None @unitypy_define class LowerResBlitTexture(Texture): - m_Name: str - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None + m_Name: str + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None @unitypy_define class MovieTexture(Texture): - m_Name: str - m_AudioClip: Optional[PPtr[AudioClip]] = None - m_ColorSpace: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_Loop: Optional[bool] = None - m_MovieData: Optional[List[int]] = None + m_Name: str + m_AudioClip: Optional[PPtr[AudioClip]] = None + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_Loop: Optional[bool] = None + m_MovieData: Optional[List[int]] = None @unitypy_define class ProceduralTexture(Texture): - m_Name: str - AlphaSource: Optional[int] = None - AlphaSourceIsGrayscale: Optional[bool] = None - Format: Optional[int] = None - Type: Optional[int] = None - m_AlphaSourceIsInverted: Optional[bool] = None - m_AlphaSourceUID: Optional[int] = None - m_BakedData: Optional[List[int]] = None - m_BakedParameters: Optional[TextureParameters] = None - m_ColorSpace: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_LightmapFormat: Optional[int] = None - m_Mipmaps: Optional[int] = None - m_SubstanceMaterial: Optional[PPtr[ProceduralMaterial]] = None - m_SubstanceTextureUID: Optional[int] = None - m_TextureParameters: Optional[TextureParameters] = None - m_TextureSettings: Optional[GLTextureSettings] = None + m_Name: str + AlphaSource: Optional[int] = None + AlphaSourceIsGrayscale: Optional[bool] = None + Format: Optional[int] = None + Type: Optional[int] = None + m_AlphaSourceIsInverted: Optional[bool] = None + m_AlphaSourceUID: Optional[int] = None + m_BakedData: Optional[List[int]] = None + m_BakedParameters: Optional[TextureParameters] = None + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_LightmapFormat: Optional[int] = None + m_Mipmaps: Optional[int] = None + m_SubstanceMaterial: Optional[PPtr[ProceduralMaterial]] = None + m_SubstanceTextureUID: Optional[int] = None + m_TextureParameters: Optional[TextureParameters] = None + m_TextureSettings: Optional[GLTextureSettings] = None @unitypy_define class RenderTexture(Texture): - m_ColorFormat: int - m_Height: int - m_MipMap: bool - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_AntiAliasing: Optional[int] = None - m_BindMS: Optional[bool] = None - m_DepthFormat: Optional[int] = None - m_DepthStencilFormat: Optional[int] = None - m_Dimension: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_EnableCompatibleFormat: Optional[bool] = None - m_EnableRandomWrite: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_GenerateMips: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_IsCubemap: Optional[bool] = None - m_IsPowerOfTwo: Optional[bool] = None - m_MipCount: Optional[int] = None - m_SRGB: Optional[bool] = None - m_ShadowSamplingMode: Optional[int] = None - m_UseDynamicScale: Optional[bool] = None - m_UseDynamicScaleExplicit: Optional[bool] = None - m_VolumeDepth: Optional[int] = None + m_ColorFormat: int + m_Height: int + m_MipMap: bool + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_AntiAliasing: Optional[int] = None + m_BindMS: Optional[bool] = None + m_DepthFormat: Optional[int] = None + m_DepthStencilFormat: Optional[int] = None + m_Dimension: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_EnableCompatibleFormat: Optional[bool] = None + m_EnableRandomWrite: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_GenerateMips: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsCubemap: Optional[bool] = None + m_IsPowerOfTwo: Optional[bool] = None + m_MipCount: Optional[int] = None + m_SRGB: Optional[bool] = None + m_ShadowSamplingMode: Optional[int] = None + m_UseDynamicScale: Optional[bool] = None + m_UseDynamicScaleExplicit: Optional[bool] = None + m_VolumeDepth: Optional[int] = None @unitypy_define class CustomRenderTexture(RenderTexture): - m_AntiAliasing: int - m_ColorFormat: int - m_CubemapFaceMask: int - m_CurrentUpdateZoneSpace: int - m_Dimension: int - m_DoubleBuffered: bool - m_GenerateMips: bool - m_Height: int - m_InitColor: ColorRGBA - m_InitMaterial: PPtr[Material] - m_InitTexture: PPtr[Texture] - m_InitializationMode: int - m_Material: PPtr[Material] - m_MipMap: bool - m_Name: str - m_SRGB: bool - m_ShaderPass: int - m_TextureSettings: GLTextureSettings - m_UpdateMode: int - m_UpdatePeriod: float - m_UpdateZoneSpace: int - m_UpdateZones: List[UpdateZoneInfo] - m_VolumeDepth: int - m_Width: int - m_WrapUpdateZones: bool - m_BindMS: Optional[bool] = None - m_DepthFormat: Optional[int] = None - m_DepthStencilFormat: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_EnableCompatibleFormat: Optional[bool] = None - m_EnableRandomWrite: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_InitSource: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_MipCount: Optional[int] = None - m_ShadowSamplingMode: Optional[int] = None - m_UseDynamicScale: Optional[bool] = None - m_UseDynamicScaleExplicit: Optional[bool] = None + m_AntiAliasing: int + m_ColorFormat: int + m_CubemapFaceMask: int + m_CurrentUpdateZoneSpace: int + m_Dimension: int + m_DoubleBuffered: bool + m_GenerateMips: bool + m_Height: int + m_InitColor: ColorRGBA + m_InitMaterial: PPtr[Material] + m_InitTexture: PPtr[Texture] + m_InitializationMode: int + m_Material: PPtr[Material] + m_MipMap: bool + m_Name: str + m_SRGB: bool + m_ShaderPass: int + m_TextureSettings: GLTextureSettings + m_UpdateMode: int + m_UpdatePeriod: float + m_UpdateZoneSpace: int + m_UpdateZones: List[UpdateZoneInfo] + m_VolumeDepth: int + m_Width: int + m_WrapUpdateZones: bool + m_BindMS: Optional[bool] = None + m_DepthFormat: Optional[int] = None + m_DepthStencilFormat: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_EnableCompatibleFormat: Optional[bool] = None + m_EnableRandomWrite: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_InitSource: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipCount: Optional[int] = None + m_ShadowSamplingMode: Optional[int] = None + m_UseDynamicScale: Optional[bool] = None + m_UseDynamicScaleExplicit: Optional[bool] = None @unitypy_define class SparseTexture(Texture): - m_ColorSpace: int - m_Format: int - m_Height: int - m_MipCount: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None + m_ColorSpace: int + m_Format: int + m_Height: int + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None @unitypy_define class Texture2D(Texture): - image_data: bytes - m_CompleteImageSize: int - m_Height: int - m_ImageCount: int - m_IsReadable: bool - m_LightmapFormat: int - m_Name: str - m_TextureDimension: int - m_TextureFormat: int - m_TextureSettings: GLTextureSettings - m_Width: int - m_ColorSpace: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMasterTextureLimit: Optional[bool] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_IsPreProcessed: Optional[bool] = None - m_MipCount: Optional[int] = None - m_MipMap: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_PlatformBlob: Optional[List[int]] = None - m_ReadAllowed: Optional[bool] = None - m_StreamData: Optional[StreamingInfo] = None - m_StreamingMipmaps: Optional[bool] = None - m_StreamingMipmapsPriority: Optional[int] = None + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None @unitypy_define class Cubemap(Texture2D): - image_data: bytes - m_CompleteImageSize: int - m_Height: int - m_ImageCount: int - m_IsReadable: bool - m_LightmapFormat: int - m_Name: str - m_TextureDimension: int - m_TextureFormat: int - m_TextureSettings: GLTextureSettings - m_Width: int - m_ColorSpace: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMasterTextureLimit: Optional[bool] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_IsPreProcessed: Optional[bool] = None - m_MipCount: Optional[int] = None - m_MipMap: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_PlatformBlob: Optional[List[int]] = None - m_ReadAllowed: Optional[bool] = None - m_SourceTextures: Optional[List[PPtr[Texture2D]]] = None - m_StreamData: Optional[StreamingInfo] = None - m_StreamingMipmaps: Optional[bool] = None - m_StreamingMipmapsPriority: Optional[int] = None + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_SourceTextures: Optional[List[PPtr[Texture2D]]] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None @unitypy_define class Texture2DArray(Texture): - image_data: bytes - m_ColorSpace: int - m_DataSize: int - m_Depth: int - m_Format: int - m_Height: int - m_IsReadable: bool - m_MipCount: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_StreamData: Optional[StreamingInfo] = None - m_UsageMode: Optional[int] = None + image_data: bytes + m_ColorSpace: int + m_DataSize: int + m_Depth: int + m_Format: int + m_Height: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None @unitypy_define class Texture3D(Texture): - image_data: bytes - m_Height: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_ColorSpace: Optional[int] = None - m_CompleteImageSize: Optional[int] = None - m_DataSize: Optional[int] = None - m_Depth: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_Format: Optional[int] = None - m_ImageCount: Optional[int] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_IsReadable: Optional[bool] = None - m_LightmapFormat: Optional[int] = None - m_MipCount: Optional[int] = None - m_MipMap: Optional[bool] = None - m_ReadAllowed: Optional[bool] = None - m_StreamData: Optional[StreamingInfo] = None - m_TextureDimension: Optional[int] = None - m_TextureFormat: Optional[int] = None - m_UsageMode: Optional[int] = None + image_data: bytes + m_Height: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_CompleteImageSize: Optional[int] = None + m_DataSize: Optional[int] = None + m_Depth: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_Format: Optional[int] = None + m_ImageCount: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsReadable: Optional[bool] = None + m_LightmapFormat: Optional[int] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_TextureDimension: Optional[int] = None + m_TextureFormat: Optional[int] = None + m_UsageMode: Optional[int] = None + + +@unitypy_define +class UIAnimationClip(NamedObject): + m_AnimationClip: PPtr[AnimationClip] + m_Name: str @unitypy_define class VideoClip(NamedObject): - Height: int - Width: int - m_AudioChannelCount: List[int] - m_AudioLanguage: List[str] - m_AudioSampleRate: List[int] - m_ExternalResources: StreamedResource - m_Format: int - m_FrameCount: int - m_FrameRate: float - m_HasSplitAlpha: bool - m_Name: str - m_OriginalPath: str - m_ProxyHeight: int - m_ProxyWidth: int - m_PixelAspecRatioDen: Optional[int] = None - m_PixelAspecRatioNum: Optional[int] = None - m_VideoShaders: Optional[List[PPtr[Shader]]] = None - m_sRGB: Optional[bool] = None + Height: int + Width: int + m_AudioChannelCount: List[int] + m_AudioLanguage: List[str] + m_AudioSampleRate: List[int] + m_ExternalResources: StreamedResource + m_Format: int + m_FrameCount: int + m_FrameRate: float + m_HasSplitAlpha: bool + m_Name: str + m_OriginalPath: str + m_ProxyHeight: int + m_ProxyWidth: int + m_PixelAspecRatioDen: Optional[int] = None + m_PixelAspecRatioNum: Optional[int] = None + m_VideoShaders: Optional[List[PPtr[Shader]]] = None + m_sRGB: Optional[bool] = None @unitypy_define class VisualEffectObject(NamedObject, ABC): - pass + pass @unitypy_define class VisualEffectAsset(VisualEffectObject): - m_Infos: VisualEffectInfo - m_Name: str - m_Systems: List[VFXSystemDesc] + m_Infos: VisualEffectInfo + m_Name: str + m_Systems: List[VFXSystemDesc] @unitypy_define class VisualEffectSubgraph(VisualEffectObject, ABC): - pass + pass @unitypy_define class VisualEffectSubgraphBlock(VisualEffectSubgraph): - m_Name: str + m_Name: str @unitypy_define class VisualEffectSubgraphOperator(VisualEffectSubgraph): - m_Name: str + m_Name: str @unitypy_define class VisualEffectResource(NamedObject): - m_Graph: PPtr[MonoBehaviour] - m_Infos: Union[VisualEffectSettings, VisualEffectInfo] - m_Name: str - m_ShaderSources: Optional[List[VFXShaderSourceDesc]] = None - m_Systems: Optional[List[VFXEditorSystemDesc]] = None + m_Graph: PPtr[MonoBehaviour] + m_Infos: Union[VisualEffectInfo, VisualEffectSettings] + m_Name: str + m_ShaderSources: Optional[List[VFXShaderSourceDesc]] = None + m_Systems: Optional[List[VFXEditorSystemDesc]] = None + + +@unitypy_define +class VulkanDeviceFilterLists(NamedObject): + m_GfxJobFilterList: List[VulkanGraphicsJobsDeviceFilterData] + m_Name: str + m_VulkanAllowFilterList: List[AndroidDeviceFilterData] + m_VulkanDenyFilterList: List[AndroidDeviceFilterData] + + +@unitypy_define +class WebGPUDeviceFilterLists(NamedObject): + m_AllowFilterList: List[WebGPUDeviceFilterData] + m_DenyFilterList: List[WebGPUDeviceFilterData] + m_Name: str @unitypy_define class EditorExtensionImpl(Object): - gFlattenedTypeTree: Optional[List[int]] = None - m_DataTemplate: Optional[PPtr[DataTemplate]] = None - m_Object: Optional[PPtr[EditorExtension]] = None - m_OverrideVariable: Optional[bitset] = None - m_TemplateFather: Optional[PPtr[EditorExtensionImpl]] = None + gFlattenedTypeTree: Optional[List[int]] = None + m_DataTemplate: Optional[PPtr[DataTemplate]] = None + m_Object: Optional[PPtr[EditorExtension]] = None + m_OverrideVariable: Optional[bitset] = None + m_TemplateFather: Optional[PPtr[EditorExtensionImpl]] = None @unitypy_define class EditorSettings(Object): - m_AssetNamingUsesSpace: Optional[bool] = None - m_AssetPipelineMode: Optional[int] = None - m_AsyncShaderCompilation: Optional[bool] = None - m_Bc7TextureCompressor: Optional[int] = None - m_CacheServerDownloadBatchSize: Optional[int] = None - m_CacheServerEnableAuth: Optional[bool] = None - m_CacheServerEnableDownload: Optional[bool] = None - m_CacheServerEnableTls: Optional[bool] = None - m_CacheServerEnableUpload: Optional[bool] = None - m_CacheServerEndpoint: Optional[str] = None - m_CacheServerMode: Optional[int] = None - m_CacheServerNamespacePrefix: Optional[str] = None - m_CacheServerValidationMode: Optional[int] = None - m_CachingShaderPreprocessor: Optional[bool] = None - m_CollabEditorSettings: Optional[CollabEditorSettings] = None - m_DefaultBehaviorMode: Optional[int] = None - m_DisableCookiesInLightmapper: Optional[bool] = None - m_EnableEditorAsyncCPUTextureLoading: Optional[bool] = None - m_EnableEnlightenBakedGI: Optional[bool] = None - m_EnableRoslynAnalyzers: Optional[bool] = None - m_EnableTextureStreamingInEditMode: Optional[bool] = None - m_EnableTextureStreamingInPlayMode: Optional[bool] = None - m_EnterPlayModeOptions: Optional[int] = None - m_EnterPlayModeOptionsEnabled: Optional[bool] = None - m_EtcTextureBestCompressor: Optional[int] = None - m_EtcTextureCompressorBehavior: Optional[int] = None - m_EtcTextureFastCompressor: Optional[int] = None - m_EtcTextureNormalCompressor: Optional[int] = None - m_ExternalVersionControlSupport: Optional[Union[str, int]] = None - m_GameObjectNamingDigits: Optional[int] = None - m_GameObjectNamingScheme: Optional[int] = None - m_InspectorUseIMGUIDefaultInspector: Optional[bool] = None - m_LineEndingsForNewScripts: Optional[int] = None - m_PrefabModeAllowAutoSave: Optional[bool] = None - m_PrefabRegularEnvironment: Optional[PPtr[SceneAsset]] = None - m_PrefabUIEnvironment: Optional[PPtr[SceneAsset]] = None - m_ProjectGenerationIncludedExtensions: Optional[str] = None - m_ProjectGenerationRootNamespace: Optional[str] = None - m_RecalculateEnvironmentLighting: Optional[bool] = None - m_ReferencedClipsExactNaming: Optional[bool] = None - m_RefreshImportMode: Optional[int] = None - m_SerializationMode: Optional[int] = None - m_SerializeInlineMappingsOnOneLine: Optional[bool] = None - m_ShowLightmapResolutionOverlay: Optional[bool] = None - m_SpritePackerCacheSize: Optional[int] = None - m_SpritePackerMode: Optional[int] = None - m_SpritePackerPaddingPower: Optional[int] = None - m_UseLegacyProbeSampleCount: Optional[bool] = None - m_UserGeneratedProjectSuffix: Optional[str] = None - m_WebSecurityEmulationEnabled: Optional[int] = None - m_WebSecurityEmulationHostUrl: Optional[str] = None + m_AssetNamingUsesSpace: Optional[bool] = None + m_AssetPipelineMode: Optional[int] = None + m_AsyncShaderCompilation: Optional[bool] = None + m_Bc7TextureCompressor: Optional[int] = None + m_BlockShaders: Optional[bool] = None + m_CacheServerDownloadBatchSize: Optional[int] = None + m_CacheServerEnableAuth: Optional[bool] = None + m_CacheServerEnableDownload: Optional[bool] = None + m_CacheServerEnableTls: Optional[bool] = None + m_CacheServerEnableUpload: Optional[bool] = None + m_CacheServerEndpoint: Optional[str] = None + m_CacheServerImportResultCachingEnabled: Optional[bool] = None + m_CacheServerMode: Optional[int] = None + m_CacheServerNamespacePrefix: Optional[str] = None + m_CacheServerValidationMode: Optional[int] = None + m_CachingShaderPreprocessor: Optional[bool] = None + m_CollabEditorSettings: Optional[CollabEditorSettings] = None + m_DefaultBehaviorMode: Optional[int] = None + m_DisableCookiesInLightmapper: Optional[bool] = None + m_EnableEditorAsyncCPUTextureLoading: Optional[bool] = None + m_EnableEnlightenBakedGI: Optional[bool] = None + m_EnableMSBuildCompilationPipeline: Optional[bool] = None + m_EnableRoslynAnalyzers: Optional[bool] = None + m_EnableTextureStreamingInEditMode: Optional[bool] = None + m_EnableTextureStreamingInPlayMode: Optional[bool] = None + m_EnterPlayModeOptions: Optional[int] = None + m_EnterPlayModeOptionsEnabled: Optional[bool] = None + m_EtcTextureBestCompressor: Optional[int] = None + m_EtcTextureCompressorBehavior: Optional[int] = None + m_EtcTextureFastCompressor: Optional[int] = None + m_EtcTextureNormalCompressor: Optional[int] = None + m_ExternalVersionControlSupport: Optional[Union[int, str]] = None + m_ForceAssetUnloadAndGCOnSceneLoad: Optional[bool] = None + m_GameObjectNamingDigits: Optional[int] = None + m_GameObjectNamingScheme: Optional[int] = None + m_HideBuildProfileClassicPlatforms: Optional[bool] = None + m_InspectorUseIMGUIDefaultInspector: Optional[bool] = None + m_LineEndingsForNewScripts: Optional[int] = None + m_PrefabModeAllowAutoSave: Optional[bool] = None + m_PrefabRegularEnvironment: Optional[PPtr[SceneAsset]] = None + m_PrefabUIEnvironment: Optional[PPtr[SceneAsset]] = None + m_ProjectGenerationIncludedExtensions: Optional[str] = None + m_ProjectGenerationRootNamespace: Optional[str] = None + m_RecalculateEnvironmentLighting: Optional[bool] = None + m_ReferencedClipsExactNaming: Optional[bool] = None + m_RefreshImportMode: Optional[int] = None + m_SerializationMode: Optional[int] = None + m_SerializeInlineMappingsOnOneLine: Optional[bool] = None + m_ShadowmaskStitching: Optional[bool] = None + m_ShowLightmapResolutionOverlay: Optional[bool] = None + m_SpritePackerCacheSize: Optional[int] = None + m_SpritePackerMode: Optional[int] = None + m_SpritePackerPaddingPower: Optional[int] = None + m_UnlockBlockShaders: Optional[bool] = None + m_UseLegacyHierarchy: Optional[bool] = None + m_UseLegacyProbeSampleCount: Optional[bool] = None + m_UserGeneratedProjectSuffix: Optional[str] = None + m_WebSecurityEmulationEnabled: Optional[int] = None + m_WebSecurityEmulationHostUrl: Optional[str] = None @unitypy_define class EditorUserBuildSettings(Object): - m_ActiveBuildTarget: int - m_AllowDebugging: bool - m_ArchitectureFlags: int - m_BuildLocation: List[str] - m_ConnectProfiler: bool - m_Development: bool - m_InstallInBuildFolder: bool - m_SelectedAndroidSubtarget: int - m_SelectedBuildTargetGroup: int - m_SelectedStandaloneTarget: int - m_ActiveBuildPlatformGroupName: Optional[str] = None - m_ActiveBuildTargetGroup: Optional[int] = None - m_ActivePlatformGuid: Optional[GUID] = None - m_ActiveProfilePath: Optional[str] = None - m_ActiveStandaloneBuildSubtarget: Optional[int] = None - m_AndroidBuildSystem: Optional[int] = None - m_AndroidBuildType: Optional[int] = None - m_AndroidCreateSymbols: Optional[int] = None - m_AndroidCreateSymbolsZip: Optional[bool] = None - m_AndroidCurrentDeploymentTargetId: Optional[str] = None - m_AndroidDebugMinification: Optional[int] = None - m_AndroidDeviceSocketAddress: Optional[str] = None - m_AndroidReleaseMinification: Optional[int] = None - m_AndroidUseLegacySdkTools: Optional[bool] = None - m_BuildAppBundle: Optional[bool] = None - m_BuildScriptsOnly: Optional[bool] = None - m_BuildWithDeepProfilingSupport: Optional[bool] = None - m_CompressFilesInPackage: Optional[bool] = None - m_CompressWithPsArc: Optional[bool] = None - m_CreateRomFileForSwitch: Optional[bool] = None - m_CreateSolutionFileForSwitch: Optional[bool] = None - m_DatalessPlayer: Optional[bool] = None - m_EnableDebugPadForSwitch: Optional[bool] = None - m_EnableHeadlessMode: Optional[bool] = None - m_EnableHeapInspectorForSwitch: Optional[bool] = None - m_EnableHostIOForSwitch: Optional[bool] = None - m_EnableMemoryTrackerForSwitch: Optional[bool] = None - m_EnableRomCompressionForSwitch: Optional[bool] = None - m_ExplicitArrayBoundsChecks: Optional[bool] = None - m_ExplicitDivideByZeroChecks: Optional[bool] = None - m_ExplicitNullChecks: Optional[bool] = None - m_ExportAsGoogleAndroidProject: Optional[bool] = None - m_FacebookAccessToken: Optional[str] = None - m_FacebookCreatePackageForSubmission: Optional[bool] = None - m_ForceInstallation: Optional[bool] = None - m_ForceOptimizeScriptCompilation: Optional[bool] = None - m_GenerateMetroReferenceProjects: Optional[bool] = None - m_GenerateNintendoSwitchShaderInfo: Optional[bool] = None - m_GenerateWSAReferenceProjects: Optional[bool] = None - m_HTCSScriptDebuggingForSwitch: Optional[bool] = None - m_Il2CppCodeGeneration: Optional[int] = None - m_MovePackageToDiscOuterEdge: Optional[bool] = None - m_NVNAftermath: Optional[bool] = None - m_NVNDrawValidation: Optional[bool] = None - m_NVNDrawValidationHeavy: Optional[bool] = None - m_NVNDrawValidationLight: Optional[bool] = None - m_NVNGraphicsDebuggerForSwitch: Optional[bool] = None - m_NVNShaderDebugging: Optional[bool] = None - m_NeedSubmissionMaterials: Optional[bool] = None - m_OverrideMaxTextureSize: Optional[int] = None - m_OverrideTextureCompression: Optional[int] = None - m_PS4HardwareTarget: Optional[int] = None - m_PS5KeepPackageFiles: Optional[bool] = None - m_PS5WorkspaceName: Optional[str] = None - m_PathOnRemoteDevice: Optional[str] = None - m_PlatformSettings: Optional[List[Tuple[str, PlatformSettingsData]]] = None - m_RedirectWritesToHostMountForSwitch: Optional[bool] = None - m_RemoteDeviceAddress: Optional[str] = None - m_RemoteDeviceExports: Optional[str] = None - m_RemoteDeviceInfo: Optional[bool] = None - m_RemoteDeviceUsername: Optional[str] = None - m_RomCompressionConfigForSwitch: Optional[str] = None - m_RomCompressionLevelForSwitch: Optional[int] = None - m_RomCompressionTypeForSwitch: Optional[int] = None - m_SaveADFForSwitch: Optional[bool] = None - m_SelectedAndroidETC2Fallback: Optional[int] = None - m_SelectedBlackBerryBuildType: Optional[int] = None - m_SelectedBlackBerrySubtarget: Optional[int] = None - m_SelectedBuildPlatformGroupName: Optional[str] = None - m_SelectedBuildTarget: Optional[int] = None - m_SelectedCompressionType: Optional[List[Tuple[str, int]]] = None - m_SelectedEmbeddedLinuxArchitecture: Optional[int] = None - m_SelectedFacebookTarget: Optional[int] = None - m_SelectedIOSBuildType: Optional[int] = None - m_SelectedMetroBuildAndRunDeployTarget: Optional[int] = None - m_SelectedMetroBuildType: Optional[int] = None - m_SelectedMetroSDK: Optional[int] = None - m_SelectedMetroTarget: Optional[int] = None - m_SelectedPS3Subtarget: Optional[int] = None - m_SelectedPS4Subtarget: Optional[int] = None - m_SelectedPS5CompressionLevel: Optional[int] = None - m_SelectedPS5CompressionType: Optional[int] = None - m_SelectedPS5Subtarget: Optional[int] = None - m_SelectedPSMSubtarget: Optional[int] = None - m_SelectedPSP2Subtarget: Optional[int] = None - m_SelectedQNXArchitecture: Optional[int] = None - m_SelectedQNXOsVersion: Optional[int] = None - m_SelectedStandaloneBuildSubtarget: Optional[int] = None - m_SelectedTizenSubtarget: Optional[int] = None - m_SelectedWSAArchitecture: Optional[str] = None - m_SelectedWSABuildAndRunDeployTarget: Optional[int] = None - m_SelectedWSAMinUWPSDK: Optional[str] = None - m_SelectedWSASDK: Optional[int] = None - m_SelectedWSASubtarget: Optional[int] = None - m_SelectedWSAUWPBuildType: Optional[int] = None - m_SelectedWSAUWPSDK: Optional[str] = None - m_SelectedWSAUWPVSVersion: Optional[str] = None - m_SelectedWebGLSubtarget: Optional[int] = None - m_SelectedWiiDebugLevel: Optional[int] = None - m_SelectedWiiSubtarget: Optional[int] = None - m_SelectedWiiUBootMode: Optional[int] = None - m_SelectedWiiUBuildOutput: Optional[int] = None - m_SelectedWiiUDebugLevel: Optional[int] = None - m_SelectedWindowsBuildAndRunDeployTarget: Optional[int] = None - m_SelectedXboxOneDeployDrive: Optional[int] = None - m_SelectedXboxOneDeployMethod: Optional[int] = None - m_SelectedXboxRunMethod: Optional[int] = None - m_SelectedXboxSubtarget: Optional[int] = None - m_SymlinkLibraries: Optional[bool] = None - m_SymlinkSources: Optional[bool] = None - m_SymlinkTrampoline: Optional[bool] = None - m_UseLegacyNvnPoolAllocatorForSwitch: Optional[bool] = None - m_WSADotNetNativeEnabled: Optional[List[bool]] = None - m_WaitForPlayerConnection: Optional[bool] = None - m_WaitForSwitchMemoryTrackerOnStartup: Optional[bool] = None - m_WebGLClientBrowserPath: Optional[str] = None - m_WebGLClientBrowserType: Optional[int] = None - m_WebGLClientPlatform: Optional[int] = None - m_WebGLOptimizationLevel: Optional[int] = None - m_WebGLUsePreBuiltUnityEngine: Optional[bool] = None - m_WebPlayerDeployOnline: Optional[bool] = None - m_WebPlayerNaClSupport: Optional[bool] = None - m_WebPlayerOfflineDeployment: Optional[bool] = None - m_WebPlayerStreamed: Optional[bool] = None - m_WiiUEnableNetAPI: Optional[bool] = None - m_WindowsDevicePortalAddress: Optional[str] = None - m_WindowsDevicePortalUsername: Optional[str] = None - m_WsaHolographicRemoting: Optional[bool] = None - m_XboxCompressedXex: Optional[bool] = None - m_XboxOneNetworkSharePath: Optional[str] = None - m_XboxOneStreamingInstallLaunchChunkRange: Optional[int] = None - m_XboxOneUsername: Optional[str] = None - m_macosXcodeBuildConfig: Optional[int] = None + m_ActiveBuildTarget: int + m_AllowDebugging: bool + m_ArchitectureFlags: int + m_BuildLocation: List[str] + m_ConnectProfiler: bool + m_Development: bool + m_InstallInBuildFolder: bool + m_SelectedAndroidSubtarget: int + m_SelectedBuildTargetGroup: int + m_SelectedStandaloneTarget: int + m_ActiveBuildPlatformGroupName: Optional[str] = None + m_ActiveBuildProfile: Optional[PPtr[MonoBehaviour]] = None + m_ActiveBuildTargetGroup: Optional[int] = None + m_ActivePlatformGuid: Optional[GUID] = None + m_ActiveProfilePath: Optional[str] = None + m_ActiveStandaloneBuildSubtarget: Optional[int] = None + m_AndroidBuildSystem: Optional[int] = None + m_AndroidBuildType: Optional[int] = None + m_AndroidCreateSymbols: Optional[int] = None + m_AndroidCreateSymbolsZip: Optional[bool] = None + m_AndroidCurrentDeploymentTargetId: Optional[str] = None + m_AndroidDebugMinification: Optional[int] = None + m_AndroidDeviceSocketAddress: Optional[str] = None + m_AndroidReleaseMinification: Optional[int] = None + m_AndroidUseLegacySdkTools: Optional[bool] = None + m_BuildAppBundle: Optional[bool] = None + m_BuildOutputToBuildMetadataMap: Optional[List[Tuple[str, str]]] = None + m_BuildScriptsOnly: Optional[bool] = None + m_BuildWithCodeCoverage: Optional[bool] = None + m_BuildWithDeepProfilingSupport: Optional[bool] = None + m_CompressFilesInPackage: Optional[bool] = None + m_CompressWithPsArc: Optional[bool] = None + m_CreateRomFileForSwitch: Optional[bool] = None + m_CreateSolutionFileForSwitch: Optional[bool] = None + m_DatalessPlayer: Optional[bool] = None + m_EnableDebugPadForSwitch: Optional[bool] = None + m_EnableHeadlessMode: Optional[bool] = None + m_EnableHeapInspectorForSwitch: Optional[bool] = None + m_EnableHostIOForSwitch: Optional[bool] = None + m_EnableMemoryTrackerForSwitch: Optional[bool] = None + m_EnableRomCompressionForSwitch: Optional[bool] = None + m_EnableUnpublishableErrorsForSwitch: Optional[bool] = None + m_ExplicitArrayBoundsChecks: Optional[bool] = None + m_ExplicitDivideByZeroChecks: Optional[bool] = None + m_ExplicitNullChecks: Optional[bool] = None + m_ExportAsGoogleAndroidProject: Optional[bool] = None + m_FacebookAccessToken: Optional[str] = None + m_FacebookCreatePackageForSubmission: Optional[bool] = None + m_ForceInstallation: Optional[bool] = None + m_ForceOptimizeScriptCompilation: Optional[bool] = None + m_GenerateMetroReferenceProjects: Optional[bool] = None + m_GenerateNintendoSwitchShaderInfo: Optional[bool] = None + m_GenerateWSAReferenceProjects: Optional[bool] = None + m_HTCSScriptDebuggingForSwitch: Optional[bool] = None + m_Il2CppCodeGeneration: Optional[int] = None + m_MovePackageToDiscOuterEdge: Optional[bool] = None + m_NVNAftermath: Optional[bool] = None + m_NVNAftermathLevel: Optional[int] = None + m_NVNDrawValidation: Optional[bool] = None + m_NVNDrawValidationHeavy: Optional[bool] = None + m_NVNDrawValidationLight: Optional[bool] = None + m_NVNGraphicsDebuggerForSwitch: Optional[bool] = None + m_NVNShaderDebugging: Optional[bool] = None + m_NeedSubmissionMaterials: Optional[bool] = None + m_OverrideMaxTextureSize: Optional[int] = None + m_OverrideTextureCompression: Optional[int] = None + m_PS4HardwareTarget: Optional[int] = None + m_PS5KeepPackageFiles: Optional[bool] = None + m_PS5WorkspaceName: Optional[str] = None + m_PathOnRemoteDevice: Optional[str] = None + m_PlatformSettings: Optional[List[Tuple[str, PlatformSettingsData]]] = None + m_RedirectWritesToHostMountForSwitch: Optional[bool] = None + m_RemoteDeviceAddress: Optional[str] = None + m_RemoteDeviceExports: Optional[str] = None + m_RemoteDeviceInfo: Optional[bool] = None + m_RemoteDeviceUsername: Optional[str] = None + m_RomCompressionConfigForSwitch: Optional[str] = None + m_RomCompressionLevelForSwitch: Optional[int] = None + m_RomCompressionTypeForSwitch: Optional[int] = None + m_SaveADFForSwitch: Optional[bool] = None + m_SelectedAndroidETC2Fallback: Optional[int] = None + m_SelectedBlackBerryBuildType: Optional[int] = None + m_SelectedBlackBerrySubtarget: Optional[int] = None + m_SelectedBuildPlatformGroupName: Optional[str] = None + m_SelectedBuildTarget: Optional[int] = None + m_SelectedCompressionType: Optional[List[Tuple[str, int]]] = None + m_SelectedDiagnosticSetting: Optional[List[Tuple[str, int]]] = None + m_SelectedEmbeddedLinuxArchitecture: Optional[int] = None + m_SelectedFacebookTarget: Optional[int] = None + m_SelectedIOSBuildType: Optional[int] = None + m_SelectedMetroBuildAndRunDeployTarget: Optional[int] = None + m_SelectedMetroBuildType: Optional[int] = None + m_SelectedMetroSDK: Optional[int] = None + m_SelectedMetroTarget: Optional[int] = None + m_SelectedPS3Subtarget: Optional[int] = None + m_SelectedPS4Subtarget: Optional[int] = None + m_SelectedPS5CompressionLevel: Optional[int] = None + m_SelectedPS5CompressionType: Optional[int] = None + m_SelectedPS5Subtarget: Optional[int] = None + m_SelectedPSMSubtarget: Optional[int] = None + m_SelectedPSP2Subtarget: Optional[int] = None + m_SelectedQNXArchitecture: Optional[int] = None + m_SelectedQNXOsVersion: Optional[int] = None + m_SelectedStandaloneBuildSubtarget: Optional[int] = None + m_SelectedTizenSubtarget: Optional[int] = None + m_SelectedWSAArchitecture: Optional[str] = None + m_SelectedWSABuildAndRunDeployTarget: Optional[int] = None + m_SelectedWSAMinUWPSDK: Optional[str] = None + m_SelectedWSASDK: Optional[int] = None + m_SelectedWSASubtarget: Optional[int] = None + m_SelectedWSAUWPBuildType: Optional[int] = None + m_SelectedWSAUWPSDK: Optional[str] = None + m_SelectedWSAUWPVSVersion: Optional[str] = None + m_SelectedWebGLSubtarget: Optional[int] = None + m_SelectedWiiDebugLevel: Optional[int] = None + m_SelectedWiiSubtarget: Optional[int] = None + m_SelectedWiiUBootMode: Optional[int] = None + m_SelectedWiiUBuildOutput: Optional[int] = None + m_SelectedWiiUDebugLevel: Optional[int] = None + m_SelectedWindowsBuildAndRunDeployTarget: Optional[int] = None + m_SelectedXboxOneDeployDrive: Optional[int] = None + m_SelectedXboxOneDeployMethod: Optional[int] = None + m_SelectedXboxRunMethod: Optional[int] = None + m_SelectedXboxSubtarget: Optional[int] = None + m_SymlinkLibraries: Optional[bool] = None + m_SymlinkSources: Optional[bool] = None + m_SymlinkTrampoline: Optional[bool] = None + m_UseLegacyNvnPoolAllocatorForSwitch: Optional[bool] = None + m_WSADotNetNativeEnabled: Optional[List[bool]] = None + m_WaitForPlayerConnection: Optional[bool] = None + m_WaitForSwitchMemoryTrackerOnStartup: Optional[bool] = None + m_WebGLClientBrowserPath: Optional[str] = None + m_WebGLClientBrowserType: Optional[int] = None + m_WebGLClientPlatform: Optional[int] = None + m_WebGLOptimizationLevel: Optional[int] = None + m_WebGLUsePreBuiltUnityEngine: Optional[bool] = None + m_WebPlayerDeployOnline: Optional[bool] = None + m_WebPlayerNaClSupport: Optional[bool] = None + m_WebPlayerOfflineDeployment: Optional[bool] = None + m_WebPlayerStreamed: Optional[bool] = None + m_WiiUEnableNetAPI: Optional[bool] = None + m_WindowsDevicePortalAddress: Optional[str] = None + m_WindowsDevicePortalUsername: Optional[str] = None + m_WsaHolographicRemoting: Optional[bool] = None + m_XboxCompressedXex: Optional[bool] = None + m_XboxOneNetworkSharePath: Optional[str] = None + m_XboxOneStreamingInstallLaunchChunkRange: Optional[int] = None + m_XboxOneUsername: Optional[str] = None + m_macosXcodeBuildConfig: Optional[int] = None @unitypy_define class EditorUserSettings(Object): - m_VCAutomaticAdd: bool - m_VCDebugCmd: bool - m_VCDebugCom: bool - m_VCDebugOut: bool - m_ArtifactGarbageCollection: Optional[bool] = None - m_AssetPipelineMode: Optional[int] = None - m_AssetPipelineMode2: Optional[int] = None - m_CacheServerMode: Optional[int] = None - m_CacheServers: Optional[List[str]] = None - m_CompressAssetsOnImport: Optional[bool] = None - m_ConfigSettings: Optional[List[Tuple[str, ConfigSetting]]] = None - m_ConfigValues: Optional[List[Tuple[str, str]]] = None - m_DesiredImportWorkerCount: Optional[int] = None - m_IdleImportWorkerShutdownDelay: Optional[int] = None - m_SemanticMergeMode: Optional[int] = None - m_StandbyImportWorkerCount: Optional[int] = None - m_VCAllowAsyncUpdate: Optional[bool] = None - m_VCHierarchyOverlayIcons: Optional[bool] = None - m_VCOtherOverlayIcons: Optional[bool] = None - m_VCOverlayIcons: Optional[bool] = None - m_VCOverwriteFailedCheckoutAssets: Optional[bool] = None - m_VCPassword: Optional[str] = None - m_VCProjectOverlayIcons: Optional[bool] = None - m_VCScanLocalPackagesOnConnect: Optional[bool] = None - m_VCServer: Optional[str] = None - m_VCShowFailedCheckout: Optional[bool] = None - m_VCUserName: Optional[str] = None - m_VCWorkspace: Optional[str] = None + m_VCAutomaticAdd: bool + m_VCDebugCmd: bool + m_VCDebugCom: bool + m_VCDebugOut: bool + m_ArtifactGarbageCollection: Optional[bool] = None + m_AssetPipelineMode: Optional[int] = None + m_AssetPipelineMode2: Optional[int] = None + m_CacheServerMode: Optional[int] = None + m_CacheServers: Optional[List[str]] = None + m_CompressAssetsOnImport: Optional[bool] = None + m_ConfigSettings: Optional[List[Tuple[str, ConfigSetting]]] = None + m_ConfigValues: Optional[List[Tuple[str, str]]] = None + m_DesiredImportWorkerCount: Optional[int] = None + m_IdleImportWorkerShutdownDelay: Optional[int] = None + m_SemanticMergeMode: Optional[int] = None + m_StandbyImportWorkerCount: Optional[int] = None + m_VCAllowAsyncUpdate: Optional[bool] = None + m_VCAutoRevertUnchangedFiles: Optional[bool] = None + m_VCHierarchyOverlayIcons: Optional[bool] = None + m_VCOtherOverlayIcons: Optional[bool] = None + m_VCOverlayIcons: Optional[bool] = None + m_VCOverwriteFailedCheckoutAssets: Optional[bool] = None + m_VCPassword: Optional[str] = None + m_VCProjectOverlayIcons: Optional[bool] = None + m_VCScanLocalPackagesOnConnect: Optional[bool] = None + m_VCServer: Optional[str] = None + m_VCShowFailedCheckout: Optional[bool] = None + m_VCUserName: Optional[str] = None + m_VCWorkspace: Optional[str] = None @unitypy_define class EmptyObject(Object): - pass + pass @unitypy_define class GUIDSerializer(Object): - guidToPath: List[Tuple[GUID, str]] + guidToPath: List[Tuple[GUID, str]] @unitypy_define class GameManager(Object, ABC): - pass + pass @unitypy_define class GlobalGameManager(GameManager, ABC): - pass + pass @unitypy_define class AnimationManager(GlobalGameManager): - pass + pass @unitypy_define class AudioManager(GlobalGameManager): - Default_Speaker_Mode: int - Doppler_Factor: float - Rolloff_Scale: float - m_DSPBufferSize: int - m_Volume: float - m_AmbisonicDecoderPlugin: Optional[str] = None - m_DisableAudio: Optional[bool] = None - m_RealVoiceCount: Optional[int] = None - m_RequestedDSPBufferSize: Optional[int] = None - m_SampleRate: Optional[int] = None - m_SpatializerPlugin: Optional[str] = None - m_SpeedOfSound: Optional[float] = None - m_VirtualVoiceCount: Optional[int] = None - m_VirtualizeEffects: Optional[bool] = None + Default_Speaker_Mode: int + Doppler_Factor: float + Rolloff_Scale: float + m_DSPBufferSize: int + m_Volume: float + m_AmbisonicDecoderPlugin: Optional[str] = None + m_AudioFoundation: Optional[int] = None + m_DisableAudio: Optional[bool] = None + m_OutputChannelLayout: Optional[int] = None + m_OutputSamplingRate: Optional[int] = None + m_RealVoiceCount: Optional[int] = None + m_RequestedDSPBufferSize: Optional[int] = None + m_SampleRate: Optional[int] = None + m_SpatializerPlugin: Optional[str] = None + m_SpeedOfSound: Optional[float] = None + m_VirtualVoiceCount: Optional[int] = None + m_VirtualizeEffects: Optional[bool] = None @unitypy_define class BuildSettings(GlobalGameManager): - enableDynamicBatching: bool - hasAdvancedVersion: bool - hasPROVersion: bool - hasPublishingRights: bool - hasShadows: bool - isEducationalBuild: bool - m_Version: str - buildGUID: Optional[Union[str, GUID]] = None - buildTags: Optional[List[str]] = None - enableMultipleDisplays: Optional[bool] = None - enabledVRDevices: Optional[List[str]] = None - hasClusterRendering: Optional[bool] = None - hasLocalLightShadows: Optional[bool] = None - hasOculusPlugin: Optional[bool] = None - hasRenderTexture: Optional[bool] = None - hasSoftShadows: Optional[bool] = None - isDebugBuild: Optional[bool] = None - isEmbedded: Optional[bool] = None - isNoWatermarkBuild: Optional[bool] = None - isPrototypingBuild: Optional[bool] = None - isTrial: Optional[bool] = None - isWsaHolographicRemotingEnabled: Optional[bool] = None - levels: Optional[List[str]] = None - m_AuthToken: Optional[str] = None - m_GraphicsAPIs: Optional[List[int]] = None - preloadedPlugins: Optional[List[str]] = None - runtimeClassHashes: Optional[ - Union[List[Tuple[int, int]], List[Tuple[int, Hash128]]] - ] = None - scenes: Optional[List[str]] = None - scriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None - usesOnMouseEvents: Optional[bool] = None + hasAdvancedVersion: bool + hasPROVersion: bool + hasPublishingRights: bool + hasShadows: bool + isEducationalBuild: bool + m_Version: str + buildGUID: Optional[Union[GUID, str]] = None + buildTags: Optional[List[str]] = None + enableDynamicBatching: Optional[bool] = None + enableMultipleDisplays: Optional[bool] = None + enabledVRDevices: Optional[List[str]] = None + hasClusterRendering: Optional[bool] = None + hasLocalLightShadows: Optional[bool] = None + hasOculusPlugin: Optional[bool] = None + hasRenderTexture: Optional[bool] = None + hasSoftShadows: Optional[bool] = None + isDebugBuild: Optional[bool] = None + isEmbedded: Optional[bool] = None + isNoWatermarkBuild: Optional[bool] = None + isPrototypingBuild: Optional[bool] = None + isTrial: Optional[bool] = None + isWsaHolographicRemotingEnabled: Optional[bool] = None + levels: Optional[List[str]] = None + m_AuthToken: Optional[str] = None + m_GraphicsAPIs: Optional[List[int]] = None + preloadedPlugins: Optional[List[str]] = None + runtimeClassHashes: Optional[Union[List[Tuple[int, Hash128]], List[Tuple[int, int]]]] = None + scenes: Optional[List[str]] = None + scriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None + usesOnMouseEvents: Optional[bool] = None @unitypy_define class CloudWebServicesManager(GlobalGameManager): - pass + pass @unitypy_define class ClusterInputManager(GlobalGameManager): - m_Inputs: List[ClusterInput] + m_Inputs: List[ClusterInput] @unitypy_define class CrashReportManager(GlobalGameManager): - pass + pass @unitypy_define class DelayedCallManager(GlobalGameManager): - pass + pass @unitypy_define class GraphicsSettings(GlobalGameManager): - m_AlwaysIncludedShaders: List[PPtr[Shader]] - m_AllowEnlightenSupportForUpgradedProject: Optional[bool] = None - m_CameraRelativeLightCulling: Optional[bool] = None - m_CameraRelativeShadowCulling: Optional[bool] = None - m_CurrentRenderPipelineGlobalSettings: Optional[PPtr[Object]] = None - m_CustomRenderPipeline: Optional[PPtr[MonoBehaviour]] = None - m_DefaultRenderingLayerMask: Optional[int] = None - m_Deferred: Optional[BuiltinShaderSettings] = None - m_DeferredReflections: Optional[BuiltinShaderSettings] = None - m_DepthNormals: Optional[BuiltinShaderSettings] = None - m_LegacyDeferred: Optional[BuiltinShaderSettings] = None - m_LensFlare: Optional[BuiltinShaderSettings] = None - m_LightHalo: Optional[BuiltinShaderSettings] = None - m_LightProbeOutsideHullStrategy: Optional[int] = None - m_LightsUseCCT: Optional[bool] = None - m_LightsUseColorTemperature: Optional[bool] = None - m_LightsUseLinearIntensity: Optional[bool] = None - m_LogWhenShaderIsCompiled: Optional[bool] = None - m_MotionVectors: Optional[BuiltinShaderSettings] = None - m_PreloadShadersBatchTimeLimit: Optional[int] = None - m_PreloadedShaders: Optional[List[PPtr[ShaderVariantCollection]]] = None - m_SRPDefaultSettings: Optional[List[Tuple[str, PPtr[Object]]]] = None - m_ScreenSpaceShadows: Optional[BuiltinShaderSettings] = None - m_ShaderDefinesPerShaderCompiler: Optional[List[PlatformShaderDefines]] = None - m_ShaderSettings: Optional[PlatformShaderSettings] = None - m_ShaderSettings_Tier1: Optional[PlatformShaderSettings] = None - m_ShaderSettings_Tier2: Optional[PlatformShaderSettings] = None - m_ShaderSettings_Tier3: Optional[PlatformShaderSettings] = None - m_SpritesDefaultMaterial: Optional[PPtr[Material]] = None - m_TierSettings_Tier1: Optional[TierGraphicsSettings] = None - m_TierSettings_Tier2: Optional[TierGraphicsSettings] = None - m_TierSettings_Tier3: Optional[TierGraphicsSettings] = None - m_TransparencySortAxis: Optional[Vector3f] = None - m_TransparencySortMode: Optional[int] = None - m_VideoShadersIncludeMode: Optional[int] = None + m_AlwaysIncludedShaders: List[PPtr[Shader]] + m_AdditionalWarmupCollections: Optional[List[PPtr[GraphicsStateCollection]]] = None + m_AllowEnlightenSupportForUpgradedProject: Optional[bool] = None + m_CacheMissCollectionPath: Optional[str] = None + m_CameraRelativeLightCulling: Optional[bool] = None + m_CameraRelativeShadowCulling: Optional[bool] = None + m_CollectionStartupAction: Optional[int] = None + m_CurrentRenderPipelineGlobalSettings: Optional[PPtr[Object]] = None + m_CustomRenderPipeline: Optional[PPtr[MonoBehaviour]] = None + m_DefaultRenderingLayerMask: Optional[int] = None + m_Deferred: Optional[BuiltinShaderSettings] = None + m_DeferredReflections: Optional[BuiltinShaderSettings] = None + m_DepthNormals: Optional[BuiltinShaderSettings] = None + m_EnableCacheMissTracing: Optional[bool] = None + m_GraphicsStateCollection: Optional[PPtr[GraphicsStateCollection]] = None + m_LegacyDeferred: Optional[BuiltinShaderSettings] = None + m_LensFlare: Optional[BuiltinShaderSettings] = None + m_LightHalo: Optional[BuiltinShaderSettings] = None + m_LightProbeOutsideHullStrategy: Optional[int] = None + m_LightsUseCCT: Optional[bool] = None + m_LightsUseColorTemperature: Optional[bool] = None + m_LightsUseLinearIntensity: Optional[bool] = None + m_LogWhenShaderIsCompiled: Optional[bool] = None + m_MotionVectors: Optional[BuiltinShaderSettings] = None + m_PreloadShadersBatchTimeLimit: Optional[int] = None + m_PreloadedShaders: Optional[List[PPtr[ShaderVariantCollection]]] = None + m_SRPDefaultSettings: Optional[List[Tuple[str, PPtr[Object]]]] = None + m_ScreenSpaceShadows: Optional[BuiltinShaderSettings] = None + m_ShaderDefinesPerShaderCompiler: Optional[List[PlatformShaderDefines]] = None + m_ShaderSettings: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier1: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier2: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier3: Optional[PlatformShaderSettings] = None + m_SpritesDefaultMaterial: Optional[PPtr[Material]] = None + m_TierSettings_Tier1: Optional[TierGraphicsSettings] = None + m_TierSettings_Tier2: Optional[TierGraphicsSettings] = None + m_TierSettings_Tier3: Optional[TierGraphicsSettings] = None + m_TraceSavePath: Optional[str] = None + m_TraceSendToEditor: Optional[bool] = None + m_TransparencySortAxis: Optional[Vector3f] = None + m_TransparencySortMode: Optional[int] = None + m_VideoShadersIncludeMode: Optional[int] = None + m_WarmupAsync: Optional[bool] = None + m_WarmupProgressivelyLimit: Optional[int] = None @unitypy_define class InputManager(GlobalGameManager): - m_Axes: List[InputAxis] - m_UsePhysicalKeys: Optional[bool] = None + m_Axes: List[InputAxis] + m_UsePhysicalKeys: Optional[bool] = None @unitypy_define class MasterServerInterface(GlobalGameManager): - pass + pass @unitypy_define class MonoManager(GlobalGameManager): - m_Scripts: List[PPtr[MonoScript]] - m_AssemblyNames: Optional[List[str]] = None - m_AssemblyTypes: Optional[List[int]] = None - m_RuntimeClassHashes: Optional[List[Tuple[int, Hash128]]] = None - m_ScriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None + m_Scripts: List[PPtr[MonoScript]] + m_AssemblyNames: Optional[List[str]] = None + m_AssemblyTypes: Optional[List[int]] = None + m_RuntimeClassHashes: Optional[List[Tuple[int, Hash128]]] = None + m_ScriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None @unitypy_define class MultiplayerManager(GlobalGameManager): - m_ActiveMultiplayerRole: Optional[int] = None - m_ActiveMultiplayerRoles: Optional[int] = None + m_ActiveMultiplayerRole: Optional[int] = None + m_ActiveMultiplayerRoles: Optional[int] = None @unitypy_define class NavMeshProjectSettings(GlobalGameManager): - areas: List[NavMeshAreaData] - m_LastAgentTypeID: Optional[int] = None - m_SettingNames: Optional[List[str]] = None - m_Settings: Optional[List[NavMeshBuildSettings]] = None + areas: List[NavMeshAreaData] + m_LastAgentTypeID: Optional[int] = None + m_SettingNames: Optional[List[str]] = None + m_Settings: Optional[List[NavMeshBuildSettings]] = None @unitypy_define class NetworkManager(GlobalGameManager): - m_AssetToPrefab: List[Tuple[GUID, PPtr[GameObject]]] - m_DebugLevel: int - m_Sendrate: float + m_AssetToPrefab: List[Tuple[GUID, PPtr[GameObject]]] + m_DebugLevel: int + m_Sendrate: float @unitypy_define class NotificationManager(GlobalGameManager): - pass + pass @unitypy_define class PerformanceReportingManager(GlobalGameManager): - pass + pass @unitypy_define class Physics2DSettings(GlobalGameManager): - m_DefaultMaterial: PPtr[PhysicsMaterial2D] - m_Gravity: Vector2f - m_LayerCollisionMatrix: List[int] - m_PositionIterations: int - m_VelocityIterations: int - m_AngularSleepTolerance: Optional[float] = None - m_AutoSimulation: Optional[bool] = None - m_AutoSyncTransforms: Optional[bool] = None - m_BaumgarteScale: Optional[float] = None - m_BaumgarteTimeOfImpactScale: Optional[float] = None - m_BounceThreshold: Optional[float] = None - m_CallbacksOnDisable: Optional[bool] = None - m_ChangeStopsCallbacks: Optional[bool] = None - m_ContactThreshold: Optional[float] = None - m_DefaultContactOffset: Optional[float] = None - m_DeleteStopsCallbacks: Optional[bool] = None - m_JobOptions: Optional[PhysicsJobOptions2D] = None - m_LinearSleepTolerance: Optional[float] = None - m_MaxAngularCorrection: Optional[float] = None - m_MaxLinearCorrection: Optional[float] = None - m_MaxRotationSpeed: Optional[float] = None - m_MaxSubStepCount: Optional[int] = None - m_MaxTranslationSpeed: Optional[float] = None - m_MinPenetrationForPenalty: Optional[float] = None - m_MinSubStepFPS: Optional[float] = None - m_QueriesHitTriggers: Optional[bool] = None - m_QueriesStartInColliders: Optional[bool] = None - m_RaycastsHitTriggers: Optional[bool] = None - m_RaycastsStartInColliders: Optional[bool] = None - m_ReuseCollisionCallbacks: Optional[bool] = None - m_SimulationLayers: Optional[BitField] = None - m_SimulationMode: Optional[int] = None - m_TimeToSleep: Optional[float] = None - m_UseSubStepContacts: Optional[bool] = None - m_UseSubStepping: Optional[bool] = None - m_VelocityThreshold: Optional[float] = None + m_DefaultMaterial: PPtr[PhysicsMaterial2D] + m_Gravity: Vector2f + m_LayerCollisionMatrix: List[int] + m_PositionIterations: int + m_VelocityIterations: int + m_AngularSleepTolerance: Optional[float] = None + m_AutoSimulation: Optional[bool] = None + m_AutoSyncTransforms: Optional[bool] = None + m_BaumgarteScale: Optional[float] = None + m_BaumgarteTimeOfImpactScale: Optional[float] = None + m_BounceThreshold: Optional[float] = None + m_CallbacksOnDisable: Optional[bool] = None + m_ChangeStopsCallbacks: Optional[bool] = None + m_ContactThreshold: Optional[float] = None + m_DefaultContactOffset: Optional[float] = None + m_DeleteStopsCallbacks: Optional[bool] = None + m_JobOptions: Optional[PhysicsJobOptions2D] = None + m_LinearSleepTolerance: Optional[float] = None + m_MaxAngularCorrection: Optional[float] = None + m_MaxLinearCorrection: Optional[float] = None + m_MaxRotationSpeed: Optional[float] = None + m_MaxSubStepCount: Optional[int] = None + m_MaxTranslationSpeed: Optional[float] = None + m_MinPenetrationForPenalty: Optional[float] = None + m_MinSubStepFPS: Optional[float] = None + m_PhysicsLowLevelSettings: Optional[PPtr[Object]] = None + m_QueriesHitTriggers: Optional[bool] = None + m_QueriesStartInColliders: Optional[bool] = None + m_RaycastsHitTriggers: Optional[bool] = None + m_RaycastsStartInColliders: Optional[bool] = None + m_ReuseCollisionCallbacks: Optional[bool] = None + m_SimulationLayers: Optional[BitField] = None + m_SimulationMode: Optional[int] = None + m_TimeToSleep: Optional[float] = None + m_UseSubStepContacts: Optional[bool] = None + m_UseSubStepping: Optional[bool] = None + m_VelocityThreshold: Optional[float] = None + + +@unitypy_define +class PhysicsCoreProjectSettings2D(GlobalGameManager): + m_PhysicsCoreSettings: PPtr[Object] @unitypy_define class PhysicsManager(GlobalGameManager): - m_BounceThreshold: float - m_DefaultMaterial: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] - m_Gravity: Vector3f - m_LayerCollisionMatrix: List[int] - m_AutoSimulation: Optional[bool] = None - m_AutoSyncTransforms: Optional[bool] = None - m_BroadphaseType: Optional[int] = None - m_ClothGravity: Optional[Vector3f] = None - m_ClothInterCollisionDistance: Optional[float] = None - m_ClothInterCollisionSettingsToggle: Optional[bool] = None - m_ClothInterCollisionStiffness: Optional[float] = None - m_ContactPairsMode: Optional[int] = None - m_ContactsGeneration: Optional[int] = None - m_CurrentBackendId: Optional[int] = None - m_DefaultContactOffset: Optional[float] = None - m_DefaultMaxAngluarSpeed: Optional[float] = None - m_DefaultMaxAngularSpeed: Optional[float] = None - m_DefaultMaxDepenetrationVelocity: Optional[float] = None - m_DefaultSolverIterations: Optional[int] = None - m_DefaultSolverVelocityIterations: Optional[int] = None - m_EnableAdaptiveForce: Optional[bool] = None - m_EnableEnhancedDeterminism: Optional[bool] = None - m_EnablePCM: Optional[bool] = None - m_EnableUnifiedHeightmaps: Optional[bool] = None - m_FastMotionThreshold: Optional[float] = None - m_FrictionType: Optional[int] = None - m_ImprovedPatchFriction: Optional[bool] = None - m_InvokeCollisionCallbacks: Optional[bool] = None - m_MaxAngularVelocity: Optional[float] = None - m_MinPenetrationForPenalty: Optional[float] = None - m_QueriesHitBackfaces: Optional[bool] = None - m_QueriesHitTriggers: Optional[bool] = None - m_RaycastsHitTriggers: Optional[bool] = None - m_ReuseCollisionCallbacks: Optional[bool] = None - m_ScratchBufferChunkCount: Optional[int] = None - m_SimulationMode: Optional[int] = None - m_SleepAngularVelocity: Optional[float] = None - m_SleepThreshold: Optional[float] = None - m_SleepVelocity: Optional[float] = None - m_SolverIterationCount: Optional[int] = None - m_SolverType: Optional[int] = None - m_SolverVelocityIterations: Optional[int] = None - m_WorldBounds: Optional[AABB] = None - m_WorldSubdivisions: Optional[int] = None + m_BounceThreshold: float + m_DefaultMaterial: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Gravity: Vector3f + m_LayerCollisionMatrix: List[int] + m_AutoSimulation: Optional[bool] = None + m_AutoSyncTransforms: Optional[bool] = None + m_BroadphaseType: Optional[int] = None + m_ClothGravity: Optional[Vector3f] = None + m_ClothInterCollisionDistance: Optional[float] = None + m_ClothInterCollisionSettingsToggle: Optional[bool] = None + m_ClothInterCollisionStiffness: Optional[float] = None + m_ContactPairsMode: Optional[int] = None + m_ContactsGeneration: Optional[int] = None + m_CurrentBackendId: Optional[int] = None + m_DefaultContactOffset: Optional[float] = None + m_DefaultMaxAngluarSpeed: Optional[float] = None + m_DefaultMaxAngularSpeed: Optional[float] = None + m_DefaultMaxDepenetrationVelocity: Optional[float] = None + m_DefaultSolverIterations: Optional[int] = None + m_DefaultSolverVelocityIterations: Optional[int] = None + m_EnableAdaptiveForce: Optional[bool] = None + m_EnableEnhancedDeterminism: Optional[bool] = None + m_EnablePCM: Optional[bool] = None + m_EnableUnifiedHeightmaps: Optional[bool] = None + m_FastMotionThreshold: Optional[float] = None + m_FrictionType: Optional[int] = None + m_GenerateOnTriggerStayEvents: Optional[bool] = None + m_ImprovedPatchFriction: Optional[bool] = None + m_IncrementalStaticBroadphase: Optional[bool] = None + m_InvokeCollisionCallbacks: Optional[bool] = None + m_LogVerbosity: Optional[int] = None + m_MaxAngularVelocity: Optional[float] = None + m_MinPenetrationForPenalty: Optional[float] = None + m_QueriesHitBackfaces: Optional[bool] = None + m_QueriesHitTriggers: Optional[bool] = None + m_RaycastsHitTriggers: Optional[bool] = None + m_ReleaseSceneBuffers: Optional[bool] = None + m_ReuseCollisionCallbacks: Optional[bool] = None + m_SceneBuffersReleaseInterval: Optional[int] = None + m_ScratchBufferChunkCount: Optional[int] = None + m_SimulationMode: Optional[int] = None + m_SleepAngularVelocity: Optional[float] = None + m_SleepThreshold: Optional[float] = None + m_SleepVelocity: Optional[float] = None + m_SolverIterationCount: Optional[int] = None + m_SolverType: Optional[int] = None + m_SolverVelocityIterations: Optional[int] = None + m_ThreadingMode: Optional[int] = None + m_WorldBounds: Optional[AABB] = None + m_WorldSubdivisions: Optional[int] = None @unitypy_define class PlayerSettings(GlobalGameManager): - AndroidProfiler: bool - allowedAutorotateToLandscapeLeft: bool - allowedAutorotateToLandscapeRight: bool - allowedAutorotateToPortrait: bool - allowedAutorotateToPortraitUpsideDown: bool - companyName: str - defaultScreenHeight: int - defaultScreenHeightWeb: int - defaultScreenOrientation: int - defaultScreenWidth: int - defaultScreenWidthWeb: int - productName: str - runInBackground: bool - targetDevice: int - use32BitDisplayBuffer: bool - useMacAppStoreValidation: bool - useOSAutorotation: bool - usePlayerLog: bool - AID: Optional[Hash128] = None - AndroidEnableSustainedPerformanceMode: Optional[bool] = None - AndroidFilterTouchesWhenObscured: Optional[bool] = None - AndroidLicensePublicKey: Optional[str] = None - D3DHDRBitDepth: Optional[int] = None - Force_IOS_Speakers_When_Recording: Optional[bool] = None - Override_IPod_Music: Optional[bool] = None - Prepare_IOS_For_Recording: Optional[bool] = None - accelerometerFrequency: Optional[int] = None - activeInputHandler: Optional[int] = None - allowFullscreenSwitch: Optional[bool] = None - allowHDRDisplaySupport: Optional[bool] = None - androidApplicationEntry: Optional[int] = None - androidAutoRotationBehavior: Optional[int] = None - androidBlitType: Optional[int] = None - androidDefaultWindowHeight: Optional[int] = None - androidDefaultWindowWidth: Optional[int] = None - androidFullscreenMode: Optional[int] = None - androidMaxAspectRatio: Optional[float] = None - androidMinAspectRatio: Optional[float] = None - androidMinimumWindowHeight: Optional[int] = None - androidMinimumWindowWidth: Optional[int] = None - androidPredictiveBackSupport: Optional[bool] = None - androidRenderOutsideSafeArea: Optional[bool] = None - androidResizableWindow: Optional[bool] = None - androidResizeableActivity: Optional[bool] = None - androidShowActivityIndicatorOnLoading: Optional[int] = None - androidStartInFullscreen: Optional[bool] = None - androidSupportedAspectRatio: Optional[int] = None - androidUseSwappy: Optional[bool] = None - androidVulkanAllowFilterList: Optional[List[AndroidDeviceFilterData]] = None - androidVulkanDenyFilterList: Optional[List[AndroidDeviceFilterData]] = None - bakeCollisionMeshes: Optional[bool] = None - bundleIdentifier: Optional[str] = None - bundleVersion: Optional[str] = None - captureSingleScreen: Optional[bool] = None - cloudEnabled: Optional[bool] = None - cloudProjectId: Optional[str] = None - cpuConfiguration: Optional[List[int]] = None - cursorHotspot: Optional[Vector2f] = None - d3d11ForceExclusiveMode: Optional[bool] = None - d3d11FullscreenMode: Optional[int] = None - d3d9FullscreenMode: Optional[int] = None - debugUnloadMode: Optional[int] = None - dedicatedServerOptimizations: Optional[bool] = None - defaultCursor: Optional[PPtr[Texture2D]] = None - defaultIsFullScreen: Optional[bool] = None - defaultIsNativeResolution: Optional[bool] = None - deferSystemGesturesMode: Optional[int] = None - disableDepthAndStencilBuffers: Optional[bool] = None - disableOldInputManagerSupport: Optional[bool] = None - displayResolutionDialog: Optional[int] = None - enableFrameTimingStats: Optional[bool] = None - enableGamepadInput: Optional[bool] = None - enableHWStatistics: Optional[bool] = None - enableNativePlatformBackendsForNewInputSystem: Optional[bool] = None - enableNewInputSystem: Optional[bool] = None - enableOpenGLProfilerGPURecorders: Optional[bool] = None - forceSRGBBlit: Optional[bool] = None - forceSingleInstance: Optional[bool] = None - framebufferDepthMemorylessMode: Optional[int] = None - fullscreenMode: Optional[int] = None - gpuSkinning: Optional[bool] = None - graphicsJobMode: Optional[int] = None - graphicsJobs: Optional[bool] = None - hdrBitDepth: Optional[int] = None - hideHomeButton: Optional[bool] = None - hmiLoadingImage: Optional[PPtr[Texture2D]] = None - iPhoneBundleIdentifier: Optional[str] = None - ignoreAlphaClear: Optional[bool] = None - insecureHttpOption: Optional[int] = None - invalidatedPatternTexture: Optional[PPtr[Texture2D]] = None - iosAllowHTTPDownload: Optional[bool] = None - iosAppInBackgroundBehavior: Optional[int] = None - iosShowActivityIndicatorOnLoading: Optional[int] = None - iosUseCustomAppBackgroundBehavior: Optional[bool] = None - isWsaHolographicRemotingEnabled: Optional[bool] = None - legacyClampBlendShapeWeights: Optional[bool] = None - loadStoreDebugModeEnabled: Optional[bool] = None - m_ActiveColorSpace: Optional[int] = None - m_ColorGamuts: Optional[List[int]] = None - m_HolographicPauseOnTrackingLoss: Optional[bool] = None - m_HolographicTrackingLossScreen: Optional[PPtr[Texture2D]] = None - m_MTRendering: Optional[bool] = None - m_MobileMTRendering: Optional[bool] = None - m_MobileRenderingPath: Optional[int] = None - m_RenderingPath: Optional[int] = None - m_ShowUnitySplashLogo: Optional[bool] = None - m_ShowUnitySplashScreen: Optional[bool] = None - m_SplashScreenAnimation: Optional[int] = None - m_SplashScreenBackgroundAnimationZoom: Optional[float] = None - m_SplashScreenBackgroundColor: Optional[ColorRGBA] = None - m_SplashScreenBackgroundLandscape: Optional[PPtr[Texture2D]] = None - m_SplashScreenBackgroundLandscapeAspect: Optional[float] = None - m_SplashScreenBackgroundLandscapeUvs: Optional[Rectf] = None - m_SplashScreenBackgroundPortrait: Optional[PPtr[Texture2D]] = None - m_SplashScreenBackgroundPortraitAspect: Optional[float] = None - m_SplashScreenBackgroundPortraitUvs: Optional[Rectf] = None - m_SplashScreenDrawMode: Optional[int] = None - m_SplashScreenLogoAnimationZoom: Optional[float] = None - m_SplashScreenLogoStyle: Optional[int] = None - m_SplashScreenLogos: Optional[List[SplashScreenLogo]] = None - m_SplashScreenOverlayOpacity: Optional[float] = None - m_SplashScreenStyle: Optional[int] = None - m_SpriteBatchVertexThreshold: Optional[int] = None - m_StackTraceTypes: Optional[List[int]] = None - m_StereoRenderingPath: Optional[int] = None - m_Stereoscopic3D: Optional[bool] = None - m_SupportedAspectRatios: Optional[AspectRatios] = None - m_UnitySplashLogo: Optional[PPtr[Sprite]] = None - m_UseDX11: Optional[bool] = None - m_VirtualRealitySplashScreen: Optional[PPtr[Texture2D]] = None - macAppStoreCategory: Optional[str] = None - macFullscreenMode: Optional[int] = None - macRetinaSupport: Optional[bool] = None - meshDeformation: Optional[int] = None - metalFramebufferOnly: Optional[bool] = None - metroEnableIndependentInputSource: Optional[bool] = None - metroEnableLowLatencyPresentationAPI: Optional[bool] = None - metroInputSource: Optional[int] = None - mipStripping: Optional[bool] = None - mobileMTRenderingBaked: Optional[bool] = None - muteOtherAudioSources: Optional[bool] = None - n3dsDisableStereoscopicView: Optional[bool] = None - n3dsEnableSharedListOpt: Optional[bool] = None - n3dsEnableVSync: Optional[bool] = None - numberOfMipsStripped: Optional[int] = None - numberOfMipsStrippedPerMipmapLimitGroup: Optional[List[Tuple[str, int]]] = None - organizationId: Optional[str] = None - platformRequiresReadableAssets: Optional[bool] = None - playerDataPath: Optional[str] = None - playerMinOpenGLESVersion: Optional[int] = None - preloadedAssets: Optional[List[PPtr[Object]]] = None - preserveFramebufferAlpha: Optional[bool] = None - productGUID: Optional[GUID] = None - projectId: Optional[str] = None - projectName: Optional[str] = None - protectGraphicsMemory: Optional[bool] = None - ps3SplashScreen: Optional[PPtr[Texture2D]] = None - psp2AcquireBGM: Optional[bool] = None - psp2PowerMode: Optional[int] = None - qualitySettingsNames: Optional[List[str]] = None - resetResolutionOnWindowResize: Optional[bool] = None - resizableWindow: Optional[bool] = None - resolutionScalingMode: Optional[int] = None - singlePassStereoRendering: Optional[bool] = None - stadiaPresentMode: Optional[int] = None - stadiaTargetFramerate: Optional[int] = None - stripPhysics: Optional[bool] = None - submitAnalytics: Optional[bool] = None - switchAllowGpuScratchShrinking: Optional[bool] = None - switchGpuScratchPoolGranularity: Optional[int] = None - switchMaxWorkerMultiple: Optional[int] = None - switchNVNDefaultPoolsGranularity: Optional[int] = None - switchNVNGraphicsFirmwareMemory: Optional[int] = None - switchNVNMaxPublicSamplerIDCount: Optional[int] = None - switchNVNMaxPublicTextureIDCount: Optional[int] = None - switchNVNOtherPoolsGranularity: Optional[int] = None - switchNVNShaderPoolsGranularity: Optional[int] = None - switchQueueCommandMemory: Optional[int] = None - switchQueueComputeMemory: Optional[int] = None - switchQueueControlMemory: Optional[int] = None - targetGlesGraphics: Optional[int] = None - targetIOSGraphics: Optional[int] = None - targetPixelDensity: Optional[int] = None - targetPlatform: Optional[int] = None - targetResolution: Optional[int] = None - tizenShowActivityIndicatorOnLoading: Optional[int] = None - tvOSBundleVersion: Optional[str] = None - uiUse16BitDepthBuffer: Optional[bool] = None - unsupportedMSAAFallback: Optional[int] = None - uploadClearedTextureDataAfterCreationFromScript: Optional[bool] = None - use24BitDepthBuffer: Optional[bool] = None - useAlphaInDashboard: Optional[bool] = None - useFlipModelSwapchain: Optional[bool] = None - useHDRDisplay: Optional[bool] = None - useOnDemandResources: Optional[bool] = None - videoMemoryForVertexBuffers: Optional[int] = None - virtualRealitySupported: Optional[bool] = None - virtualTexturingSupportEnabled: Optional[bool] = None - visibleInBackground: Optional[bool] = None - visionOSBundleVersion: Optional[str] = None - vrSettings: Optional[VRSettings] = None - vulkanEnableCommandBufferRecycling: Optional[bool] = None - vulkanEnableLateAcquireNextImage: Optional[bool] = None - vulkanEnablePreTransform: Optional[bool] = None - vulkanEnableSetSRGBWrite: Optional[bool] = None - vulkanNumSwapchainBuffers: Optional[int] = None - vulkanUseSWCommandBuffers: Optional[bool] = None - wiiHio2Usage: Optional[int] = None - wiiLoadingScreenBackground: Optional[ColorRGBA] = None - wiiLoadingScreenFileName: Optional[str] = None - wiiLoadingScreenPeriod: Optional[int] = None - wiiLoadingScreenRect: Optional[Rectf] = None - wiiLoadingScreenRectPlacement: Optional[int] = None - wiiUAllowScreenCapture: Optional[bool] = None - wiiUControllerCount: Optional[int] = None - wiiUGamePadMSAA: Optional[int] = None - wiiUSupportsBalanceBoard: Optional[bool] = None - wiiUSupportsClassicController: Optional[bool] = None - wiiUSupportsMotionPlus: Optional[bool] = None - wiiUSupportsNunchuk: Optional[bool] = None - wiiUSupportsProController: Optional[bool] = None - wiiUTVResolution: Optional[int] = None - windowsGamepadBackendHint: Optional[int] = None - wsaTransparentSwapchain: Optional[bool] = None - xboxEnableAvatar: Optional[bool] = None - xboxEnableEnableRenderThreadRunsJobs: Optional[bool] = None - xboxEnableFitness: Optional[bool] = None - xboxEnableGuest: Optional[bool] = None - xboxEnableHeadOrientation: Optional[bool] = None - xboxEnableKinect: Optional[bool] = None - xboxEnableKinectAutoTracking: Optional[bool] = None - xboxEnablePIXSampling: Optional[bool] = None - xboxEnableSpeech: Optional[bool] = None - xboxOneDisableEsram: Optional[bool] = None - xboxOneDisableKinectGpuReservation: Optional[bool] = None - xboxOneEnable7thCore: Optional[bool] = None - xboxOneEnableTypeOptimization: Optional[bool] = None - xboxOneLoggingLevel: Optional[int] = None - xboxOneMonoLoggingLevel: Optional[int] = None - xboxOnePresentImmediateThreshold: Optional[int] = None - xboxOneResolution: Optional[int] = None - xboxOneSResolution: Optional[int] = None - xboxOneXResolution: Optional[int] = None - xboxPIXTextureCapture: Optional[bool] = None - xboxSkinOnGPU: Optional[bool] = None - xboxSpeechDB: Optional[int] = None + AndroidProfiler: bool + allowedAutorotateToLandscapeLeft: bool + allowedAutorotateToLandscapeRight: bool + allowedAutorotateToPortrait: bool + allowedAutorotateToPortraitUpsideDown: bool + companyName: str + defaultScreenHeight: int + defaultScreenHeightWeb: int + defaultScreenOrientation: int + defaultScreenWidth: int + defaultScreenWidthWeb: int + productName: str + runInBackground: bool + targetDevice: int + use32BitDisplayBuffer: bool + useMacAppStoreValidation: bool + useOSAutorotation: bool + usePlayerLog: bool + AID: Optional[Hash128] = None + AndroidEnableSustainedPerformanceMode: Optional[bool] = None + AndroidFilterTouchesWhenObscured: Optional[bool] = None + AndroidLicensePublicKey: Optional[str] = None + D3DHDRBitDepth: Optional[int] = None + Force_IOS_Speakers_When_Recording: Optional[bool] = None + Override_IPod_Music: Optional[bool] = None + Prepare_IOS_For_Recording: Optional[bool] = None + accelerometerFrequency: Optional[int] = None + activeInputHandler: Optional[int] = None + adjustIOSFPSUsingThermalState: Optional[bool] = None + allowFullscreenSwitch: Optional[bool] = None + allowHDRDisplaySupport: Optional[bool] = None + allowedHttpConnections: Optional[int] = None + androidApplicationEntry: Optional[int] = None + androidAutoRotationBehavior: Optional[int] = None + androidBlitType: Optional[int] = None + androidDefaultWindowHeight: Optional[int] = None + androidDefaultWindowWidth: Optional[int] = None + androidDisplayOptions: Optional[int] = None + androidFullscreenMode: Optional[int] = None + androidMaxAspectRatio: Optional[float] = None + androidMinAspectRatio: Optional[float] = None + androidMinimumWindowHeight: Optional[int] = None + androidMinimumWindowWidth: Optional[int] = None + androidPredictiveBackSupport: Optional[bool] = None + androidRenderOutsideSafeArea: Optional[bool] = None + androidRequestedVisibleInsets: Optional[int] = None + androidResizableWindow: Optional[bool] = None + androidResizeableActivity: Optional[bool] = None + androidShowActivityIndicatorOnLoading: Optional[int] = None + androidStartInFullscreen: Optional[bool] = None + androidSupportedAspectRatio: Optional[int] = None + androidSystemBarsBehavior: Optional[int] = None + androidUseSwappy: Optional[bool] = None + androidVulkanAllowFilterList: Optional[List[AndroidDeviceFilterData]] = None + androidVulkanDenyFilterList: Optional[List[AndroidDeviceFilterData]] = None + androidVulkanDeviceFilterListAsset: Optional[PPtr[VulkanDeviceFilterLists]] = None + audioSpatialExperience: Optional[int] = None + bakeCollisionMeshes: Optional[bool] = None + bundleIdentifier: Optional[str] = None + bundleVersion: Optional[str] = None + callOnDisableOnAssetBundleUnload: Optional[bool] = None + captureSingleScreen: Optional[bool] = None + cloudEnabled: Optional[bool] = None + cloudProjectId: Optional[str] = None + cpuConfiguration: Optional[List[int]] = None + cursorHotspot: Optional[Vector2f] = None + d3d11ForceExclusiveMode: Optional[bool] = None + d3d11FullscreenMode: Optional[int] = None + d3d12DeviceFilterListAsset: Optional[PPtr[D3D12DeviceFilterLists]] = None + d3d9FullscreenMode: Optional[int] = None + debugUnloadMode: Optional[int] = None + dedicatedServerOptimizations: Optional[bool] = None + defaultCursor: Optional[PPtr[Texture2D]] = None + defaultIsFullScreen: Optional[bool] = None + defaultIsNativeResolution: Optional[bool] = None + deferSystemGesturesMode: Optional[int] = None + disableDepthAndStencilBuffers: Optional[bool] = None + disableOldInputManagerSupport: Optional[bool] = None + displayResolutionDialog: Optional[int] = None + enableDirectStorage: Optional[bool] = None + enableFrameTimingStats: Optional[bool] = None + enableGamepadInput: Optional[bool] = None + enableHWStatistics: Optional[bool] = None + enableNativePlatformBackendsForNewInputSystem: Optional[bool] = None + enableNewInputSystem: Optional[bool] = None + enableOpenGLProfilerGPURecorders: Optional[bool] = None + forceSRGBBlit: Optional[bool] = None + forceSingleInstance: Optional[bool] = None + framebufferDepthMemorylessMode: Optional[int] = None + fullscreenMode: Optional[int] = None + gpuSkinning: Optional[bool] = None + graphicsJobMode: Optional[int] = None + graphicsJobs: Optional[bool] = None + hdrBitDepth: Optional[int] = None + hideHomeButton: Optional[bool] = None + hmiLoadingImage: Optional[PPtr[Texture2D]] = None + iPhoneBundleIdentifier: Optional[str] = None + ignoreAlphaClear: Optional[bool] = None + insecureHttpOption: Optional[int] = None + invalidatedPatternTexture: Optional[PPtr[Texture2D]] = None + iosAllowHTTPDownload: Optional[bool] = None + iosAppInBackgroundBehavior: Optional[int] = None + iosShowActivityIndicatorOnLoading: Optional[int] = None + iosUseCustomAppBackgroundBehavior: Optional[bool] = None + isWsaHolographicRemotingEnabled: Optional[bool] = None + legacyClampBlendShapeWeights: Optional[bool] = None + loadStoreDebugModeEnabled: Optional[bool] = None + m_ActiveColorSpace: Optional[int] = None + m_ColorGamuts: Optional[List[int]] = None + m_HolographicPauseOnTrackingLoss: Optional[bool] = None + m_HolographicTrackingLossScreen: Optional[PPtr[Texture2D]] = None + m_MTRendering: Optional[bool] = None + m_MobileMTRendering: Optional[bool] = None + m_MobileRenderingPath: Optional[int] = None + m_RenderingPath: Optional[int] = None + m_ShowUnitySplashLogo: Optional[bool] = None + m_ShowUnitySplashScreen: Optional[bool] = None + m_SplashScreenAnimation: Optional[int] = None + m_SplashScreenBackgroundAnimationZoom: Optional[float] = None + m_SplashScreenBackgroundColor: Optional[ColorRGBA] = None + m_SplashScreenBackgroundLandscape: Optional[PPtr[Texture2D]] = None + m_SplashScreenBackgroundLandscapeAspect: Optional[float] = None + m_SplashScreenBackgroundLandscapeUvs: Optional[Rectf] = None + m_SplashScreenBackgroundPortrait: Optional[PPtr[Texture2D]] = None + m_SplashScreenBackgroundPortraitAspect: Optional[float] = None + m_SplashScreenBackgroundPortraitUvs: Optional[Rectf] = None + m_SplashScreenDrawMode: Optional[int] = None + m_SplashScreenLogoAnimationZoom: Optional[float] = None + m_SplashScreenLogoStyle: Optional[int] = None + m_SplashScreenLogos: Optional[List[SplashScreenLogo]] = None + m_SplashScreenOverlayOpacity: Optional[float] = None + m_SplashScreenStyle: Optional[int] = None + m_SpriteBatchMaxVertexCount: Optional[int] = None + m_SpriteBatchVertexThreshold: Optional[int] = None + m_StackTraceTypes: Optional[List[int]] = None + m_StereoRenderingPath: Optional[int] = None + m_Stereoscopic3D: Optional[bool] = None + m_SupportedAspectRatios: Optional[AspectRatios] = None + m_UnitySplashLogo: Optional[PPtr[Sprite]] = None + m_UseDX11: Optional[bool] = None + m_VirtualRealitySplashScreen: Optional[PPtr[Texture2D]] = None + macAppStoreCategory: Optional[str] = None + macFullscreenMode: Optional[int] = None + macRetinaSupport: Optional[bool] = None + meshDeformation: Optional[int] = None + metalFramebufferOnly: Optional[bool] = None + metalUseMetalDisplayLink: Optional[bool] = None + metroEnableIndependentInputSource: Optional[bool] = None + metroEnableLowLatencyPresentationAPI: Optional[bool] = None + metroInputSource: Optional[int] = None + mipStripping: Optional[bool] = None + mobileMTRenderingBaked: Optional[bool] = None + muteOtherAudioSources: Optional[bool] = None + n3dsDisableStereoscopicView: Optional[bool] = None + n3dsEnableSharedListOpt: Optional[bool] = None + n3dsEnableVSync: Optional[bool] = None + numberOfMipsStripped: Optional[int] = None + numberOfMipsStrippedPerMipmapLimitGroup: Optional[List[Tuple[str, int]]] = None + organizationId: Optional[str] = None + platformRequiresReadableAssets: Optional[bool] = None + playerDataPath: Optional[str] = None + playerMinOpenGLESVersion: Optional[int] = None + preloadedAssets: Optional[List[PPtr[Object]]] = None + preserveFramebufferAlpha: Optional[bool] = None + productGUID: Optional[GUID] = None + projectId: Optional[str] = None + projectName: Optional[str] = None + protectGraphicsMemory: Optional[bool] = None + ps3SplashScreen: Optional[PPtr[Texture2D]] = None + psp2AcquireBGM: Optional[bool] = None + psp2PowerMode: Optional[int] = None + qualitySettingsNames: Optional[List[str]] = None + resetResolutionOnWindowResize: Optional[bool] = None + resizableWindow: Optional[bool] = None + resolutionScalingMode: Optional[int] = None + singlePassStereoRendering: Optional[bool] = None + stadiaPresentMode: Optional[int] = None + stadiaTargetFramerate: Optional[int] = None + stripPhysics: Optional[bool] = None + submitAnalytics: Optional[bool] = None + switchAllowGpuScratchShrinking: Optional[bool] = None + switchGpuScratchPoolGranularity: Optional[int] = None + switchGraphicsJobsSyncAfterKick: Optional[bool] = None + switchMaxWorkerMultiple: Optional[int] = None + switchNVNDefaultPoolsGranularity: Optional[int] = None + switchNVNGraphicsFirmwareMemory: Optional[int] = None + switchNVNMaxPublicSamplerIDCount: Optional[int] = None + switchNVNMaxPublicTextureIDCount: Optional[int] = None + switchNVNOtherPoolsGranularity: Optional[int] = None + switchNVNShaderPoolsGranularity: Optional[int] = None + switchQueueCommandMemory: Optional[int] = None + switchQueueComputeMemory: Optional[int] = None + switchQueueControlMemory: Optional[int] = None + targetGlesGraphics: Optional[int] = None + targetIOSGraphics: Optional[int] = None + targetPixelDensity: Optional[int] = None + targetPlatform: Optional[int] = None + targetResolution: Optional[int] = None + thermalStateCriticalIOSFPS: Optional[int] = None + thermalStateSeriousIOSFPS: Optional[int] = None + tizenShowActivityIndicatorOnLoading: Optional[int] = None + tvOSBundleVersion: Optional[str] = None + uiUse16BitDepthBuffer: Optional[bool] = None + unsupportedMSAAFallback: Optional[int] = None + uploadClearedTextureDataAfterCreationFromScript: Optional[bool] = None + use24BitDepthBuffer: Optional[bool] = None + useAlphaInDashboard: Optional[bool] = None + useFlipModelSwapchain: Optional[bool] = None + useHDRDisplay: Optional[bool] = None + useOnDemandResources: Optional[bool] = None + videoMemoryForVertexBuffers: Optional[int] = None + virtualRealitySupported: Optional[bool] = None + virtualTexturingSupportEnabled: Optional[bool] = None + visibleInBackground: Optional[bool] = None + visionOSBundleVersion: Optional[str] = None + vrSettings: Optional[VRSettings] = None + vulkanEnableCommandBufferRecycling: Optional[bool] = None + vulkanEnableLateAcquireNextImage: Optional[bool] = None + vulkanEnablePreTransform: Optional[bool] = None + vulkanEnableSetSRGBWrite: Optional[bool] = None + vulkanNumSwapchainBuffers: Optional[int] = None + vulkanUseSWCommandBuffers: Optional[bool] = None + webGPUDeviceFilterListAsset: Optional[PPtr[WebGPUDeviceFilterLists]] = None + webProgressiveAssetLoading: Optional[bool] = None + wiiHio2Usage: Optional[int] = None + wiiLoadingScreenBackground: Optional[ColorRGBA] = None + wiiLoadingScreenFileName: Optional[str] = None + wiiLoadingScreenPeriod: Optional[int] = None + wiiLoadingScreenRect: Optional[Rectf] = None + wiiLoadingScreenRectPlacement: Optional[int] = None + wiiUAllowScreenCapture: Optional[bool] = None + wiiUControllerCount: Optional[int] = None + wiiUGamePadMSAA: Optional[int] = None + wiiUSupportsBalanceBoard: Optional[bool] = None + wiiUSupportsClassicController: Optional[bool] = None + wiiUSupportsMotionPlus: Optional[bool] = None + wiiUSupportsNunchuk: Optional[bool] = None + wiiUSupportsProController: Optional[bool] = None + wiiUTVResolution: Optional[int] = None + windowsGamepadBackendHint: Optional[int] = None + wsaTransparentSwapchain: Optional[bool] = None + xboxEnableAvatar: Optional[bool] = None + xboxEnableEnableRenderThreadRunsJobs: Optional[bool] = None + xboxEnableFitness: Optional[bool] = None + xboxEnableGuest: Optional[bool] = None + xboxEnableHeadOrientation: Optional[bool] = None + xboxEnableKinect: Optional[bool] = None + xboxEnableKinectAutoTracking: Optional[bool] = None + xboxEnablePIXSampling: Optional[bool] = None + xboxEnableSpeech: Optional[bool] = None + xboxOneDisableEsram: Optional[bool] = None + xboxOneDisableKinectGpuReservation: Optional[bool] = None + xboxOneEnable7thCore: Optional[bool] = None + xboxOneEnableTypeOptimization: Optional[bool] = None + xboxOneLoggingLevel: Optional[int] = None + xboxOneMonoLoggingLevel: Optional[int] = None + xboxOnePresentImmediateThreshold: Optional[int] = None + xboxOneResolution: Optional[int] = None + xboxOneSResolution: Optional[int] = None + xboxOneXResolution: Optional[int] = None + xboxPIXTextureCapture: Optional[bool] = None + xboxSkinOnGPU: Optional[bool] = None + xboxSpeechDB: Optional[int] = None @unitypy_define class QualitySettings(GlobalGameManager): - Beautiful: Optional[QualitySetting] = None - Fantastic: Optional[QualitySetting] = None - Fast: Optional[QualitySetting] = None - Fastest: Optional[QualitySetting] = None - Good: Optional[QualitySetting] = None - Simple: Optional[QualitySetting] = None - m_CurrentQuality: Optional[int] = None - m_DefaultMobileQuality: Optional[int] = None - m_DefaultStandaloneQuality: Optional[int] = None - m_DefaultWebPlayerQuality: Optional[int] = None - m_EditorQuality: Optional[int] = None - m_QualitySettings: Optional[List[QualitySetting]] = None - m_StrippedMaximumLODLevel: Optional[int] = None - m_TextureMipmapLimitGroupNames: Optional[List[str]] = None + Beautiful: Optional[QualitySetting] = None + Fantastic: Optional[QualitySetting] = None + Fast: Optional[QualitySetting] = None + Fastest: Optional[QualitySetting] = None + Good: Optional[QualitySetting] = None + Simple: Optional[QualitySetting] = None + m_CurrentQuality: Optional[int] = None + m_DefaultMobileQuality: Optional[int] = None + m_DefaultStandaloneQuality: Optional[int] = None + m_DefaultWebPlayerQuality: Optional[int] = None + m_EditorQuality: Optional[int] = None + m_QualitySettings: Optional[List[QualitySetting]] = None + m_StrippedMaximumLODLevel: Optional[int] = None + m_TextureMipmapLimitGroupNames: Optional[List[str]] = None @unitypy_define class ResourceManager(GlobalGameManager): - m_Container: List[Tuple[str, PPtr[Object]]] - m_DependentAssets: Optional[List[ResourceManager_Dependency]] = None + m_Container: List[Tuple[str, PPtr[Object]]] + m_DependentAssets: Optional[List[ResourceManager_Dependency]] = None @unitypy_define class RuntimeInitializeOnLoadManager(GlobalGameManager): - m_AfterAssembliesLoadedMethodExecutionOrders: Optional[List[int]] = None - m_AfterAssembliesLoadedUnityMethodExecutionOrders: Optional[List[int]] = None - m_AfterMethodExecutionOrders: Optional[List[int]] = None - m_AfterUnityMethodExecutionOrders: Optional[List[int]] = None - m_AssemblyNames: Optional[List[str]] = None - m_BeforeMethodExecutionOrders: Optional[List[int]] = None - m_BeforeSplashScreenMethodExecutionOrders: Optional[List[int]] = None - m_BeforeSplashScreenUnityMethodExecutionOrders: Optional[List[int]] = None - m_BeforeUnityMethodExecutionOrders: Optional[List[int]] = None - m_ClassInfos: Optional[List[ClassInfo]] = None - m_ClassMethodInfos: Optional[List[ClassMethodInfo]] = None - m_MethodExecutionOrders: Optional[List[int]] = None - m_NamespaceNames: Optional[List[str]] = None - m_SubsystemRegistrationMethodExecutionOrders: Optional[List[int]] = None - m_SubsystemRegistrationUnityMethodExecutionOrders: Optional[List[int]] = None - m_UnityMethodExecutionOrders: Optional[List[int]] = None + m_AfterAssembliesLoadedMethodExecutionOrders: Optional[List[int]] = None + m_AfterAssembliesLoadedUnityMethodExecutionOrders: Optional[List[int]] = None + m_AfterMethodExecutionOrders: Optional[List[int]] = None + m_AfterUnityMethodExecutionOrders: Optional[List[int]] = None + m_AssemblyNames: Optional[List[str]] = None + m_BeforeMethodExecutionOrders: Optional[List[int]] = None + m_BeforeSplashScreenMethodExecutionOrders: Optional[List[int]] = None + m_BeforeSplashScreenUnityMethodExecutionOrders: Optional[List[int]] = None + m_BeforeUnityMethodExecutionOrders: Optional[List[int]] = None + m_ClassInfos: Optional[List[ClassInfo]] = None + m_ClassMethodInfos: Optional[List[ClassMethodInfo]] = None + m_MethodExecutionOrders: Optional[List[int]] = None + m_NamespaceNames: Optional[List[str]] = None + m_SubsystemRegistrationMethodExecutionOrders: Optional[List[int]] = None + m_SubsystemRegistrationUnityMethodExecutionOrders: Optional[List[int]] = None + m_UnityMethodExecutionOrders: Optional[List[int]] = None @unitypy_define class ShaderNameRegistry(GlobalGameManager): - m_PreloadShaders: bool - m_Shaders: NameToObjectMap + m_PreloadShaders: bool + m_Shaders: NameToObjectMap @unitypy_define class StreamingManager(GlobalGameManager): - pass + pass @unitypy_define class TagManager(GlobalGameManager): - tags: List[str] - Builtin_Layer_0: Optional[str] = None - Builtin_Layer_1: Optional[str] = None - Builtin_Layer_2: Optional[str] = None - Builtin_Layer_3: Optional[str] = None - Builtin_Layer_4: Optional[str] = None - Builtin_Layer_5: Optional[str] = None - Builtin_Layer_6: Optional[str] = None - Builtin_Layer_7: Optional[str] = None - User_Layer_10: Optional[str] = None - User_Layer_11: Optional[str] = None - User_Layer_12: Optional[str] = None - User_Layer_13: Optional[str] = None - User_Layer_14: Optional[str] = None - User_Layer_15: Optional[str] = None - User_Layer_16: Optional[str] = None - User_Layer_17: Optional[str] = None - User_Layer_18: Optional[str] = None - User_Layer_19: Optional[str] = None - User_Layer_20: Optional[str] = None - User_Layer_21: Optional[str] = None - User_Layer_22: Optional[str] = None - User_Layer_23: Optional[str] = None - User_Layer_24: Optional[str] = None - User_Layer_25: Optional[str] = None - User_Layer_26: Optional[str] = None - User_Layer_27: Optional[str] = None - User_Layer_28: Optional[str] = None - User_Layer_29: Optional[str] = None - User_Layer_30: Optional[str] = None - User_Layer_31: Optional[str] = None - User_Layer_8: Optional[str] = None - User_Layer_9: Optional[str] = None - layers: Optional[List[str]] = None - m_RenderingLayers: Optional[List[str]] = None - m_SortingLayers: Optional[List[SortingLayerEntry]] = None + tags: List[str] + Builtin_Layer_0: Optional[str] = None + Builtin_Layer_1: Optional[str] = None + Builtin_Layer_2: Optional[str] = None + Builtin_Layer_3: Optional[str] = None + Builtin_Layer_4: Optional[str] = None + Builtin_Layer_5: Optional[str] = None + Builtin_Layer_6: Optional[str] = None + Builtin_Layer_7: Optional[str] = None + User_Layer_10: Optional[str] = None + User_Layer_11: Optional[str] = None + User_Layer_12: Optional[str] = None + User_Layer_13: Optional[str] = None + User_Layer_14: Optional[str] = None + User_Layer_15: Optional[str] = None + User_Layer_16: Optional[str] = None + User_Layer_17: Optional[str] = None + User_Layer_18: Optional[str] = None + User_Layer_19: Optional[str] = None + User_Layer_20: Optional[str] = None + User_Layer_21: Optional[str] = None + User_Layer_22: Optional[str] = None + User_Layer_23: Optional[str] = None + User_Layer_24: Optional[str] = None + User_Layer_25: Optional[str] = None + User_Layer_26: Optional[str] = None + User_Layer_27: Optional[str] = None + User_Layer_28: Optional[str] = None + User_Layer_29: Optional[str] = None + User_Layer_30: Optional[str] = None + User_Layer_31: Optional[str] = None + User_Layer_8: Optional[str] = None + User_Layer_9: Optional[str] = None + layers: Optional[List[str]] = None + m_RenderingLayers: Optional[List[str]] = None + m_SortingLayers: Optional[List[SortingLayerEntry]] = None @unitypy_define class TimeManager(GlobalGameManager): - Fixed_Timestep: Union[RationalTime, float] - Maximum_Allowed_Timestep: float - m_TimeScale: float - Maximum_Particle_Timestep: Optional[float] = None + Fixed_Timestep: Union[RationalTime, float] + Maximum_Allowed_Timestep: float + m_TimeScale: float + Maximum_Particle_Timestep: Optional[float] = None @unitypy_define class UnityAdsManager(GlobalGameManager): - pass + pass @unitypy_define class UnityAnalyticsManager(GlobalGameManager): - m_Enabled: Optional[bool] = None - m_InitializeOnStartup: Optional[bool] = None - m_TestConfigUrl: Optional[str] = None - m_TestEventUrl: Optional[str] = None - m_TestMode: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_InitializeOnStartup: Optional[bool] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None + m_TestMode: Optional[bool] = None @unitypy_define class UnityConnectSettings(GlobalGameManager): - UnityAnalyticsSettings: UnityAnalyticsSettings - UnityPurchasingSettings: UnityPurchasingSettings - CrashReportingSettings: Optional[CrashReportingSettings] = None - PerformanceReportingSettings: Optional[PerformanceReportingSettings] = None - UnityAdsSettings: Optional[UnityAdsSettings] = None - m_ConfigUrl: Optional[str] = None - m_DashboardUrl: Optional[str] = None - m_Enabled: Optional[bool] = None - m_EventOldUrl: Optional[str] = None - m_EventUrl: Optional[str] = None - m_TestConfigUrl: Optional[str] = None - m_TestEventUrl: Optional[str] = None - m_TestInitMode: Optional[int] = None - m_TestMode: Optional[bool] = None + UnityAnalyticsSettings: UnityAnalyticsSettings + UnityPurchasingSettings: UnityPurchasingSettings + CrashReportingSettings: Optional[CrashReportingSettings] = None + InsightsSettings: Optional[InsightsSettings] = None + PerformanceReportingSettings: Optional[PerformanceReportingSettings] = None + UnityAdsSettings: Optional[UnityAdsSettings] = None + m_ConfigUrl: Optional[str] = None + m_DashboardUrl: Optional[str] = None + m_Enabled: Optional[bool] = None + m_EventOldUrl: Optional[str] = None + m_EventUrl: Optional[str] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None + m_TestInitMode: Optional[int] = None + m_TestMode: Optional[bool] = None @unitypy_define class VFXManager(GlobalGameManager): - m_CopyBufferShader: PPtr[ComputeShader] - m_FixedTimeStep: float - m_IndirectShader: PPtr[ComputeShader] - m_MaxDeltaTime: float - m_RenderPipeSettingsPath: str - m_SortShader: PPtr[ComputeShader] - m_BatchEmptyLifetime: Optional[int] = None - m_CompiledVersion: Optional[int] = None - m_EmptyShader: Optional[PPtr[Shader]] = None - m_MaxCapacity: Optional[int] = None - m_MaxScrubTime: Optional[float] = None - m_RuntimeResources: Optional[PPtr[MonoBehaviour]] = None - m_RuntimeVersion: Optional[int] = None - m_StripUpdateShader: Optional[PPtr[ComputeShader]] = None + m_CopyBufferShader: PPtr[ComputeShader] + m_FixedTimeStep: float + m_IndirectShader: PPtr[ComputeShader] + m_MaxDeltaTime: float + m_RenderPipeSettingsPath: str + m_SortShader: PPtr[ComputeShader] + m_BatchEmptyLifetime: Optional[int] = None + m_CompiledVersion: Optional[int] = None + m_EmptyShader: Optional[PPtr[Shader]] = None + m_MaxCapacity: Optional[int] = None + m_MaxScrubTime: Optional[float] = None + m_PrefixSumShader: Optional[PPtr[ComputeShader]] = None + m_RuntimeResources: Optional[PPtr[MonoBehaviour]] = None + m_RuntimeVersion: Optional[int] = None + m_StripUpdateShader: Optional[PPtr[ComputeShader]] = None @unitypy_define class LevelGameManager(GameManager, ABC): - pass + pass @unitypy_define class HaloManager(LevelGameManager): - pass + pass @unitypy_define class LightmapSettings(LevelGameManager): - m_Lightmaps: List[LightmapData] - m_LightmapsMode: int - m_BakedColorSpace: Optional[int] = None - m_EnlightenSceneMapping: Optional[EnlightenSceneMapping] = None - m_GISettings: Optional[GISettings] = None - m_LightProbes: Optional[PPtr[LightProbes]] = None - m_LightingSettings: Optional[PPtr[LightingSettings]] = None - m_RuntimeCPUUsage: Optional[int] = None - m_ShadowMaskMode: Optional[int] = None - m_UseDualLightmapsInForward: Optional[bool] = None - m_UseShadowmask: Optional[bool] = None + m_Lightmaps: List[LightmapData] + m_LightmapsMode: int + m_BakeOnSceneLoad: Optional[int] = None + m_BakedColorSpace: Optional[int] = None + m_EnlightenSceneMapping: Optional[EnlightenSceneMapping] = None + m_GISettings: Optional[GISettings] = None + m_LightProbes: Optional[PPtr[LightProbes]] = None + m_LightingSettings: Optional[PPtr[LightingSettings]] = None + m_RuntimeCPUUsage: Optional[int] = None + m_ShadowMaskMode: Optional[int] = None + m_UseDualLightmapsInForward: Optional[bool] = None + m_UseShadowmask: Optional[bool] = None @unitypy_define class NavMeshSettings(LevelGameManager): - m_NavMesh: Optional[PPtr[NavMesh]] = None - m_NavMeshData: Optional[PPtr[NavMeshData]] = None + m_NavMesh: Optional[PPtr[NavMesh]] = None + m_NavMeshData: Optional[PPtr[NavMeshData]] = None @unitypy_define class OcclusionCullingSettings(LevelGameManager): - m_OcclusionCullingData: PPtr[OcclusionCullingData] - m_Portals: List[PPtr[OcclusionPortal]] - m_SceneGUID: GUID - m_StaticRenderers: List[PPtr[Renderer]] + m_OcclusionCullingData: PPtr[OcclusionCullingData] + m_Portals: List[PPtr[OcclusionPortal]] + m_SceneGUID: GUID + m_StaticRenderers: List[PPtr[Renderer]] @unitypy_define class RenderSettings(LevelGameManager): - m_FlareStrength: float - m_Fog: bool - m_FogColor: ColorRGBA - m_FogDensity: float - m_FogMode: int - m_HaloStrength: float - m_HaloTexture: PPtr[Texture2D] - m_LinearFogEnd: float - m_LinearFogStart: float - m_SkyboxMaterial: PPtr[Material] - m_SpotCookie: PPtr[Texture2D] - m_AmbientEquatorColor: Optional[ColorRGBA] = None - m_AmbientGroundColor: Optional[ColorRGBA] = None - m_AmbientIntensity: Optional[float] = None - m_AmbientLight: Optional[ColorRGBA] = None - m_AmbientMode: Optional[int] = None - m_AmbientProbe: Optional[SphericalHarmonicsL2] = None - m_AmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None - m_AmbientSkyColor: Optional[ColorRGBA] = None - m_CustomReflection: Optional[Union[PPtr[Cubemap], PPtr[Texture]]] = None - m_DefaultReflectionMode: Optional[int] = None - m_DefaultReflectionResolution: Optional[int] = None - m_FlareFadeSpeed: Optional[float] = None - m_GeneratedSkyboxReflection: Optional[PPtr[Cubemap]] = None - m_IndirectSpecularColor: Optional[ColorRGBA] = None - m_ReflectionBounces: Optional[int] = None - m_ReflectionIntensity: Optional[float] = None - m_SubtractiveShadowColor: Optional[ColorRGBA] = None - m_Sun: Optional[PPtr[Light]] = None - m_UseRadianceAmbientProbe: Optional[bool] = None + m_FlareStrength: float + m_Fog: bool + m_FogColor: ColorRGBA + m_FogDensity: float + m_FogMode: int + m_HaloStrength: float + m_HaloTexture: PPtr[Texture2D] + m_LinearFogEnd: float + m_LinearFogStart: float + m_SkyboxMaterial: PPtr[Material] + m_SpotCookie: PPtr[Texture2D] + m_AmbientEquatorColor: Optional[ColorRGBA] = None + m_AmbientGroundColor: Optional[ColorRGBA] = None + m_AmbientIntensity: Optional[float] = None + m_AmbientLight: Optional[ColorRGBA] = None + m_AmbientMode: Optional[int] = None + m_AmbientProbe: Optional[SphericalHarmonicsL2] = None + m_AmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None + m_AmbientSkyColor: Optional[ColorRGBA] = None + m_CustomReflection: Optional[Union[PPtr[Cubemap], PPtr[Texture]]] = None + m_DefaultReflectionMode: Optional[int] = None + m_DefaultReflectionResolution: Optional[int] = None + m_FlareFadeSpeed: Optional[float] = None + m_GeneratedSkyboxReflection: Optional[PPtr[Cubemap]] = None + m_IndirectSpecularColor: Optional[ColorRGBA] = None + m_ReflectionBounces: Optional[int] = None + m_ReflectionIntensity: Optional[float] = None + m_SubtractiveShadowColor: Optional[ColorRGBA] = None + m_Sun: Optional[PPtr[Light]] = None + m_UseRadianceAmbientProbe: Optional[bool] = None @unitypy_define class HierarchyState(Object): - expanded: List[PPtr[Object]] - selection: List[PPtr[Object]] - scrollposition_x: Optional[float] = None - scrollposition_x: Optional[float] = None - scrollposition_y: Optional[float] = None - scrollposition_y: Optional[float] = None + expanded: List[PPtr[Object]] + selection: List[PPtr[Object]] + scrollposition_x: Optional[float] = None + scrollposition_x: Optional[float] = None + scrollposition_y: Optional[float] = None + scrollposition_y: Optional[float] = None @unitypy_define class InspectorExpandedState(Object): - m_ExpandedData: List[ExpandedData] + m_ExpandedData: List[ExpandedData] @unitypy_define class MarshallingTestObject(Object): - m_Prop: int + m_Prop: int @unitypy_define class MemorySettings(Object): - pass + pass @unitypy_define class NScreenBridge(Object): - pass + pass @unitypy_define class NativeObjectType(Object): - m_Inner: NativeType + m_Inner: NativeType @unitypy_define class PackedAssets(Object): - m_Contents: List[BuildReportPackedAssetInfo] - m_Overhead: int - m_ShortPath: str - m_File: Optional[int] = None + m_Contents: List[BuildReportPackedAssetInfo] + m_Overhead: int + m_ShortPath: str + m_File: Optional[int] = None @unitypy_define class PlatformModuleSetup(Object): - modules: List[Module] + modules: List[Module] @unitypy_define class PluginBuildInfo(Object): - m_EditorPlugins: List[str] - m_RuntimePlugins: List[str] + m_EditorPlugins: List[str] + m_RuntimePlugins: List[str] @unitypy_define class Prefab(Object): - m_RootGameObject: PPtr[GameObject] - m_ContainsMissingSerializeReferenceTypes: Optional[bool] = None - m_HideFlagsBehaviour: Optional[int] = None - m_IsExploded: Optional[bool] = None - m_IsPrefabAsset: Optional[bool] = None - m_IsPrefabParent: Optional[bool] = None - m_Modification: Optional[PrefabModification] = None - m_ParentPrefab: Optional[PPtr[Prefab]] = None - m_SourcePrefab: Optional[PPtr[Prefab]] = None + m_RootGameObject: PPtr[GameObject] + m_ContainsMissingSerializeReferenceTypes: Optional[bool] = None + m_HideFlagsBehaviour: Optional[int] = None + m_IsExploded: Optional[bool] = None + m_IsPrefabAsset: Optional[bool] = None + m_IsPrefabParent: Optional[bool] = None + m_Modification: Optional[PrefabModification] = None + m_ParentPrefab: Optional[PPtr[Prefab]] = None + m_SourcePrefab: Optional[PPtr[Prefab]] = None @unitypy_define class PrefabInstance(Object): - m_Modification: PrefabModification - m_RootGameObject: PPtr[GameObject] - m_SourcePrefab: PPtr[Prefab] + m_Modification: PrefabModification + m_RootGameObject: PPtr[GameObject] + m_SourcePrefab: PPtr[Prefab] @unitypy_define class PresetManager(Object): - m_DefaultList: Optional[List[DefaultPresetList]] = None - m_DefaultPresets: Optional[List[Tuple[PresetType, List[DefaultPreset]]]] = None + m_DefaultList: Optional[List[DefaultPresetList]] = None + m_DefaultPresets: Optional[List[Tuple[PresetType, List[DefaultPreset]]]] = None @unitypy_define class PropertyModificationsTargetTestObject(Object): - m_Array: List[PropertyModificationsTargetTestNativeObject] - m_Data: PropertyModificationsTargetTestNativeObject - m_FloatTestValue: float - byte_data: Optional[bytes] = None - m_Bytes: Optional[List[int]] = None - m_BytesSize: Optional[int] = None - m_Floats: Optional[List[float]] = None + m_Array: List[PropertyModificationsTargetTestNativeObject] + m_Data: PropertyModificationsTargetTestNativeObject + m_FloatTestValue: float + byte_data: Optional[bytes] = None + m_Bytes: Optional[List[int]] = None + m_BytesSize: Optional[int] = None + m_Floats: Optional[List[float]] = None @unitypy_define class RenderPassAttachment(Object): - pass + pass @unitypy_define class SceneRoots(Object): - m_Roots: List[PPtr[Object]] + m_Roots: List[PPtr[Object]] @unitypy_define class SceneVisibilityState(Object): - m_IsolationMode: Optional[bool] = None - m_MainStageIsolated: Optional[bool] = None - m_PrefabStageIsolated: Optional[bool] = None - m_SceneData: Optional[List[Tuple[SceneIdentifier, SceneVisibilityData]]] = None - m_ScenePickingData: Optional[SceneDataContainer] = None - m_SceneVisibilityData: Optional[SceneDataContainer] = None - m_SceneVisibilityDataIsolated: Optional[SceneDataContainer] = None + m_IsolationMode: Optional[bool] = None + m_MainStageIsolated: Optional[bool] = None + m_PrefabStageIsolated: Optional[bool] = None + m_SceneData: Optional[List[Tuple[SceneIdentifier, SceneVisibilityData]]] = None + m_ScenePickingData: Optional[SceneDataContainer] = None + m_SceneVisibilityData: Optional[SceneDataContainer] = None + m_SceneVisibilityDataIsolated: Optional[SceneDataContainer] = None @unitypy_define class ScenesUsingAssets(Object): - m_ListOfScenesUsingEachAsset: List[Tuple[str, List[str]]] - m_ScenesUsingAssets: List[BuildReportScenesUsingAsset] + m_ListOfScenesUsingEachAsset: List[Tuple[str, List[str]]] + m_ScenesUsingAssets: List[BuildReportScenesUsingAsset] @unitypy_define class SerializableManagedHost(Object): - m_Script: PPtr[MonoScript] + m_Script: PPtr[MonoScript] @unitypy_define class SerializableManagedRefTestClass(Object): - m_Script: PPtr[MonoScript] + m_Script: PPtr[MonoScript] @unitypy_define class ShaderContainer(Object): - pass + pass + + +@unitypy_define +class ShaderIncludeReflection(Object): + m_Functions: List[ReflectedFunction] + m_ReflectionLog: ErrorLog @unitypy_define class SiblingDerived(Object): - pass + pass @unitypy_define class SpriteAtlasDatabase(Object): - pass + pass @unitypy_define class TestObjectVectorPairStringBool(Object): - m_Map: List[Tuple[str, bool]] - m_String: str + m_Map: List[Tuple[str, bool]] + m_String: str @unitypy_define class TestObjectWithSerializedAnimationCurve(Object): - m_Curve: AnimationCurve + m_Curve: AnimationCurve @unitypy_define class TestObjectWithSerializedArray(Object): - m_ClampTestValue: float - m_IntegerArray: List[int] + m_ClampTestValue: float + m_IntegerArray: List[int] @unitypy_define class TestObjectWithSerializedMapStringBool(Object): - m_Map: List[Tuple[str, bool]] - m_String: str + m_Map: List[Tuple[str, bool]] + m_String: str @unitypy_define class TestObjectWithSerializedMapStringNonAlignedStruct(Object): - m_Map: List[Tuple[str, NonAlignedStruct]] - m_String: str + m_Map: List[Tuple[str, NonAlignedStruct]] + m_String: str @unitypy_define class TestObjectWithSpecialLayoutOne(Object): - differentLayout: LayoutDataOne - sameLayout: LayoutDataOne + differentLayout: LayoutDataOne + sameLayout: LayoutDataOne @unitypy_define class TestObjectWithSpecialLayoutTwo(Object): - differentLayout: LayoutDataTwo - sameLayout: LayoutDataThree + differentLayout: LayoutDataTwo + sameLayout: LayoutDataThree @unitypy_define class TilemapEditorUserSettings(Object): - m_FocusMode: int - m_LastUsedPalette: PPtr[GameObject] + m_FocusMode: int + m_LastUsedPalette: PPtr[GameObject] + + +@unitypy_define +class UIAnimationBinder(Object): + pass @unitypy_define class VersionControlSettings(Object): - m_Mode: str - m_CollabEditorSettings: Optional[CollabEditorSettings] = None - m_TrackPackagesOutsideProject: Optional[bool] = None + m_Mode: str + m_CollabEditorSettings: Optional[CollabEditorSettings] = None + m_TrackPackagesOutsideProject: Optional[bool] = None @unitypy_define class VideoBuildInfo(Object): - m_IsVideoModuleDisabled: bool - m_VideoClipCount: int + m_IsVideoModuleDisabled: bool + m_VideoClipCount: int @unitypy_define class AABB: - m_Center: Vector3f - m_Extent: Vector3f + m_Center: Vector3f + m_Extent: Vector3f @unitypy_define class AddedComponent: - addedObject: PPtr[Component] - insertIndex: int - targetCorrespondingSourceObject: PPtr[GameObject] + addedObject: PPtr[Component] + insertIndex: int + targetCorrespondingSourceObject: PPtr[GameObject] @unitypy_define class AddedGameObject: - addedObject: PPtr[Transform] - insertIndex: int - targetCorrespondingSourceObject: PPtr[Transform] + addedObject: PPtr[Transform] + insertIndex: int + targetCorrespondingSourceObject: PPtr[Transform] @unitypy_define class AndroidDeviceFilterData: - androidOsVersionString: str - brandName: str - deviceName: str - driverVersionString: str - productName: str - vendorName: str - vulkanApiVersionString: str + androidOsVersionString: str + brandName: str + deviceName: str + driverVersionString: str + productName: str + vendorName: str + vulkanApiVersionString: str @unitypy_define class AnimationClipBindingConstant: - genericBindings: List[GenericBinding] - pptrCurveMapping: List[PPtr[Object]] + genericBindings: List[GenericBinding] + pptrCurveMapping: List[PPtr[Object]] @unitypy_define class AnimationClipOverride: - m_OriginalClip: PPtr[AnimationClip] - m_OverrideClip: PPtr[AnimationClip] + m_OriginalClip: PPtr[AnimationClip] + m_OverrideClip: PPtr[AnimationClip] @unitypy_define class AnimationCurve: - m_Curve: List[Keyframe] - m_PostInfinity: int - m_PreInfinity: int - m_RotationOrder: Optional[int] = None + m_Curve: List[Keyframe] + m_PostInfinity: int + m_PreInfinity: int + m_RotationOrder: Optional[int] = None @unitypy_define class AnimationEvent: - data: str - floatParameter: float - functionName: str - intParameter: int - messageOptions: int - objectReferenceParameter: PPtr[Object] - time: float + data: str + floatParameter: float + functionName: str + intParameter: int + messageOptions: int + objectReferenceParameter: PPtr[Object] + time: float @unitypy_define class AnimatorCondition: - m_ConditionEvent: str - m_ConditionMode: int - m_EventTreshold: float + m_ConditionEvent: str + m_ConditionMode: int + m_EventTreshold: float @unitypy_define class Annotation: - m_ClassID: int - m_Flags: int - m_GizmoEnabled: bool - m_IconEnabled: bool - m_ScriptClass: str + m_ClassID: int + m_Flags: int + m_GizmoEnabled: bool + m_IconEnabled: bool + m_ScriptClass: str @unitypy_define class ArticulationDrive: - damping: float - forceLimit: float - lowerLimit: float - stiffness: float - target: float - targetVelocity: float - upperLimit: float - driveType: Optional[int] = None + damping: float + forceLimit: float + lowerLimit: float + stiffness: float + target: float + targetVelocity: float + upperLimit: float + driveType: Optional[int] = None @unitypy_define class AspectRatios: - Others: bool - x16_10: bool - x16_9: bool - x4_3: bool - x5_4: bool + Others: bool + x16_10: bool + x16_9: bool + x4_3: bool + x5_4: bool @unitypy_define class AssemblyJsonAsset(TextAsset): - m_Name: str - m_Script: str - m_PathName: Optional[str] = None + m_Name: str + m_Script: str + m_PathName: Optional[str] = None @unitypy_define class AssemblyJsonImporter(AssetImporter): - m_AssetBundleName: str - m_AssetBundleVariant: str - m_Name: str - m_UserData: str - m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None @unitypy_define class Asset: - children: List[GUID] - labels: AssetLabels - mainRepresentation: LibraryRepresentation - parent: GUID - representations: List[LibraryRepresentation] - type: int - assetBundleIndex: Optional[int] = None - digest: Optional[MdFour] = None - guidOfPathLocationDependencies: Optional[ - Union[List[Tuple[str, GUID]], List[Tuple[GUID, str]]] - ] = None - hash: Optional[Union[Hash128, MdFour]] = None - hashOfImportedAssetDependencies: Optional[List[GUID]] = None - hashOfSourceAssetDependencies: Optional[List[GUID]] = None - importerClassId: Optional[int] = None - importerVersionHash: Optional[int] = None - metaModificationDate_0_: Optional[int] = None - metaModificationDate_1_: Optional[int] = None - modificationDate_0_: Optional[int] = None - modificationDate_1_: Optional[int] = None - scriptedImporterClassID: Optional[str] = None + children: List[GUID] + labels: AssetLabels + mainRepresentation: LibraryRepresentation + parent: GUID + representations: List[LibraryRepresentation] + type: int + assetBundleIndex: Optional[int] = None + digest: Optional[MdFour] = None + guidOfPathLocationDependencies: Optional[Union[List[Tuple[GUID, str]], List[Tuple[str, GUID]]]] = None + hash: Optional[Union[Hash128, MdFour]] = None + hashOfImportedAssetDependencies: Optional[List[GUID]] = None + hashOfSourceAssetDependencies: Optional[List[GUID]] = None + importerClassId: Optional[int] = None + importerVersionHash: Optional[int] = None + metaModificationDate_0_: Optional[int] = None + metaModificationDate_1_: Optional[int] = None + modificationDate_0_: Optional[int] = None + modificationDate_1_: Optional[int] = None + scriptedImporterClassID: Optional[str] = None @unitypy_define class AssetBundleFullName: - m_AssetBundleName: str - m_AssetBundleVariant: str + m_AssetBundleName: str + m_AssetBundleVariant: str @unitypy_define class AssetBundleInfo: - AssetBundleDependencies: List[int] - AssetBundleHash: Hash128 + AssetBundleDependencies: List[int] + AssetBundleHash: Hash128 @unitypy_define class AssetBundleScriptInfo: - assemblyName: str - className: str - hash: int - nameSpace: str + assemblyName: str + className: str + hash: int + nameSpace: str @unitypy_define class AssetDatabase(Object): - m_Assets: List[Tuple[GUID, Asset]] - m_AssetBundleNames: Optional[List[Tuple[int, AssetBundleFullName]]] = None - m_AssetTimeStamps: Optional[List[Tuple[str, AssetTimeStamp]]] = None - m_Metrics: Optional[AssetDatabaseMetrics] = None - m_UnityShadersVersion: Optional[int] = None - m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None + m_Assets: List[Tuple[GUID, Asset]] + m_AssetBundleNames: Optional[List[Tuple[int, AssetBundleFullName]]] = None + m_AssetTimeStamps: Optional[List[Tuple[str, AssetTimeStamp]]] = None + m_Metrics: Optional[AssetDatabaseMetrics] = None + m_UnityShadersVersion: Optional[int] = None + m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None @unitypy_define class AssetDatabaseMetrics: - totalAssetCount: int - nonProAssetCount: Optional[int] = None - nonProAssetsCreatedAfterProLicense: Optional[int] = None + totalAssetCount: int + nonProAssetCount: Optional[int] = None + nonProAssetsCreatedAfterProLicense: Optional[int] = None @unitypy_define class AssetImporterHashKey: - ScriptClass: str - type: int + ScriptClass: str + type: int @unitypy_define class AssetImporterLog(NamedObject): - m_Logs: List[AssetImporter_ImportError] - m_Name: str + m_Logs: List[AssetImporter_ImportError] + m_Name: str @unitypy_define class AssetImporter_ImportError: - error: str - file: str - line: int - mode: int - object: PPtr[Object] + error: str + file: str + line: int + mode: int + object: PPtr[Object] @unitypy_define class AssetInfo: - asset: PPtr[Object] - preloadIndex: int - preloadSize: int + asset: PPtr[Object] + preloadIndex: int + preloadSize: int @unitypy_define class AssetLabels: - m_Labels: List[str] + m_Labels: List[str] + + +@unitypy_define +class AssetStats: + objectCount: int + resourceCount: int + size: int + sourceAssetGUID: GUID + sourceAssetPath: str @unitypy_define class AssetTimeStamp: - metaModificationDate_0_: int - metaModificationDate_1_: int - modificationDate_0_: int - modificationDate_1_: int + metaModificationDate_0_: int + metaModificationDate_1_: int + modificationDate_0_: int + modificationDate_1_: int @unitypy_define class AttachmentIndexArray: - activeAttachments: int - attachments: List[int] + activeAttachments: int + attachments: List[int] @unitypy_define class AttachmentInfo: - format: int - needsResolve: bool + format: int + needsResolve: bool + canMultiview: Optional[bool] = None + loadAction: Optional[int] = None + sampleCount: Optional[int] = None + storeAction: Optional[int] = None @unitypy_define class AudioImporterOutput: - editorOutputContainerFormat: int - editorOutputSettings: SampleSettings - outputContainerFormat: int - outputSettings: SampleSettings - playerResource: Optional[StreamedResource] = None + editorOutputContainerFormat: int + editorOutputSettings: SampleSettings + outputContainerFormat: int + outputSettings: SampleSettings + playerResource: Optional[StreamedResource] = None @unitypy_define class AudioMixerConstant: - effectGUIDs: List[GUID] - effects: List[EffectConstant] - exposedParameterIndices: List[int] - exposedParameterNames: List[int] - groupGUIDs: List[GUID] - groupNameBuffer: List[str] - groups: List[GroupConstant] - numSideChainBuffers: int - pluginEffectNameBuffer: List[str] - snapshotGUIDs: List[GUID] - snapshotNameBuffer: List[str] - snapshots: List[SnapshotConstant] - groupConnections: Optional[List[GroupConnection]] = None + effectGUIDs: List[GUID] + effects: List[EffectConstant] + exposedParameterIndices: List[int] + exposedParameterNames: List[int] + groupGUIDs: List[GUID] + groupNameBuffer: List[int] + groups: List[GroupConstant] + numSideChainBuffers: int + pluginEffectNameBuffer: List[int] + snapshotGUIDs: List[GUID] + snapshotNameBuffer: List[int] + snapshots: List[SnapshotConstant] + groupConnections: Optional[List[GroupConnection]] = None @unitypy_define class AudioMixerLiveUpdateBool(ABC): - pass + pass @unitypy_define class AudioMixerLiveUpdateFloat(ABC): - pass + pass @unitypy_define class AutoOffMeshLinkData: - m_Area: int - m_End: Vector3f - m_LinkDirection: int - m_LinkType: int - m_Radius: float - m_Start: Vector3f + m_Area: int + m_End: Vector3f + m_LinkDirection: int + m_LinkType: int + m_Radius: float + m_Start: Vector3f @unitypy_define class AvatarBodyMask(NamedObject): - m_Mask: List[int] - m_Name: str + m_Mask: List[int] + m_Name: str @unitypy_define class AvatarConstant: - m_Human: OffsetPtr - m_HumanSkeletonIndexArray: List[int] - m_RootMotionBoneIndex: int - m_RootMotionBoneX: xform - m_AvatarSkeleton: Optional[OffsetPtr] = None - m_AvatarSkeletonPose: Optional[OffsetPtr] = None - m_DefaultPose: Optional[OffsetPtr] = None - m_HumanSkeletonReverseIndexArray: Optional[List[int]] = None - m_RootMotionSkeleton: Optional[OffsetPtr] = None - m_RootMotionSkeletonIndexArray: Optional[List[int]] = None - m_RootMotionSkeletonPose: Optional[OffsetPtr] = None - m_Skeleton: Optional[OffsetPtr] = None - m_SkeletonNameIDArray: Optional[List[int]] = None - m_SkeletonPose: Optional[OffsetPtr] = None + m_Human: OffsetPtr + m_HumanSkeletonIndexArray: List[int] + m_RootMotionBoneIndex: int + m_RootMotionBoneX: xform + m_AvatarSkeleton: Optional[OffsetPtr] = None + m_AvatarSkeletonPose: Optional[OffsetPtr] = None + m_DefaultPose: Optional[OffsetPtr] = None + m_HumanSkeletonReverseIndexArray: Optional[List[int]] = None + m_RootMotionSkeleton: Optional[OffsetPtr] = None + m_RootMotionSkeletonIndexArray: Optional[List[int]] = None + m_RootMotionSkeletonPose: Optional[OffsetPtr] = None + m_Skeleton: Optional[OffsetPtr] = None + m_SkeletonNameIDArray: Optional[List[int]] = None + m_SkeletonPose: Optional[OffsetPtr] = None @unitypy_define class AvatarSkeletonMaskElement: - path: str - weight: float + path: str + weight: float @unitypy_define class Axes: - m_Length: float - m_Limit: Limit - m_PostQ: float4 - m_PreQ: float4 - m_Sgn: Union[float3, float4] - m_Type: int + m_Length: float + m_Limit: Limit + m_PostQ: float4 + m_PreQ: float4 + m_Sgn: Union[float3, float4] + m_Type: int + + +@unitypy_define +class Binding: + m_Slot: int + m_EncodedData: Optional[int] = None + m_Set: Optional[int] = None @unitypy_define class BitField: - m_Bits: int + m_Bits: int @unitypy_define class Blend1dDataConstant: - m_ChildThresholdArray: List[float] + m_ChildThresholdArray: List[float] @unitypy_define class Blend2dDataConstant: - m_ChildMagnitudeArray: Optional[List[float]] = None - m_ChildNeighborListArray: Optional[List[MotionNeighborList]] = None - m_ChildPairAvgMagInvArray: Optional[List[float]] = None - m_ChildPairVectorArray: Optional[List[Vector2f]] = None - m_ChildPositionArray: Optional[List[Vector2f]] = None - m_ChildThresholdArray: Optional[List[float]] = None + m_ChildMagnitudeArray: Optional[List[float]] = None + m_ChildNeighborListArray: Optional[List[MotionNeighborList]] = None + m_ChildPairAvgMagInvArray: Optional[List[float]] = None + m_ChildPairVectorArray: Optional[List[Vector2f]] = None + m_ChildPositionArray: Optional[List[Vector2f]] = None + m_ChildThresholdArray: Optional[List[float]] = None @unitypy_define class BlendDirectDataConstant: - m_ChildBlendEventIDArray: List[int] - m_NormalizedBlendValues: bool + m_ChildBlendEventIDArray: List[int] + m_NormalizedBlendValues: bool @unitypy_define class BlendShapeData: - channels: List[MeshBlendShapeChannel] - fullWeights: List[float] - shapes: List[MeshBlendShape] - vertices: List[BlendShapeVertex] + channels: List[MeshBlendShapeChannel] + fullWeights: List[float] + shapes: List[MeshBlendShape] + vertices: List[BlendShapeVertex] @unitypy_define class BlendShapeVertex: - index: int - normal: Vector3f - tangent: Vector3f - vertex: Vector3f + index: int + normal: Vector3f + tangent: Vector3f + vertex: Vector3f @unitypy_define class BlendTreeConstant: - m_NodeArray: List[OffsetPtr] - m_BlendEventArrayConstant: Optional[OffsetPtr] = None + m_NodeArray: List[OffsetPtr] + m_BlendEventArrayConstant: Optional[OffsetPtr] = None @unitypy_define class BlendTreeNodeConstant: - m_BlendEventID: int - m_ChildIndices: List[int] - m_ClipID: int - m_Duration: float - m_Blend1dData: Optional[OffsetPtr] = None - m_Blend2dData: Optional[OffsetPtr] = None - m_BlendDirectData: Optional[OffsetPtr] = None - m_BlendEventYID: Optional[int] = None - m_BlendType: Optional[int] = None - m_ChildThresholdArray: Optional[List[float]] = None - m_ClipIndex: Optional[int] = None - m_CycleOffset: Optional[float] = None - m_Mirror: Optional[bool] = None + m_BlendEventID: int + m_ChildIndices: List[int] + m_ClipID: int + m_Duration: float + m_Blend1dData: Optional[OffsetPtr] = None + m_Blend2dData: Optional[OffsetPtr] = None + m_BlendDirectData: Optional[OffsetPtr] = None + m_BlendEventYID: Optional[int] = None + m_BlendType: Optional[int] = None + m_ChildThresholdArray: Optional[List[float]] = None + m_ClipIndex: Optional[int] = None + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None @unitypy_define class BoneInfluence: - boneIndex_0_: int - boneIndex_1_: int - boneIndex_2_: int - boneIndex_3_: int - weight_0_: float - weight_1_: float - weight_2_: float - weight_3_: float + boneIndex_0_: int + boneIndex_1_: int + boneIndex_2_: int + boneIndex_3_: int + weight_0_: float + weight_1_: float + weight_2_: float + weight_3_: float @unitypy_define class BoneWeights4: - boneIndex_0_: int - boneIndex_1_: int - boneIndex_2_: int - boneIndex_3_: int - weight_0_: float - weight_1_: float - weight_2_: float - weight_3_: float + boneIndex_0_: int + boneIndex_1_: int + boneIndex_2_: int + boneIndex_3_: int + weight_0_: float + weight_1_: float + weight_2_: float + weight_3_: float @unitypy_define class BranchWindLevel: - m_afBend_0: float - m_afBend_1: float - m_afBend_10: float - m_afBend_11: float - m_afBend_12: float - m_afBend_13: float - m_afBend_14: float - m_afBend_15: float - m_afBend_16: float - m_afBend_17: float - m_afBend_18: float - m_afBend_19: float - m_afBend_2: float - m_afBend_3: float - m_afBend_4: float - m_afBend_5: float - m_afBend_6: float - m_afBend_7: float - m_afBend_8: float - m_afBend_9: float - m_afFlexibility_0: float - m_afFlexibility_1: float - m_afFlexibility_10: float - m_afFlexibility_11: float - m_afFlexibility_12: float - m_afFlexibility_13: float - m_afFlexibility_14: float - m_afFlexibility_15: float - m_afFlexibility_16: float - m_afFlexibility_17: float - m_afFlexibility_18: float - m_afFlexibility_19: float - m_afFlexibility_2: float - m_afFlexibility_3: float - m_afFlexibility_4: float - m_afFlexibility_5: float - m_afFlexibility_6: float - m_afFlexibility_7: float - m_afFlexibility_8: float - m_afFlexibility_9: float - m_afOscillation_0: float - m_afOscillation_1: float - m_afOscillation_10: float - m_afOscillation_11: float - m_afOscillation_12: float - m_afOscillation_13: float - m_afOscillation_14: float - m_afOscillation_15: float - m_afOscillation_16: float - m_afOscillation_17: float - m_afOscillation_18: float - m_afOscillation_19: float - m_afOscillation_2: float - m_afOscillation_3: float - m_afOscillation_4: float - m_afOscillation_5: float - m_afOscillation_6: float - m_afOscillation_7: float - m_afOscillation_8: float - m_afOscillation_9: float - m_afSpeed_0: float - m_afSpeed_1: float - m_afSpeed_10: float - m_afSpeed_11: float - m_afSpeed_12: float - m_afSpeed_13: float - m_afSpeed_14: float - m_afSpeed_15: float - m_afSpeed_16: float - m_afSpeed_17: float - m_afSpeed_18: float - m_afSpeed_19: float - m_afSpeed_2: float - m_afSpeed_3: float - m_afSpeed_4: float - m_afSpeed_5: float - m_afSpeed_6: float - m_afSpeed_7: float - m_afSpeed_8: float - m_afSpeed_9: float - m_afTurbulence_0: float - m_afTurbulence_1: float - m_afTurbulence_10: float - m_afTurbulence_11: float - m_afTurbulence_12: float - m_afTurbulence_13: float - m_afTurbulence_14: float - m_afTurbulence_15: float - m_afTurbulence_16: float - m_afTurbulence_17: float - m_afTurbulence_18: float - m_afTurbulence_19: float - m_afTurbulence_2: float - m_afTurbulence_3: float - m_afTurbulence_4: float - m_afTurbulence_5: float - m_afTurbulence_6: float - m_afTurbulence_7: float - m_afTurbulence_8: float - m_afTurbulence_9: float - m_fIndependence: float + m_afBend_0: float + m_afBend_1: float + m_afBend_10: float + m_afBend_11: float + m_afBend_12: float + m_afBend_13: float + m_afBend_14: float + m_afBend_15: float + m_afBend_16: float + m_afBend_17: float + m_afBend_18: float + m_afBend_19: float + m_afBend_2: float + m_afBend_3: float + m_afBend_4: float + m_afBend_5: float + m_afBend_6: float + m_afBend_7: float + m_afBend_8: float + m_afBend_9: float + m_afFlexibility_0: float + m_afFlexibility_1: float + m_afFlexibility_10: float + m_afFlexibility_11: float + m_afFlexibility_12: float + m_afFlexibility_13: float + m_afFlexibility_14: float + m_afFlexibility_15: float + m_afFlexibility_16: float + m_afFlexibility_17: float + m_afFlexibility_18: float + m_afFlexibility_19: float + m_afFlexibility_2: float + m_afFlexibility_3: float + m_afFlexibility_4: float + m_afFlexibility_5: float + m_afFlexibility_6: float + m_afFlexibility_7: float + m_afFlexibility_8: float + m_afFlexibility_9: float + m_afOscillation_0: float + m_afOscillation_1: float + m_afOscillation_10: float + m_afOscillation_11: float + m_afOscillation_12: float + m_afOscillation_13: float + m_afOscillation_14: float + m_afOscillation_15: float + m_afOscillation_16: float + m_afOscillation_17: float + m_afOscillation_18: float + m_afOscillation_19: float + m_afOscillation_2: float + m_afOscillation_3: float + m_afOscillation_4: float + m_afOscillation_5: float + m_afOscillation_6: float + m_afOscillation_7: float + m_afOscillation_8: float + m_afOscillation_9: float + m_afSpeed_0: float + m_afSpeed_1: float + m_afSpeed_10: float + m_afSpeed_11: float + m_afSpeed_12: float + m_afSpeed_13: float + m_afSpeed_14: float + m_afSpeed_15: float + m_afSpeed_16: float + m_afSpeed_17: float + m_afSpeed_18: float + m_afSpeed_19: float + m_afSpeed_2: float + m_afSpeed_3: float + m_afSpeed_4: float + m_afSpeed_5: float + m_afSpeed_6: float + m_afSpeed_7: float + m_afSpeed_8: float + m_afSpeed_9: float + m_afTurbulence_0: float + m_afTurbulence_1: float + m_afTurbulence_10: float + m_afTurbulence_11: float + m_afTurbulence_12: float + m_afTurbulence_13: float + m_afTurbulence_14: float + m_afTurbulence_15: float + m_afTurbulence_16: float + m_afTurbulence_17: float + m_afTurbulence_18: float + m_afTurbulence_19: float + m_afTurbulence_2: float + m_afTurbulence_3: float + m_afTurbulence_4: float + m_afTurbulence_5: float + m_afTurbulence_6: float + m_afTurbulence_7: float + m_afTurbulence_8: float + m_afTurbulence_9: float + m_fIndependence: float @unitypy_define class BufferBinding: - m_Index: int - m_NameIndex: int - m_ArraySize: Optional[int] = None + m_Index: int + m_NameIndex: int + m_ArraySize: Optional[int] = None + + +@unitypy_define +class BufferBindingParameter: + m_ArraySize: int + m_NameIndex: int + m_Binding: Optional[Binding] = None + m_Index: Optional[int] = None + m_ResourceType: Optional[int] = None @unitypy_define class BuildReportFile: - id: int - path: str - role: str - totalSize: int + id: int + path: str + role: str + totalSize: int + flags: Optional[int] = None @unitypy_define class BuildReportPackedAssetInfo: - classID: int - fileID: int - packedSize: int - sourceAssetGUID: GUID - buildTimeAssetPath: Optional[str] = None - offset: Optional[int] = None + classID: int + fileID: int + packedSize: int + sourceAssetGUID: GUID + buildTimeAssetPath: Optional[str] = None + offset: Optional[int] = None @unitypy_define class BuildReportScenesUsingAsset: - assetPath: str - scenePaths: List[str] + assetPath: str + scenePaths: List[str] @unitypy_define class BuildStepInfo: - messages: List[BuildStepMessage] - stepName: str - depth: Optional[int] = None - duration: Optional[int] = None - durationTicks: Optional[int] = None + messages: List[BuildStepMessage] + stepName: str + depth: Optional[int] = None + duration: Optional[int] = None + durationTicks: Optional[int] = None @unitypy_define class BuildStepMessage: - content: str - type: int + content: str + type: int @unitypy_define class BuildSummary: - assetBundleOptions: int - crc: int - options: int - outputPath: str - platformName: str - totalErrors: int - totalSize: int - totalWarnings: int - buildGUID: Optional[GUID] = None - buildResult: Optional[int] = None - buildStartTime: Optional[DateTime] = None - buildType: Optional[int] = None - multiProcessEnabled: Optional[bool] = None - name: Optional[str] = None - platformGroupName: Optional[str] = None - subtarget: Optional[int] = None - success: Optional[bool] = None - totalTimeMS: Optional[int] = None - totalTimeTicks: Optional[int] = None + assetBundleOptions: int + crc: int + options: int + outputPath: str + platformName: str + totalErrors: int + totalSize: int + totalWarnings: int + buildContentOptions: Optional[int] = None + buildGUID: Optional[GUID] = None + buildManifestHash: Optional[Hash128] = None + buildName: Optional[str] = None + buildProfileGuid: Optional[GUID] = None + buildProfilePath: Optional[str] = None + buildResult: Optional[int] = None + buildSessionGUID: Optional[GUID] = None + buildStartTime: Optional[DateTime] = None + buildType: Optional[int] = None + dataPath: Optional[str] = None + multiProcessEnabled: Optional[bool] = None + name: Optional[str] = None + platformGroupName: Optional[str] = None + subtarget: Optional[int] = None + success: Optional[bool] = None + totalTimeMS: Optional[int] = None + totalTimeTicks: Optional[int] = None @unitypy_define class BuildTargetSettings: - m_BuildTarget: str - m_TextureFormat: int - m_AllowsAlphaSplitting: Optional[bool] = None - m_CompressionQuality: Optional[int] = None - m_LoadingBehavior: Optional[int] = None - m_MaxTextureSize: Optional[int] = None - m_TextureHeight: Optional[int] = None - m_TextureWidth: Optional[int] = None + m_BuildTarget: str + m_TextureFormat: int + m_AllowsAlphaSplitting: Optional[bool] = None + m_CompressionQuality: Optional[int] = None + m_LoadingBehavior: Optional[int] = None + m_MaxTextureSize: Optional[int] = None + m_TextureHeight: Optional[int] = None + m_TextureWidth: Optional[int] = None @unitypy_define class BuildTextureStackReference: - groupName: str - itemName: str + groupName: str + itemName: str @unitypy_define class BuiltAssetBundleInfo: - bundleArchiveFile: int - bundleName: str - packagedFileIndices: List[int] + bundleArchiveFile: int + bundleName: str + packagedFileIndices: List[int] @unitypy_define class BuiltinShaderSettings: - m_Mode: int - m_Shader: PPtr[Shader] + m_Mode: int + m_Shader: PPtr[Shader] @unitypy_define class CGProgram(TextAsset): - m_Name: str - m_Script: str - m_PathName: Optional[str] = None + m_Name: str + m_Script: str + m_PathName: Optional[str] = None @unitypy_define class CachedAssetMetaData: - guid: GUID - originalChangeset: int - originalDigest: Union[Hash128, MdFour] - originalName: str - originalParent: GUID - pathName: str + guid: GUID + originalChangeset: int + originalDigest: Union[Hash128, MdFour] + originalName: str + originalParent: GUID + pathName: str @unitypy_define class Channel: - attributeName: str - byteOffset: int - curve: AnimationCurve + attributeName: str + byteOffset: int + curve: AnimationCurve @unitypy_define class ChannelInfo: - dimension: int - format: int - offset: int - stream: int + dimension: int + format: int + offset: int + stream: int @unitypy_define class CharacterInfo: - index: int - uv: Rectf - vert: Rectf - advance: Optional[float] = None - flipped: Optional[bool] = None - width: Optional[float] = None + index: int + uv: Rectf + vert: Rectf + advance: Optional[float] = None + flipped: Optional[bool] = None + width: Optional[float] = None @unitypy_define class Child: - m_IsAnim: bool - m_Motion: PPtr[Motion] - m_Threshold: float - m_TimeScale: float - m_CycleOffset: Optional[float] = None - m_Mirror: Optional[bool] = None - m_Position: Optional[Vector2f] = None + m_IsAnim: bool + m_Motion: PPtr[Motion] + m_Threshold: float + m_TimeScale: float + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None + m_Position: Optional[Vector2f] = None @unitypy_define class ChildAnimatorState: - m_Position: Vector3f - m_State: PPtr[AnimatorState] + m_Position: Vector3f + m_State: PPtr[AnimatorState] @unitypy_define class ChildAnimatorStateMachine: - m_Position: Vector3f - m_StateMachine: PPtr[AnimatorStateMachine] + m_Position: Vector3f + m_StateMachine: PPtr[AnimatorStateMachine] @unitypy_define class ChildMotion: - m_CycleOffset: float - m_DirectBlendParameter: str - m_Mirror: bool - m_Motion: PPtr[Motion] - m_Position: Vector2f - m_Threshold: float - m_TimeScale: float + m_CycleOffset: float + m_DirectBlendParameter: str + m_Mirror: bool + m_Motion: PPtr[Motion] + m_Position: Vector2f + m_Threshold: float + m_TimeScale: float @unitypy_define class ClampVelocityModule: - dampen: float - enabled: bool - magnitude: MinMaxCurve - separateAxis: bool - x: MinMaxCurve - y: MinMaxCurve - z: MinMaxCurve - drag: Optional[MinMaxCurve] = None - inWorldSpace: Optional[bool] = None - multiplyDragByParticleSize: Optional[bool] = None - multiplyDragByParticleVelocity: Optional[bool] = None + dampen: float + enabled: bool + magnitude: MinMaxCurve + separateAxis: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve + drag: Optional[MinMaxCurve] = None + inWorldSpace: Optional[bool] = None + multiplyDragByParticleSize: Optional[bool] = None + multiplyDragByParticleVelocity: Optional[bool] = None @unitypy_define class ClassInfo: - m_AssemblyNameIndex: int - m_ClassName: str - m_IsUnityClass: bool - m_MethodIndex: int - m_NamespaceIndex: int - m_NumOfMethods: int - m_NamespaceName: Optional[str] = None + m_AssemblyNameIndex: int + m_ClassName: str + m_IsUnityClass: bool + m_MethodIndex: int + m_NamespaceIndex: int + m_NumOfMethods: int + m_NamespaceName: Optional[str] = None @unitypy_define class ClassMethodInfo: - m_ClassIndex: int - m_MethodName: str - m_OrderNumber: int + m_ClassIndex: int + m_MethodName: str + m_OrderNumber: int @unitypy_define class Clip: - m_DenseClip: DenseClip - m_StreamedClip: StreamedClip - m_Binding: Optional[OffsetPtr] = None - m_ConstantClip: Optional[ConstantClip] = None + m_DenseClip: DenseClip + m_StreamedClip: StreamedClip + m_Binding: Optional[OffsetPtr] = None + m_ConstantClip: Optional[ConstantClip] = None @unitypy_define class ClipAnimationInfo: - firstFrame: Union[int, float] - lastFrame: Union[int, float] - loop: bool - name: str - wrapMode: int - additiveReferencePoseFrame: Optional[float] = None - bodyMask: Optional[List[int]] = None - curves: Optional[List[ClipAnimationInfoCurve]] = None - cycleOffset: Optional[float] = None - events: Optional[List[AnimationEvent]] = None - hasAdditiveReferencePose: Optional[bool] = None - heightFromFeet: Optional[bool] = None - internalID: Optional[int] = None - keepAdditionalBonesAnimation: Optional[bool] = None - keepOriginalOrientation: Optional[bool] = None - keepOriginalPositionXZ: Optional[bool] = None - keepOriginalPositionY: Optional[bool] = None - level: Optional[float] = None - loopBlend: Optional[bool] = None - loopBlendOrientation: Optional[bool] = None - loopBlendPositionXZ: Optional[bool] = None - loopBlendPositionY: Optional[bool] = None - loopTime: Optional[bool] = None - maskSource: Optional[PPtr[AvatarMask]] = None - maskType: Optional[int] = None - mirror: Optional[bool] = None - orientationOffsetY: Optional[float] = None - skeletonMaskElements: Optional[List[AvatarSkeletonMaskElement]] = None - takeName: Optional[str] = None - transformMask: Optional[List[TransformMaskElement]] = None + firstFrame: Union[float, int] + lastFrame: Union[float, int] + loop: bool + name: str + wrapMode: int + additiveReferencePoseFrame: Optional[float] = None + bodyMask: Optional[List[int]] = None + curves: Optional[List[ClipAnimationInfoCurve]] = None + cycleOffset: Optional[float] = None + events: Optional[List[AnimationEvent]] = None + hasAdditiveReferencePose: Optional[bool] = None + heightFromFeet: Optional[bool] = None + internalID: Optional[int] = None + keepAdditionalBonesAnimation: Optional[bool] = None + keepOriginalOrientation: Optional[bool] = None + keepOriginalPositionXZ: Optional[bool] = None + keepOriginalPositionY: Optional[bool] = None + level: Optional[float] = None + loopBlend: Optional[bool] = None + loopBlendOrientation: Optional[bool] = None + loopBlendPositionXZ: Optional[bool] = None + loopBlendPositionY: Optional[bool] = None + loopTime: Optional[bool] = None + maskSource: Optional[PPtr[AvatarMask]] = None + maskType: Optional[int] = None + mirror: Optional[bool] = None + orientationOffsetY: Optional[float] = None + skeletonMaskElements: Optional[List[AvatarSkeletonMaskElement]] = None + takeName: Optional[str] = None + transformMask: Optional[List[TransformMaskElement]] = None @unitypy_define class ClipAnimationInfoCurve: - curve: AnimationCurve - name: str + curve: AnimationCurve + name: str @unitypy_define class ClipMuscleConstant: - m_AverageAngularSpeed: float - m_AverageSpeed: Union[float3, float4] - m_Clip: OffsetPtr - m_CycleOffset: float - m_DeltaPose: HumanPose - m_HeightFromFeet: bool - m_IndexArray: List[int] - m_KeepOriginalOrientation: bool - m_KeepOriginalPositionXZ: bool - m_KeepOriginalPositionY: bool - m_LeftFootStartX: xform - m_Level: float - m_LoopBlend: bool - m_LoopBlendOrientation: bool - m_LoopBlendPositionXZ: bool - m_LoopBlendPositionY: bool - m_Mirror: bool - m_OrientationOffsetY: float - m_RightFootStartX: xform - m_StartTime: float - m_StartX: xform - m_StopTime: float - m_ValueArrayDelta: List[ValueDelta] - m_AdditionalCurveIndexArray: Optional[List[int]] = None - m_LoopTime: Optional[bool] = None - m_MotionStartX: Optional[xform] = None - m_MotionStopX: Optional[xform] = None - m_StartAtOrigin: Optional[bool] = None - m_StopX: Optional[xform] = None - m_ValueArrayReferencePose: Optional[List[float]] = None + m_AverageAngularSpeed: float + m_AverageSpeed: Union[float3, float4] + m_Clip: OffsetPtr + m_CycleOffset: float + m_DeltaPose: HumanPose + m_HeightFromFeet: bool + m_IndexArray: List[int] + m_KeepOriginalOrientation: bool + m_KeepOriginalPositionXZ: bool + m_KeepOriginalPositionY: bool + m_LeftFootStartX: xform + m_Level: float + m_LoopBlend: bool + m_LoopBlendOrientation: bool + m_LoopBlendPositionXZ: bool + m_LoopBlendPositionY: bool + m_Mirror: bool + m_OrientationOffsetY: float + m_RightFootStartX: xform + m_StartTime: float + m_StartX: xform + m_StopTime: float + m_ValueArrayDelta: List[ValueDelta] + m_AdditionalCurveIndexArray: Optional[List[int]] = None + m_LoopTime: Optional[bool] = None + m_MotionStartX: Optional[xform] = None + m_MotionStopX: Optional[xform] = None + m_StartAtOrigin: Optional[bool] = None + m_StopX: Optional[xform] = None + m_ValueArrayReferencePose: Optional[List[float]] = None @unitypy_define class ClothAttachment: - m_Collider: PPtr[Collider] - m_Tearable: bool - m_TwoWayInteraction: bool + m_Collider: PPtr[Collider] + m_Tearable: bool + m_TwoWayInteraction: bool @unitypy_define class ClothConstrainCoefficients: - collisionSphereDistance: float - maxDistance: float - collisionSphereRadius: Optional[float] = None - maxDistanceBias: Optional[float] = None + collisionSphereDistance: float + maxDistance: float + collisionSphereRadius: Optional[float] = None + maxDistanceBias: Optional[float] = None @unitypy_define class ClothSphereColliderPair: - first: PPtr[SphereCollider] - second: PPtr[SphereCollider] + first: PPtr[SphereCollider] + second: PPtr[SphereCollider] @unitypy_define class ClusterInput: - m_DeviceName: str - m_Index: int - m_Name: str - m_ServerUrl: str - m_Type: int + m_DeviceName: str + m_Index: int + m_Name: str + m_ServerUrl: str + m_Type: int @unitypy_define class CollabEditorSettings: - inProgressEnabled: bool + inProgressEnabled: bool @unitypy_define class Collision(ABC): - pass + pass @unitypy_define class Collision2D(ABC): - pass + pass @unitypy_define class CollisionModule: - enabled: bool - minKillSpeed: float - type: int - bounce: Optional[float] = None - colliderForce: Optional[float] = None - collidesWith: Optional[BitField] = None - collidesWithDynamic: Optional[bool] = None - collisionMessages: Optional[bool] = None - collisionMode: Optional[int] = None - dampen: Optional[float] = None - energyLossOnCollision: Optional[float] = None - interiorCollisions: Optional[bool] = None - m_Bounce: Optional[MinMaxCurve] = None - m_Dampen: Optional[MinMaxCurve] = None - m_EnergyLossOnCollision: Optional[MinMaxCurve] = None - m_Planes: Optional[List[PPtr[Transform]]] = None - maxCollisionShapes: Optional[int] = None - maxKillSpeed: Optional[float] = None - multiplyColliderForceByCollisionAngle: Optional[bool] = None - multiplyColliderForceByParticleSize: Optional[bool] = None - multiplyColliderForceByParticleSpeed: Optional[bool] = None - particleRadius: Optional[float] = None - plane0: Optional[PPtr[Transform]] = None - plane1: Optional[PPtr[Transform]] = None - plane2: Optional[PPtr[Transform]] = None - plane3: Optional[PPtr[Transform]] = None - plane4: Optional[PPtr[Transform]] = None - plane5: Optional[PPtr[Transform]] = None - quality: Optional[int] = None - radiusScale: Optional[float] = None - voxelSize: Optional[float] = None + enabled: bool + minKillSpeed: float + type: int + bounce: Optional[float] = None + colliderForce: Optional[float] = None + collidesWith: Optional[BitField] = None + collidesWithDynamic: Optional[bool] = None + collisionMessages: Optional[bool] = None + collisionMode: Optional[int] = None + dampen: Optional[float] = None + energyLossOnCollision: Optional[float] = None + interiorCollisions: Optional[bool] = None + m_Bounce: Optional[MinMaxCurve] = None + m_Dampen: Optional[MinMaxCurve] = None + m_EnergyLossOnCollision: Optional[MinMaxCurve] = None + m_Planes: Optional[List[PPtr[Transform]]] = None + maxCollisionShapes: Optional[int] = None + maxKillSpeed: Optional[float] = None + multiplyColliderForceByCollisionAngle: Optional[bool] = None + multiplyColliderForceByParticleSize: Optional[bool] = None + multiplyColliderForceByParticleSpeed: Optional[bool] = None + particleRadius: Optional[float] = None + plane0: Optional[PPtr[Transform]] = None + plane1: Optional[PPtr[Transform]] = None + plane2: Optional[PPtr[Transform]] = None + plane3: Optional[PPtr[Transform]] = None + plane4: Optional[PPtr[Transform]] = None + plane5: Optional[PPtr[Transform]] = None + quality: Optional[int] = None + radiusScale: Optional[float] = None + voxelSize: Optional[float] = None @unitypy_define class ColorBySpeedModule: - enabled: bool - gradient: MinMaxGradient - range: Vector2f + enabled: bool + gradient: MinMaxGradient + range: Vector2f @unitypy_define class ColorModule: - enabled: bool - gradient: MinMaxGradient + enabled: bool + gradient: MinMaxGradient @unitypy_define class ComponentPair: - component: PPtr[Component] + component: PPtr[Component] @unitypy_define class CompressedAnimationCurve: - m_Path: str - m_PostInfinity: int - m_PreInfinity: int - m_Slopes: PackedBitVector - m_Times: PackedBitVector - m_Values: PackedBitVector + m_Path: str + m_PostInfinity: int + m_PreInfinity: int + m_Slopes: PackedBitVector + m_Times: PackedBitVector + m_Values: PackedBitVector @unitypy_define class CompressedMesh: - m_BoneIndices: PackedBitVector - m_NormalSigns: PackedBitVector - m_Normals: PackedBitVector - m_TangentSigns: PackedBitVector - m_Tangents: PackedBitVector - m_Triangles: PackedBitVector - m_UV: PackedBitVector - m_Vertices: PackedBitVector - m_Weights: PackedBitVector - m_BindPoses: Optional[PackedBitVector] = None - m_Colors: Optional[PackedBitVector] = None - m_FloatColors: Optional[PackedBitVector] = None - m_UVInfo: Optional[int] = None + m_BoneIndices: PackedBitVector + m_NormalSigns: PackedBitVector + m_Normals: PackedBitVector + m_TangentSigns: PackedBitVector + m_Tangents: PackedBitVector + m_Triangles: PackedBitVector + m_UV: PackedBitVector + m_Vertices: PackedBitVector + m_Weights: PackedBitVector + m_BindPoses: Optional[PackedBitVector] = None + m_Colors: Optional[PackedBitVector] = None + m_FloatColors: Optional[PackedBitVector] = None + m_UVInfo: Optional[int] = None @unitypy_define class ComputeBufferCounter: - bindpoint: int - offset: int + bindpoint: int + offset: int @unitypy_define class ComputeShaderBuiltinSampler: - bindPoint: int - sampler: int + bindPoint: int + sampler: int @unitypy_define class ComputeShaderCB: - byteSize: int - name: Union[FastPropertyName, str] - params: List[ComputeShaderParam] + byteSize: int + name: Union[FastPropertyName, str] + params: List[ComputeShaderParam] @unitypy_define class ComputeShaderKernel: - builtinSamplers: List[ComputeShaderBuiltinSampler] - cbs: List[ComputeShaderResource] - code: List[int] - inBuffers: List[ComputeShaderResource] - outBuffers: List[ComputeShaderResource] - textures: List[ComputeShaderResource] - cbVariantIndices: Optional[List[int]] = None - name: Optional[Union[FastPropertyName, str]] = None - requirements: Optional[int] = None - threadGroupSize: Optional[List[int]] = None + builtinSamplers: Union[List[ComputeShaderBuiltinSampler], List[SamplerParameter]] + cbs: List[ComputeShaderResource] + code: List[int] + inBuffers: List[ComputeShaderResource] + outBuffers: List[ComputeShaderResource] + textures: List[ComputeShaderResource] + cbVariantIndices: Optional[List[int]] = None + name: Optional[Union[FastPropertyName, str]] = None + requirements: Optional[int] = None + threadGroupSize: Optional[List[int]] = None @unitypy_define class ComputeShaderKernelParent: - name: str - dynamicKeywords: Optional[List[str]] = None - globalKeywords: Optional[List[str]] = None - localKeywords: Optional[List[str]] = None - uniqueVariants: Optional[List[ComputeShaderKernel]] = None - validKeywords: Optional[List[str]] = None - variantIndices: Optional[List[Tuple[str, int]]] = None - variantMap: Optional[List[Tuple[str, ComputeShaderKernel]]] = None + name: str + dynamicKeywords: Optional[List[str]] = None + globalKeywords: Optional[List[str]] = None + localKeywords: Optional[List[str]] = None + uniqueVariants: Optional[List[ComputeShaderKernel]] = None + validKeywords: Optional[List[str]] = None + variantIndices: Optional[List[Tuple[str, int]]] = None + variantMap: Optional[List[Tuple[str, ComputeShaderKernel]]] = None @unitypy_define class ComputeShaderParam: - arraySize: int - colCount: int - name: Union[FastPropertyName, str] - offset: int - rowCount: int - type: int + arraySize: int + colCount: int + name: Union[FastPropertyName, str] + offset: int + rowCount: int + type: int @unitypy_define class ComputeShaderPlatformVariant: - constantBuffers: List[ComputeShaderCB] - kernels: List[ComputeShaderKernelParent] - resourcesResolved: bool - targetLevel: int - targetRenderer: int + constantBuffers: List[ComputeShaderCB] + kernels: List[ComputeShaderKernelParent] + resourcesResolved: bool + targetLevel: int + targetRenderer: int @unitypy_define class ComputeShaderResource: - bindPoint: int - name: Union[FastPropertyName, str] - counter: Optional[ComputeBufferCounter] = None - generatedName: Optional[Union[FastPropertyName, str]] = None - samplerBindPoint: Optional[int] = None - secondaryBindPoint: Optional[int] = None - texDimension: Optional[int] = None + name: Union[FastPropertyName, str] + bindPoint: Optional[int] = None + counter: Optional[ComputeBufferCounter] = None + generatedName: Optional[Union[FastPropertyName, str]] = None + m_Binding: Optional[Binding] = None + m_SamplerBinding: Optional[Binding] = None + resType: Optional[int] = None + samplerBindPoint: Optional[int] = None + secondaryBindPoint: Optional[int] = None + texDimension: Optional[int] = None @unitypy_define class ComputeShaderVariant: - constantBuffers: List[ComputeShaderCB] - kernels: List[ComputeShaderKernel] - targetLevel: int - targetRenderer: int - resourcesResolved: Optional[bool] = None + constantBuffers: List[ComputeShaderCB] + kernels: List[ComputeShaderKernel] + targetLevel: int + targetRenderer: int + resourcesResolved: Optional[bool] = None @unitypy_define class Condition: - m_ConditionEvent: str - m_ConditionMode: int - m_EventTreshold: float - m_ExitTime: float + m_ConditionEvent: str + m_ConditionMode: int + m_EventTreshold: float + m_ExitTime: float @unitypy_define class ConditionConstant: - m_ConditionMode: int - m_EventID: int - m_EventThreshold: float - m_ExitTime: float + m_ConditionMode: int + m_EventID: int + m_EventThreshold: float + m_ExitTime: float @unitypy_define class ConfigSetting: - flags: int - value: str + flags: int + value: str @unitypy_define class ConstantBuffer: - m_MatrixParams: List[MatrixParameter] - m_NameIndex: int - m_Size: int - m_VectorParams: List[VectorParameter] - m_IsPartialCB: Optional[bool] = None - m_StructParams: Optional[List[StructParameter]] = None + m_MatrixParams: List[MatrixParameter] + m_NameIndex: int + m_Size: int + m_VectorParams: List[VectorParameter] + m_IsPartialCB: Optional[bool] = None + m_StructParams: Optional[List[StructParameter]] = None + + +@unitypy_define +class ConstantBufferParameter: + m_IsPartialCB: bool + m_MatrixParams: List[MatrixParameter] + m_NameIndex: int + m_Size: int + m_StructParams: List[StructParameter] + m_VectorParams: List[VectorParameter] @unitypy_define class ConstantClip: - data: List[float] + data: List[float] @unitypy_define class ConstraintSource: - sourceTransform: PPtr[Transform] - weight: float + sourceTransform: PPtr[Transform] + weight: float @unitypy_define class ControllerConstant: - m_DefaultValues: OffsetPtr - m_StateMachineArray: List[OffsetPtr] - m_Values: OffsetPtr - m_HumanLayerArray: Optional[List[OffsetPtr]] = None - m_LayerArray: Optional[List[OffsetPtr]] = None + m_DefaultValues: OffsetPtr + m_StateMachineArray: List[OffsetPtr] + m_Values: OffsetPtr + m_HumanLayerArray: Optional[List[OffsetPtr]] = None + m_LayerArray: Optional[List[OffsetPtr]] = None @unitypy_define class CrashReportingSettings: - m_Enabled: bool - m_EventUrl: str - m_LogBufferSize: Optional[int] = None - m_NativeEventUrl: Optional[str] = None + m_EventUrl: str + m_EnableCloudDiagnosticsReporting: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_LogBufferSize: Optional[int] = None + m_NativeEventUrl: Optional[str] = None @unitypy_define class CustomDataModule: - color0: MinMaxGradient - color1: MinMaxGradient - enabled: bool - mode0: int - mode1: int - vector0_0: MinMaxCurve - vector0_1: MinMaxCurve - vector0_2: MinMaxCurve - vector0_3: MinMaxCurve - vector1_0: MinMaxCurve - vector1_1: MinMaxCurve - vector1_2: MinMaxCurve - vector1_3: MinMaxCurve - vectorComponentCount0: int - vectorComponentCount1: int + color0: MinMaxGradient + color1: MinMaxGradient + enabled: bool + mode0: int + mode1: int + vector0_0: MinMaxCurve + vector0_1: MinMaxCurve + vector0_2: MinMaxCurve + vector0_3: MinMaxCurve + vector1_0: MinMaxCurve + vector1_1: MinMaxCurve + vector1_2: MinMaxCurve + vector1_3: MinMaxCurve + vectorComponentCount0: int + vectorComponentCount1: int + + +@unitypy_define +class D3D12DeviceFilterData: + deviceName: str + deviceType: int + driverVersion: str + driverVersionComparator: int + featureLevel: str + featureLevelComparator: int + graphicsMemory: str + graphicsMemoryComparator: int + processorCount: str + processorCountComparator: int + vendorName: str + + +@unitypy_define +class D3D12GraphicsJobsDeviceFilterData: + filter: D3D12DeviceFilterData + preferredMode: int @unitypy_define class DataTemplate(NamedObject): - m_Father: PPtr[DataTemplate] - m_IsDataTemplate: bool - m_LastMergeIdentifier: GUID - m_Name: str - m_Objects: List[PPtr[EditorExtension]] + m_Father: PPtr[DataTemplate] + m_IsDataTemplate: bool + m_LastMergeIdentifier: GUID + m_Name: str + m_Objects: List[PPtr[EditorExtension]] @unitypy_define class DateTime: - ticks: int + ticks: int @unitypy_define class DefaultPreset: - m_Preset: PPtr[Preset] - m_Disabled: Optional[bool] = None - m_Filter: Optional[str] = None + m_Preset: PPtr[Preset] + m_Disabled: Optional[bool] = None + m_Filter: Optional[str] = None @unitypy_define class DefaultPresetList: - defaultPresets: List[DefaultPreset] - type: PresetType + defaultPresets: List[DefaultPreset] + type: PresetType @unitypy_define class DeletedItem: - changeset: int - digest: Union[Hash128, MdFour] - fullPath: str - guid: GUID - parent: GUID - type: int + changeset: int + digest: Union[Hash128, MdFour] + fullPath: str + guid: GUID + parent: GUID + type: int @unitypy_define class DenseClip: - m_BeginTime: float - m_CurveCount: int - m_FrameCount: int - m_SampleArray: List[float] - m_SampleRate: float + m_BeginTime: float + m_CurveCount: int + m_FrameCount: int + m_SampleArray: List[float] + m_SampleRate: float @unitypy_define class DetailDatabase: - WavingGrassTint: ColorRGBA - m_DetailPrototypes: List[DetailPrototype] - m_PatchCount: int - m_PatchSamples: int - m_Patches: List[DetailPatch] - m_PreloadTextureAtlasData: List[PPtr[Texture2D]] - m_TreeInstances: List[TreeInstance] - m_TreePrototypes: List[TreePrototype] - m_WavingGrassAmount: float - m_WavingGrassSpeed: float - m_WavingGrassStrength: float - m_DefaultShaders_0_: Optional[PPtr[Shader]] = None - m_DefaultShaders_1_: Optional[PPtr[Shader]] = None - m_DefaultShaders_2_: Optional[PPtr[Shader]] = None - m_DetailBillboardShader: Optional[PPtr[Shader]] = None - m_DetailMeshGrassShader: Optional[PPtr[Shader]] = None - m_DetailMeshLitShader: Optional[PPtr[Shader]] = None - m_DetailScatterMode: Optional[int] = None - m_RandomRotations: Optional[List[Vector3f]] = None + WavingGrassTint: ColorRGBA + m_DetailPrototypes: List[DetailPrototype] + m_PatchCount: int + m_PatchSamples: int + m_Patches: List[DetailPatch] + m_PreloadTextureAtlasData: List[PPtr[Texture2D]] + m_TreeInstances: List[TreeInstance] + m_TreePrototypes: List[TreePrototype] + m_WavingGrassAmount: float + m_WavingGrassSpeed: float + m_WavingGrassStrength: float + m_DefaultShaders_0_: Optional[PPtr[Shader]] = None + m_DefaultShaders_1_: Optional[PPtr[Shader]] = None + m_DefaultShaders_2_: Optional[PPtr[Shader]] = None + m_DetailBillboardShader: Optional[PPtr[Shader]] = None + m_DetailMeshGrassShader: Optional[PPtr[Shader]] = None + m_DetailMeshLitShader: Optional[PPtr[Shader]] = None + m_DetailScatterMode: Optional[int] = None + m_RandomRotations: Optional[List[Vector3f]] = None @unitypy_define class DetailPatch: - layerIndices: List[int] - bounds: Optional[AABB] = None - coverage: Optional[List[int]] = None - numberOfObjects: Optional[List[int]] = None + layerIndices: List[int] + bounds: Optional[AABB] = None + coverage: Optional[List[int]] = None + numberOfObjects: Optional[List[int]] = None @unitypy_define class DetailPrototype: - dryColor: ColorRGBA - healthyColor: ColorRGBA - maxHeight: float - maxWidth: float - minHeight: float - minWidth: float - noiseSpread: float - prototype: PPtr[GameObject] - prototypeTexture: PPtr[Texture2D] - renderMode: int - usePrototypeMesh: int - alignToGround: Optional[float] = None - bendFactor: Optional[float] = None - density: Optional[float] = None - holeTestRadius: Optional[float] = None - lightmapFactor: Optional[float] = None - noiseSeed: Optional[int] = None - positionJitter: Optional[float] = None - positionOrderliness: Optional[float] = None - targetCoverage: Optional[float] = None - useDensityScaling: Optional[int] = None - useInstancing: Optional[int] = None + dryColor: ColorRGBA + healthyColor: ColorRGBA + maxHeight: float + maxWidth: float + minHeight: float + minWidth: float + noiseSpread: float + prototype: PPtr[GameObject] + prototypeTexture: PPtr[Texture2D] + renderMode: int + usePrototypeMesh: int + alignToGround: Optional[float] = None + bendFactor: Optional[float] = None + density: Optional[float] = None + holeTestRadius: Optional[float] = None + lightmapFactor: Optional[float] = None + noiseSeed: Optional[int] = None + positionJitter: Optional[float] = None + positionOrderliness: Optional[float] = None + targetCoverage: Optional[float] = None + useDensityScaling: Optional[int] = None + useInstancing: Optional[int] = None @unitypy_define class DeviceNone: - pass + pass @unitypy_define class DirectorGenericBinding: - key: PPtr[Object] - value: PPtr[Object] + key: PPtr[Object] + value: PPtr[Object] @unitypy_define class DirectorPlayer(Behaviour): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] @unitypy_define class EffectConstant: - bypass: bool - groupConstantIndex: int - parameterIndices: List[int] - prevEffectIndex: int - sendTargetEffectIndex: int - type: int - wetMixLevelIndex: int + bypass: bool + groupConstantIndex: int + parameterIndices: List[int] + prevEffectIndex: int + sendTargetEffectIndex: int + type: int + wetMixLevelIndex: int @unitypy_define class EmbeddedNativeType: - m_FloatArray: List[float] - m_String: str + m_FloatArray: List[float] + m_String: str @unitypy_define class EmissionModule: - enabled: bool - m_BurstCount: int - cnt0: Optional[int] = None - cnt1: Optional[int] = None - cnt2: Optional[int] = None - cnt3: Optional[int] = None - cntmax0: Optional[int] = None - cntmax1: Optional[int] = None - cntmax2: Optional[int] = None - cntmax3: Optional[int] = None - m_Bursts: Optional[List[ParticleSystemEmissionBurst]] = None - m_Type: Optional[int] = None - rate: Optional[MinMaxCurve] = None - rateOverDistance: Optional[MinMaxCurve] = None - rateOverTime: Optional[MinMaxCurve] = None - time0: Optional[float] = None - time1: Optional[float] = None - time2: Optional[float] = None - time3: Optional[float] = None + enabled: bool + m_BurstCount: int + cnt0: Optional[int] = None + cnt1: Optional[int] = None + cnt2: Optional[int] = None + cnt3: Optional[int] = None + cntmax0: Optional[int] = None + cntmax1: Optional[int] = None + cntmax2: Optional[int] = None + cntmax3: Optional[int] = None + m_Bursts: Optional[List[ParticleSystemEmissionBurst]] = None + m_Type: Optional[int] = None + rate: Optional[MinMaxCurve] = None + rateOverDistance: Optional[MinMaxCurve] = None + rateOverTime: Optional[MinMaxCurve] = None + time0: Optional[float] = None + time1: Optional[float] = None + time2: Optional[float] = None + time3: Optional[float] = None + + +@unitypy_define +class EnlightenCAHMap: + m_Map: List[Tuple[LookupKey, Hash128]] @unitypy_define class EnlightenRendererInformation: - dynamicLightmapSTInSystem: Vector4f - instanceHash: Hash128 - renderer: PPtr[Object] - systemId: int + dynamicLightmapSTInSystem: Vector4f + instanceHash: Hash128 + renderer: PPtr[Object] + systemId: int @unitypy_define class EnlightenSceneMapping: - m_Renderers: List[EnlightenRendererInformation] - m_SystemAtlases: List[EnlightenSystemAtlasInformation] - m_Systems: List[EnlightenSystemInformation] - m_TerrainChunks: List[EnlightenTerrainChunksInformation] - m_Probesets: Optional[List[Hash128]] = None + m_Renderers: List[EnlightenRendererInformation] + m_SystemAtlases: List[EnlightenSystemAtlasInformation] + m_Systems: List[EnlightenSystemInformation] + m_TerrainChunks: List[EnlightenTerrainChunksInformation] + m_CAHMap: Optional[EnlightenCAHMap] = None + m_Probesets: Optional[List[Hash128]] = None @unitypy_define class EnlightenSystemAtlasInformation: - atlasHash: Hash128 - atlasSize: int - firstSystemId: int + atlasHash: Hash128 + atlasSize: int + firstSystemId: int @unitypy_define class EnlightenSystemInformation: - atlasIndex: int - atlasOffsetX: int - atlasOffsetY: int - inputSystemHash: Hash128 - radiositySystemHash: Hash128 - rendererIndex: int - rendererSize: int + atlasIndex: int + atlasOffsetX: int + atlasOffsetY: int + inputSystemHash: Hash128 + radiositySystemHash: Hash128 + rendererIndex: int + rendererSize: int @unitypy_define class EnlightenTerrainChunksInformation: - firstSystemId: int - numChunksInX: int - numChunksInY: int + firstSystemId: int + numChunksInX: int + numChunksInY: int + + +@unitypy_define +class EntityId: + pass + + +@unitypy_define +class Error: + filePath: str + message: str + severity: int + startChar: int + startLine: int + + +@unitypy_define +class ErrorLog: + m_HasErrors: bool + m_Messages: List[Message] @unitypy_define class ExpandedData: - m_ClassID: int - m_ExpandedProperties: List[str] - m_InspectorExpanded: bool - m_ScriptClass: str + m_ClassID: int + m_ExpandedProperties: List[str] + m_InspectorExpanded: bool + m_ScriptClass: str @unitypy_define class ExposedReferenceTable: - m_References: List[Tuple[str, PPtr[Object]]] + m_References: List[Tuple[str, PPtr[Object]]] @unitypy_define class Expression: - data_0_: int - data_1_: int - data_2_: int - data_3_: int - op: int - valueIndex: int + data_0_: int + data_1_: int + data_2_: int + data_3_: int + op: int + valueIndex: int + dataSize: Optional[int] = None + dataType: Optional[int] = None + jmpCode: Optional[int] = None + scalarSwitchCase: Optional[int] = None @unitypy_define class ExtensionPropertyValue: - extensionName: str - pluginName: str - propertyName: str - propertyValue: float + extensionName: str + pluginName: str + propertyName: str + propertyValue: float @unitypy_define class ExternalForcesModule: - enabled: bool - influenceFilter: Optional[int] = None - influenceList: Optional[List[PPtr[ParticleSystemForceField]]] = None - influenceMask: Optional[BitField] = None - multiplier: Optional[float] = None - multiplierCurve: Optional[MinMaxCurve] = None + enabled: bool + influenceFilter: Optional[int] = None + influenceList: Optional[List[PPtr[ParticleSystemForceField]]] = None + influenceMask: Optional[BitField] = None + multiplier: Optional[float] = None + multiplierCurve: Optional[MinMaxCurve] = None @unitypy_define class FalloffTable: - m_Table_0_: float - m_Table_10_: float - m_Table_11_: float - m_Table_12_: float - m_Table_1_: float - m_Table_2_: float - m_Table_3_: float - m_Table_4_: float - m_Table_5_: float - m_Table_6_: float - m_Table_7_: float - m_Table_8_: float - m_Table_9_: float + m_Table_0_: float + m_Table_10_: float + m_Table_11_: float + m_Table_12_: float + m_Table_1_: float + m_Table_2_: float + m_Table_3_: float + m_Table_4_: float + m_Table_5_: float + m_Table_6_: float + m_Table_7_: float + m_Table_8_: float + m_Table_9_: float @unitypy_define class FastPropertyName: - name: str + name: str @unitypy_define class FlareElement: - m_Color: ColorRGBA - m_Fade: bool - m_ImageIndex: int - m_Position: float - m_Rotate: bool - m_Size: float - m_UseLightColor: bool - m_Zoom: bool + m_Color: ColorRGBA + m_Fade: bool + m_ImageIndex: int + m_Position: float + m_Rotate: bool + m_Size: float + m_UseLightColor: bool + m_Zoom: bool @unitypy_define class FloatCurve: - attribute: str - classID: int - curve: AnimationCurve - path: str - script: PPtr[MonoScript] - flags: Optional[int] = None + attribute: str + classID: int + curve: AnimationCurve + path: str + script: PPtr[MonoScript] + flags: Optional[int] = None @unitypy_define class ForceModule: - enabled: bool - inWorldSpace: bool - randomizePerFrame: bool - x: MinMaxCurve - y: MinMaxCurve - z: MinMaxCurve + enabled: bool + inWorldSpace: bool + randomizePerFrame: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve @unitypy_define class GISettings: - m_AlbedoBoost: float - m_BounceScale: float - m_EnableBakedLightmaps: bool - m_EnableRealtimeLightmaps: bool - m_EnvironmentLightingMode: int - m_IndirectOutputScale: float - m_TemporalCoherenceThreshold: Optional[float] = None + m_AlbedoBoost: float + m_BounceScale: float + m_EnableBakedLightmaps: bool + m_EnableRealtimeLightmaps: bool + m_EnvironmentLightingMode: int + m_IndirectOutputScale: float + m_TemporalCoherenceThreshold: Optional[float] = None @unitypy_define class GLTextureSettings: - m_Aniso: int - m_FilterMode: int - m_MipBias: float - m_WrapMode: Optional[int] = None - m_WrapU: Optional[int] = None - m_WrapV: Optional[int] = None - m_WrapW: Optional[int] = None + m_Aniso: int + m_FilterMode: int + m_MipBias: float + m_WrapMode: Optional[int] = None + m_WrapU: Optional[int] = None + m_WrapV: Optional[int] = None + m_WrapW: Optional[int] = None @unitypy_define class GUID: - data_0_: int - data_1_: int - data_2_: int - data_3_: int + data_0_: int + data_1_: int + data_2_: int + data_3_: int @unitypy_define class GenericBinding: - attribute: int - customType: int - isPPtrCurve: int - path: int - script: PPtr[Object] - classID: Optional[int] = None - isIntCurve: Optional[int] = None - isSerializeReferenceCurve: Optional[int] = None - typeID: Optional[int] = None + attribute: int + customType: int + isPPtrCurve: int + path: int + script: PPtr[Object] + classID: Optional[int] = None + isIntCurve: Optional[int] = None + isSerializeReferenceCurve: Optional[int] = None + metaData: Optional[int] = None + typeID: Optional[int] = None @unitypy_define class GfxBlendState: - alphaToMask: int - rt: List[GfxRenderTargetBlendState] - separateMRTBlend: int + alphaToMask: int + rt: List[GfxRenderTargetBlendState] + separateMRTBlend: int @unitypy_define class GfxDepthState: - depthFunc: int - depthWrite: int + depthFunc: int + depthWrite: int @unitypy_define class GfxRasterState: - conservative: int - cullMode: int - depthBias: int - depthClip: int - slopeScaledDepthBias: float + conservative: int + cullMode: int + depthBias: int + depthClip: int + slopeScaledDepthBias: float @unitypy_define class GfxRenderTargetBlendState: - blendOp: int - blendOpAlpha: int - dstBlend: int - dstBlendAlpha: int - srcBlend: int - srcBlendAlpha: int - writeMask: int + blendOp: int + blendOpAlpha: int + dstBlend: int + dstBlendAlpha: int + srcBlend: int + srcBlendAlpha: int + writeMask: int @unitypy_define class GfxStencilState: - padding: int - readMask: int - stencilEnable: int - stencilFailOpBack: int - stencilFailOpFront: int - stencilFuncBack: int - stencilFuncFront: int - stencilPassOpBack: int - stencilPassOpFront: int - stencilZFailOpBack: int - stencilZFailOpFront: int - writeMask: int + padding: int + readMask: int + stencilEnable: int + stencilFailOpBack: int + stencilFailOpFront: int + stencilFuncBack: int + stencilFuncFront: int + stencilPassOpBack: int + stencilPassOpFront: int + stencilZFailOpBack: int + stencilZFailOpFront: int + writeMask: int @unitypy_define class Google: - depthFormat: int - enableTransitionView: Optional[bool] = None - enableVideoLayer: Optional[bool] = None - maximumSupportedHeadTracking: Optional[int] = None - minimumSupportedHeadTracking: Optional[int] = None - useProtectedVideoMemory: Optional[bool] = None - useSustainedPerformanceMode: Optional[bool] = None + depthFormat: int + enableTransitionView: Optional[bool] = None + enableVideoLayer: Optional[bool] = None + maximumSupportedHeadTracking: Optional[int] = None + minimumSupportedHeadTracking: Optional[int] = None + useProtectedVideoMemory: Optional[bool] = None + useSustainedPerformanceMode: Optional[bool] = None @unitypy_define class Gradient: - atime0: Optional[int] = None - atime1: Optional[int] = None - atime2: Optional[int] = None - atime3: Optional[int] = None - atime4: Optional[int] = None - atime5: Optional[int] = None - atime6: Optional[int] = None - atime7: Optional[int] = None - ctime0: Optional[int] = None - ctime1: Optional[int] = None - ctime2: Optional[int] = None - ctime3: Optional[int] = None - ctime4: Optional[int] = None - ctime5: Optional[int] = None - ctime6: Optional[int] = None - ctime7: Optional[int] = None - key0: Optional[ColorRGBA] = None - key1: Optional[ColorRGBA] = None - key2: Optional[ColorRGBA] = None - key3: Optional[ColorRGBA] = None - key4: Optional[ColorRGBA] = None - key5: Optional[ColorRGBA] = None - key6: Optional[ColorRGBA] = None - key7: Optional[ColorRGBA] = None - m_ColorSpace: Optional[int] = None - m_Color_0_: Optional[ColorRGBA] = None - m_Color_1_: Optional[ColorRGBA] = None - m_Color_2_: Optional[ColorRGBA] = None - m_Color_3_: Optional[ColorRGBA] = None - m_Color_4_: Optional[ColorRGBA] = None - m_Mode: Optional[int] = None - m_NumAlphaKeys: Optional[int] = None - m_NumColorKeys: Optional[int] = None + atime0: Optional[int] = None + atime1: Optional[int] = None + atime2: Optional[int] = None + atime3: Optional[int] = None + atime4: Optional[int] = None + atime5: Optional[int] = None + atime6: Optional[int] = None + atime7: Optional[int] = None + ctime0: Optional[int] = None + ctime1: Optional[int] = None + ctime2: Optional[int] = None + ctime3: Optional[int] = None + ctime4: Optional[int] = None + ctime5: Optional[int] = None + ctime6: Optional[int] = None + ctime7: Optional[int] = None + key0: Optional[ColorRGBA] = None + key1: Optional[ColorRGBA] = None + key2: Optional[ColorRGBA] = None + key3: Optional[ColorRGBA] = None + key4: Optional[ColorRGBA] = None + key5: Optional[ColorRGBA] = None + key6: Optional[ColorRGBA] = None + key7: Optional[ColorRGBA] = None + m_ColorSpace: Optional[int] = None + m_Color_0_: Optional[ColorRGBA] = None + m_Color_1_: Optional[ColorRGBA] = None + m_Color_2_: Optional[ColorRGBA] = None + m_Color_3_: Optional[ColorRGBA] = None + m_Color_4_: Optional[ColorRGBA] = None + m_Mode: Optional[int] = None + m_NumAlphaKeys: Optional[int] = None + m_NumColorKeys: Optional[int] = None @unitypy_define class GradientNEW: - atime0: int - atime1: int - atime2: int - atime3: int - atime4: int - atime5: int - atime6: int - atime7: int - ctime0: int - ctime1: int - ctime2: int - ctime3: int - ctime4: int - ctime5: int - ctime6: int - ctime7: int - key0: ColorRGBA - key1: ColorRGBA - key2: ColorRGBA - key3: ColorRGBA - key4: ColorRGBA - key5: ColorRGBA - key6: ColorRGBA - key7: ColorRGBA - m_NumAlphaKeys: int - m_NumColorKeys: int + atime0: int + atime1: int + atime2: int + atime3: int + atime4: int + atime5: int + atime6: int + atime7: int + ctime0: int + ctime1: int + ctime2: int + ctime3: int + ctime4: int + ctime5: int + ctime6: int + ctime7: int + key0: ColorRGBA + key1: ColorRGBA + key2: ColorRGBA + key3: ColorRGBA + key4: ColorRGBA + key5: ColorRGBA + key6: ColorRGBA + key7: ColorRGBA + m_NumAlphaKeys: int + m_NumColorKeys: int @unitypy_define class GraphicsStateInfo: - appBackface: bool - depthBias: float - forceCullMode: int - invertProjectionMatrix: bool - renderPass: int - renderState: int - slopeDepthBias: float - subPassIndex: int - topology: int - userBackface: bool - vertexLayout: int - wireframe: bool + appBackface: bool + depthBias: float + forceCullMode: int + invertProjectionMatrix: bool + renderPass: int + renderState: int + slopeDepthBias: float + subPassIndex: int + topology: int + userBackface: bool + vertexLayout: int + wireframe: bool + baseShadingRate: Optional[int] = None + nonfilteringSamplerBindings: Optional[int] = None + shadingRateCombinerFragment: Optional[int] = None + shadingRateCombinerPrimitive: Optional[int] = None + unfilterableTextureBindings: Optional[int] = None @unitypy_define class GroupConnection: - sendEffectIndex: int - sourceGroupIndex: int - targetGroupIndex: int + sendEffectIndex: int + sourceGroupIndex: int + targetGroupIndex: int @unitypy_define class GroupConstant: - bypassEffects: bool - mute: bool - parentConstantIndex: int - pitchIndex: int - solo: bool - volumeIndex: int - sendIndex: Optional[int] = None + bypassEffects: bool + mute: bool + parentConstantIndex: int + pitchIndex: int + solo: bool + volumeIndex: int + sendIndex: Optional[int] = None @unitypy_define class Hand: - m_HandBoneIndex: List[int] + m_HandBoneIndex: List[int] @unitypy_define class HandPose: - m_CloseOpen: float - m_DoFArray: List[float] - m_Grab: float - m_GrabX: xform - m_InOut: float - m_Override: float + m_CloseOpen: float + m_DoFArray: List[float] + m_Grab: float + m_GrabX: xform + m_InOut: float + m_Override: float @unitypy_define class Handle: - m_ID: int - m_ParentHumanIndex: int - m_X: xform + m_ID: int + m_ParentHumanIndex: int + m_X: xform @unitypy_define class Hash128: - bytes_0_: int - bytes_10_: int - bytes_11_: int - bytes_12_: int - bytes_13_: int - bytes_14_: int - bytes_15_: int - bytes_1_: int - bytes_2_: int - bytes_3_: int - bytes_4_: int - bytes_5_: int - bytes_6_: int - bytes_7_: int - bytes_8_: int - bytes_9_: int + bytes_0_: int + bytes_10_: int + bytes_11_: int + bytes_12_: int + bytes_13_: int + bytes_14_: int + bytes_15_: int + bytes_1_: int + bytes_2_: int + bytes_3_: int + bytes_4_: int + bytes_5_: int + bytes_6_: int + bytes_7_: int + bytes_8_: int + bytes_9_: int @unitypy_define class HeightMeshBVNode: - i: int - max: Vector3f - min: Vector3f - n: int + i: int + max: Vector3f + min: Vector3f + n: int @unitypy_define class HeightMeshData: - m_Bounds: AABB - m_Indices: List[int] - m_Nodes: List[HeightMeshBVNode] - m_Vertices: List[Vector3f] + m_Bounds: AABB + m_Indices: List[int] + m_Nodes: List[HeightMeshBVNode] + m_Vertices: List[Vector3f] @unitypy_define class Heightmap: - m_Heights: List[int] - m_Levels: int - m_MinMaxPatchHeights: List[float] - m_PrecomputedError: List[float] - m_Scale: Vector3f - m_DefaultPhysicMaterial: Optional[PPtr[PhysicMaterial]] = None - m_EnableHolesTextureCompression: Optional[bool] = None - m_EnableSurfaceMaskTextureCompression: Optional[bool] = None - m_Height: Optional[int] = None - m_Holes: Optional[List[int]] = None - m_HolesLOD: Optional[List[int]] = None - m_Resolution: Optional[int] = None - m_SurfaceMask: Optional[List[int]] = None - m_SurfaceMaskLOD: Optional[List[int]] = None - m_Thickness: Optional[float] = None - m_Width: Optional[int] = None + m_Heights: List[int] + m_Levels: int + m_MinMaxPatchHeights: List[float] + m_PrecomputedError: List[float] + m_Scale: Vector3f + m_DefaultPhysicMaterial: Optional[PPtr[PhysicMaterial]] = None + m_EnableHolesTextureCompression: Optional[bool] = None + m_EnableSurfaceMaskTextureCompression: Optional[bool] = None + m_Height: Optional[int] = None + m_Holes: Optional[List[int]] = None + m_HolesLOD: Optional[List[int]] = None + m_Resolution: Optional[int] = None + m_SurfaceMask: Optional[List[int]] = None + m_SurfaceMaskLOD: Optional[List[int]] = None + m_Thickness: Optional[float] = None + m_Width: Optional[int] = None @unitypy_define class HeightmapData: - terrainData: PPtr[Object] - isRotated: Optional[bool] = None - position: Optional[Vector3f] = None - surfaceToTerrain: Optional[Matrix4x4f] = None + terrainData: PPtr[Object] + isRotated: Optional[bool] = None + position: Optional[Vector3f] = None + surfaceToTerrain: Optional[Matrix4x4f] = None @unitypy_define class HierarchicalSceneData: - m_SceneGUID: GUID + m_SceneGUID: GUID + + +@unitypy_define +class Hint: + m_Key: str + m_Value: str @unitypy_define class HoloLens: - depthFormat: int - depthBufferSharingEnabled: Optional[bool] = None + depthFormat: int + depthBufferSharingEnabled: Optional[bool] = None @unitypy_define class Human: - m_ArmStretch: float - m_ArmTwist: float - m_FeetSpacing: float - m_ForeArmTwist: float - m_HasLeftHand: bool - m_HasRightHand: bool - m_HumanBoneIndex: List[int] - m_HumanBoneMass: List[float] - m_LeftHand: OffsetPtr - m_LegStretch: float - m_LegTwist: float - m_RightHand: OffsetPtr - m_RootX: xform - m_Scale: float - m_Skeleton: OffsetPtr - m_SkeletonPose: OffsetPtr - m_UpperLegTwist: float - m_ColliderArray: Optional[List[Collider]] = None - m_ColliderIndex: Optional[List[int]] = None - m_Handles: Optional[List[Handle]] = None - m_HasTDoF: Optional[bool] = None + m_ArmStretch: float + m_ArmTwist: float + m_FeetSpacing: float + m_ForeArmTwist: float + m_HasLeftHand: bool + m_HasRightHand: bool + m_HumanBoneIndex: List[int] + m_HumanBoneMass: List[float] + m_LeftHand: OffsetPtr + m_LegStretch: float + m_LegTwist: float + m_RightHand: OffsetPtr + m_RootX: xform + m_Scale: float + m_Skeleton: OffsetPtr + m_SkeletonPose: OffsetPtr + m_UpperLegTwist: float + m_ColliderArray: Optional[List[Collider]] = None + m_ColliderIndex: Optional[List[int]] = None + m_Handles: Optional[List[Handle]] = None + m_HasTDoF: Optional[bool] = None @unitypy_define class HumanBone: - m_BoneName: str - m_HumanName: str - m_Limit: SkeletonBoneLimit + m_BoneName: str + m_HumanName: str + m_Limit: SkeletonBoneLimit @unitypy_define class HumanDescription: - m_ArmStretch: float - m_ArmTwist: float - m_FeetSpacing: float - m_ForeArmTwist: float - m_Human: List[HumanBone] - m_LegStretch: float - m_LegTwist: float - m_RootMotionBoneName: str - m_Skeleton: List[SkeletonBone] - m_UpperLegTwist: float - m_GlobalScale: Optional[float] = None - m_Handles: Optional[List[HumanHandle]] = None - m_HasExtraRoot: Optional[bool] = None - m_HasTranslationDoF: Optional[bool] = None - m_RootMotionBoneRotation: Optional[Quaternionf] = None - m_SkeletonHasParents: Optional[bool] = None + m_ArmStretch: float + m_ArmTwist: float + m_FeetSpacing: float + m_ForeArmTwist: float + m_Human: List[HumanBone] + m_LegStretch: float + m_LegTwist: float + m_RootMotionBoneName: str + m_Skeleton: List[SkeletonBone] + m_UpperLegTwist: float + m_GlobalScale: Optional[float] = None + m_Handles: Optional[List[HumanHandle]] = None + m_HasExtraRoot: Optional[bool] = None + m_HasTranslationDoF: Optional[bool] = None + m_RootMotionBoneRotation: Optional[Quaternionf] = None + m_SkeletonHasParents: Optional[bool] = None @unitypy_define class HumanGoal: - m_WeightR: float - m_WeightT: float - m_X: xform - m_HintT: Optional[Union[float3, float4]] = None - m_HintWeightT: Optional[float] = None + m_WeightR: float + m_WeightT: float + m_X: xform + m_HintT: Optional[Union[float3, float4]] = None + m_HintWeightT: Optional[float] = None @unitypy_define class HumanHandle: - m_BoneName: str - m_LookAt: bool - m_Name: str - m_Position: Vector3f - m_Rotation: Quaternionf - m_Scale: Vector3f + m_BoneName: str + m_LookAt: bool + m_Name: str + m_Position: Vector3f + m_Rotation: Quaternionf + m_Scale: Vector3f @unitypy_define class HumanLayerConstant: - m_Binding: int - m_BodyMask: HumanPoseMask - m_IKPass: bool - m_LayerBlendingMode: int - m_SkeletonMask: OffsetPtr - m_StateMachineIndex: int - m_StateMachineMotionSetIndex: int - m_DefaultWeight: Optional[float] = None - m_SyncedLayerAffectsTiming: Optional[bool] = None + m_Binding: int + m_BodyMask: HumanPoseMask + m_IKPass: bool + m_LayerBlendingMode: int + m_SkeletonMask: OffsetPtr + m_StateMachineIndex: int + m_StateMachineMotionSetIndex: int + m_DefaultWeight: Optional[float] = None + m_SyncedLayerAffectsTiming: Optional[bool] = None @unitypy_define class HumanPose: - m_DoFArray: List[float] - m_GoalArray: List[HumanGoal] - m_LeftHandPose: HandPose - m_LookAtPosition: Union[float3, float4] - m_LookAtWeight: float4 - m_RightHandPose: HandPose - m_RootX: xform - m_TDoFArray: Optional[Union[List[float4], List[float3]]] = None + m_DoFArray: List[float] + m_GoalArray: List[HumanGoal] + m_LeftHandPose: HandPose + m_LookAtPosition: Union[float3, float4] + m_LookAtWeight: float4 + m_RightHandPose: HandPose + m_RootX: xform + m_TDoFArray: Optional[Union[List[float3], List[float4]]] = None @unitypy_define class HumanPoseMask: - word0: int - word1: int - word2: Optional[int] = None + word0: int + word1: int + word2: Optional[int] = None @unitypy_define class Image: - image_data: bytes - m_Format: int - m_Height: int - m_RowBytes: int - m_Width: int + image_data: bytes + m_Format: int + m_Height: int + m_RowBytes: int + m_Width: int @unitypy_define class ImportLog_ImportLogEntry: - file: str - line: int - message: str - mode: int - object: PPtr[Object] + file: str + line: int + message: str + mode: int + object: PPtr[Object] @unitypy_define class InheritVelocityModule: - enabled: bool - m_Curve: MinMaxCurve - m_Mode: int + enabled: bool + m_Curve: MinMaxCurve + m_Mode: int @unitypy_define class InitialModule: - enabled: bool - gravityModifier: Union[MinMaxCurve, float] - maxNumParticles: int - startColor: MinMaxGradient - startLifetime: MinMaxCurve - startRotation: MinMaxCurve - startSize: MinMaxCurve - startSpeed: MinMaxCurve - customEmitterVelocity: Optional[Vector3f] = None - gravitySource: Optional[int] = None - inheritVelocity: Optional[float] = None - randomizeRotationDirection: Optional[float] = None - rotation3D: Optional[bool] = None - size3D: Optional[bool] = None - startRotationX: Optional[MinMaxCurve] = None - startRotationY: Optional[MinMaxCurve] = None - startSizeY: Optional[MinMaxCurve] = None - startSizeZ: Optional[MinMaxCurve] = None + enabled: bool + gravityModifier: Union[MinMaxCurve, float] + maxNumParticles: int + startColor: MinMaxGradient + startLifetime: MinMaxCurve + startRotation: MinMaxCurve + startSize: MinMaxCurve + startSpeed: MinMaxCurve + customEmitterVelocity: Optional[Vector3f] = None + gravitySource: Optional[int] = None + inheritVelocity: Optional[float] = None + randomizeRotationDirection: Optional[float] = None + rotation3D: Optional[bool] = None + size3D: Optional[bool] = None + startRotationX: Optional[MinMaxCurve] = None + startRotationY: Optional[MinMaxCurve] = None + startSizeY: Optional[MinMaxCurve] = None + startSizeZ: Optional[MinMaxCurve] = None @unitypy_define class InputAxis: - altNegativeButton: str - altPositiveButton: str - axis: int - dead: float - descriptiveName: str - descriptiveNegativeName: str - gravity: float - invert: bool - joyNum: int - m_Name: str - negativeButton: str - positiveButton: str - sensitivity: float - snap: bool - type: int + altNegativeButton: str + altPositiveButton: str + axis: int + dead: float + descriptiveName: str + descriptiveNegativeName: str + gravity: float + invert: bool + joyNum: int + m_Name: str + negativeButton: str + positiveButton: str + sensitivity: float + snap: bool + type: int @unitypy_define class InputImportSettings: - name: str - alphaSource: Optional[int] = None - aniso: Optional[int] = None - filterMode: Optional[int] = None - value: Optional[SubstanceValue] = None - wrapMode: Optional[int] = None + name: str + alphaSource: Optional[int] = None + aniso: Optional[int] = None + filterMode: Optional[int] = None + value: Optional[SubstanceValue] = None + wrapMode: Optional[int] = None + + +@unitypy_define +class InsightsSettings: + m_Enabled: bool + m_EngineDiagnosticsEnabled: bool + m_EventUrl: str + m_StackTraceUrl: str @unitypy_define class IntPoint: - X: int - Y: int + X: int + Y: int @unitypy_define class Item: - changeFlags: Optional[int] = None - changeset: Optional[int] = None - digest: Optional[Union[Hash128, MdFour]] = None - downloadResolution: Optional[int] = None - guid: Optional[GUID] = None - markedForRemoval: Optional[bool] = None - name: Optional[str] = None - nameConflictResolution: Optional[int] = None - oldVersion: Optional[int] = None - origin: Optional[int] = None - parent: Optional[GUID] = None - parentFolderID: Optional[int] = None - type: Optional[int] = None + changeFlags: Optional[int] = None + changeset: Optional[int] = None + digest: Optional[Union[Hash128, MdFour]] = None + downloadResolution: Optional[int] = None + guid: Optional[GUID] = None + markedForRemoval: Optional[bool] = None + name: Optional[str] = None + nameConflictResolution: Optional[int] = None + oldVersion: Optional[int] = None + origin: Optional[int] = None + parent: Optional[GUID] = None + parentFolderID: Optional[int] = None + type: Optional[int] = None @unitypy_define class JointAngleLimit2D: - m_LowerAngle: float - m_UpperAngle: float + m_LowerAngle: float + m_UpperAngle: float @unitypy_define class JointAngleLimits2D: - m_LowerAngle: float - m_UpperAngle: float + m_LowerAngle: float + m_UpperAngle: float @unitypy_define class JointDrive: - maximumForce: float - positionDamper: float - positionSpring: float - mode: Optional[int] = None - useAcceleration: Optional[int] = None + maximumForce: float + positionDamper: float + positionSpring: float + mode: Optional[int] = None + useAcceleration: Optional[int] = None @unitypy_define class JointLimits: - max: float - min: float - bounceMinVelocity: Optional[float] = None - bounciness: Optional[float] = None - contactDistance: Optional[float] = None - maxBounce: Optional[float] = None - minBounce: Optional[float] = None + max: float + min: float + bounceMinVelocity: Optional[float] = None + bounciness: Optional[float] = None + contactDistance: Optional[float] = None + maxBounce: Optional[float] = None + minBounce: Optional[float] = None @unitypy_define class JointMotor: - force: float - freeSpin: int - targetVelocity: float + force: float + freeSpin: int + targetVelocity: float @unitypy_define class JointMotor2D: - m_MaximumMotorForce: float - m_MotorSpeed: float + m_MaximumMotorForce: float + m_MotorSpeed: float @unitypy_define class JointSpring: - damper: float - spring: float - targetPosition: float + damper: float + spring: float + targetPosition: float @unitypy_define class JointSuspension2D: - m_Angle: float - m_DampingRatio: float - m_Frequency: float + m_Angle: float + m_DampingRatio: float + m_Frequency: float @unitypy_define class JointTranslationLimits2D: - m_LowerTranslation: float - m_UpperTranslation: float + m_LowerTranslation: float + m_UpperTranslation: float @unitypy_define class Keyframe: - inSlope: Union[Quaternionf, float, Vector3f] - outSlope: Union[Quaternionf, float, Vector3f] - time: float - value: Union[Quaternionf, float, Vector3f] - inWeight: Optional[Union[Quaternionf, float, Vector3f]] = None - outWeight: Optional[Union[Quaternionf, float, Vector3f]] = None - weightedMode: Optional[int] = None + inSlope: Union[Quaternionf, Vector3f, float] + outSlope: Union[Quaternionf, Vector3f, float] + time: float + value: Union[Quaternionf, Vector3f, float] + inWeight: Optional[Union[Quaternionf, Vector3f, float]] = None + outWeight: Optional[Union[Quaternionf, Vector3f, float]] = None + weightedMode: Optional[int] = None @unitypy_define class LOD: - renderers: List[LODRenderer] - screenRelativeHeight: float - fadeMode: Optional[int] = None - fadeTransitionWidth: Optional[float] = None + renderers: List[LODRenderer] + screenRelativeHeight: float + fadeMode: Optional[int] = None + fadeTransitionWidth: Optional[float] = None @unitypy_define class LODRenderer: - renderer: PPtr[Renderer] + renderer: PPtr[Renderer] @unitypy_define class LayerConstant: - m_Binding: int - m_BodyMask: HumanPoseMask - m_DefaultWeight: float - m_IKPass: bool - m_LayerBlendingMode: int - m_SkeletonMask: OffsetPtr - m_StateMachineIndex: int - m_SyncedLayerAffectsTiming: bool - m_StateMachineMotionSetIndex: Optional[int] = None - m_StateMachineSynchronizedLayerIndex: Optional[int] = None + m_Binding: int + m_BodyMask: HumanPoseMask + m_DefaultWeight: float + m_IKPass: bool + m_LayerBlendingMode: int + m_SkeletonMask: OffsetPtr + m_StateMachineIndex: int + m_SyncedLayerAffectsTiming: bool + m_StateMachineMotionSetIndex: Optional[int] = None + m_StateMachineSynchronizedLayerIndex: Optional[int] = None @unitypy_define class LayoutDataOne: - m_FloatArray: List[float] + m_FloatArray: List[float] @unitypy_define class LayoutDataThree: - m_AnotherFloatArray: List[float] + m_AnotherFloatArray: List[float] @unitypy_define class LayoutDataTwo: - m_FloatValue: float - m_IntegerValue: int + m_FloatValue: float + m_IntegerValue: int @unitypy_define class LeafInfoConstant: - m_IDArray: List[int] - m_IndexOffset: int + m_IDArray: List[int] + m_IndexOffset: int @unitypy_define class LibraryRepresentation: - name: str - scriptClassName: str - thumbnail: Image - thumbnailClassID: int - flags: Optional[int] = None - guid: Optional[GUID] = None - localIdentifier: Optional[int] = None - object: Optional[Union[PPtr[EditorExtension], PPtr[Object]]] = None - path: Optional[str] = None + name: str + scriptClassName: str + thumbnail: Image + thumbnailClassID: int + flags: Optional[int] = None + guid: Optional[GUID] = None + localIdentifier: Optional[int] = None + object: Optional[Union[PPtr[EditorExtension], PPtr[Object]]] = None + path: Optional[str] = None @unitypy_define class LifetimeByEmitterSpeedModule: - enabled: bool - m_Curve: MinMaxCurve - m_Range: Vector2f + enabled: bool + m_Curve: MinMaxCurve + m_Range: Vector2f @unitypy_define class LightBakingOutput: - probeOcclusionLightIndex: int - isBaked: Optional[bool] = None - lightmapBakeMode: Optional[LightmapBakeMode] = None - lightmappingMask: Optional[int] = None - occlusionMaskChannel: Optional[int] = None - shadowMaskChannel: Optional[int] = None + probeOcclusionLightIndex: int + isBaked: Optional[bool] = None + lightmapBakeMode: Optional[LightmapBakeMode] = None + lightmappingMask: Optional[int] = None + occlusionMaskChannel: Optional[int] = None + shadowMaskChannel: Optional[int] = None @unitypy_define class LightProbeData: - m_NonTetrahedralizedProbeSetIndexMap: List[Tuple[Hash128, int]] - m_Positions: List[Vector3f] - m_ProbeSets: List[ProbeSetIndex] - m_Tetrahedralization: ProbeSetTetrahedralization + m_NonTetrahedralizedProbeSetIndexMap: List[Tuple[Hash128, int]] + m_Positions: List[Vector3f] + m_ProbeSets: List[ProbeSetIndex] + m_Tetrahedralization: ProbeSetTetrahedralization @unitypy_define class LightProbeOcclusion: - m_Occlusion: List[float] - m_BakedLightIndex: Optional[List[int]] = None - m_OcclusionMaskChannel: Optional[List[int]] = None - m_ProbeOcclusionLightIndex: Optional[List[int]] = None - m_ShadowMaskChannel: Optional[List[int]] = None + m_Occlusion: List[float] + m_BakedLightIndex: Optional[List[int]] = None + m_OcclusionMaskChannel: Optional[List[int]] = None + m_ProbeOcclusionLightIndex: Optional[List[int]] = None + m_ShadowMaskChannel: Optional[List[int]] = None @unitypy_define class LightmapBakeMode: - lightmapBakeType: int - mixedLightingMode: int + lightmapBakeType: int + mixedLightingMode: int @unitypy_define class LightmapData: - m_DirLightmap: Optional[PPtr[Texture2D]] = None - m_IndirectLightmap: Optional[PPtr[Texture2D]] = None - m_Lightmap: Optional[PPtr[Texture2D]] = None - m_ShadowMask: Optional[PPtr[Texture2D]] = None - sh_0_: Optional[float] = None - sh_10_: Optional[float] = None - sh_11_: Optional[float] = None - sh_12_: Optional[float] = None - sh_13_: Optional[float] = None - sh_14_: Optional[float] = None - sh_15_: Optional[float] = None - sh_16_: Optional[float] = None - sh_17_: Optional[float] = None - sh_18_: Optional[float] = None - sh_19_: Optional[float] = None - sh_1_: Optional[float] = None - sh_20_: Optional[float] = None - sh_21_: Optional[float] = None - sh_22_: Optional[float] = None - sh_23_: Optional[float] = None - sh_24_: Optional[float] = None - sh_25_: Optional[float] = None - sh_26_: Optional[float] = None - sh_2_: Optional[float] = None - sh_3_: Optional[float] = None - sh_4_: Optional[float] = None - sh_5_: Optional[float] = None - sh_6_: Optional[float] = None - sh_7_: Optional[float] = None - sh_8_: Optional[float] = None - sh_9_: Optional[float] = None + m_DirLightmap: Optional[PPtr[Texture2D]] = None + m_IndirectLightmap: Optional[PPtr[Texture2D]] = None + m_Lightmap: Optional[PPtr[Texture2D]] = None + m_ShadowMask: Optional[PPtr[Texture2D]] = None + sh_0_: Optional[float] = None + sh_10_: Optional[float] = None + sh_11_: Optional[float] = None + sh_12_: Optional[float] = None + sh_13_: Optional[float] = None + sh_14_: Optional[float] = None + sh_15_: Optional[float] = None + sh_16_: Optional[float] = None + sh_17_: Optional[float] = None + sh_18_: Optional[float] = None + sh_19_: Optional[float] = None + sh_1_: Optional[float] = None + sh_20_: Optional[float] = None + sh_21_: Optional[float] = None + sh_22_: Optional[float] = None + sh_23_: Optional[float] = None + sh_24_: Optional[float] = None + sh_25_: Optional[float] = None + sh_26_: Optional[float] = None + sh_2_: Optional[float] = None + sh_3_: Optional[float] = None + sh_4_: Optional[float] = None + sh_5_: Optional[float] = None + sh_6_: Optional[float] = None + sh_7_: Optional[float] = None + sh_8_: Optional[float] = None + sh_9_: Optional[float] = None @unitypy_define class LightmapSnapshot(NamedObject): - m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] - m_BakedReflectionProbes: List[SceneObjectIdentifier] - m_EnlightenData: List[int] - m_EnlightenSceneMapping: EnlightenSceneMapping - m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] - m_LightProbes: PPtr[LightProbes] - m_LightmappedRendererData: List[RendererData] - m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] - m_Lightmaps: List[LightmapData] - m_Lights: List[SceneObjectIdentifier] - m_Name: str - m_BakedAmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None - m_BakedAmbientProbeInLinear: Optional[SphericalHarmonicsL2] = None - m_BakedAmbientProbesInGamma: Optional[List[SphericalHarmonicsL2]] = None - m_BakedAmbientProbesInLinear: Optional[List[SphericalHarmonicsL2]] = None - m_BakedSkyboxProbeCubemaps: Optional[List[PPtr[Texture]]] = None - m_SceneGUID: Optional[GUID] = None + m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] + m_BakedReflectionProbes: List[SceneObjectIdentifier] + m_EnlightenData: List[int] + m_EnlightenSceneMapping: EnlightenSceneMapping + m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] + m_LightProbes: PPtr[LightProbes] + m_LightmappedRendererData: List[RendererData] + m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] + m_Lightmaps: List[LightmapData] + m_Lights: List[SceneObjectIdentifier] + m_Name: str + m_BakedAmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None + m_BakedAmbientProbeInLinear: Optional[SphericalHarmonicsL2] = None + m_BakedAmbientProbesInGamma: Optional[List[SphericalHarmonicsL2]] = None + m_BakedAmbientProbesInLinear: Optional[List[SphericalHarmonicsL2]] = None + m_BakedSkyboxProbeCubemaps: Optional[List[PPtr[Texture]]] = None + m_SceneGUID: Optional[GUID] = None @unitypy_define class LightsModule: - color: bool - enabled: bool - intensity: bool - intensityCurve: MinMaxCurve - light: PPtr[Light] - maxLights: int - randomDistribution: bool - range: bool - rangeCurve: MinMaxCurve - ratio: float + color: bool + enabled: bool + intensity: bool + intensityCurve: MinMaxCurve + light: PPtr[Light] + maxLights: int + randomDistribution: bool + range: bool + rangeCurve: MinMaxCurve + ratio: float @unitypy_define class Limit: - m_Max: Union[float3, float4] - m_Min: Union[float3, float4] + m_Max: Union[float3, float4] + m_Min: Union[float3, float4] @unitypy_define class LineParameters: - alignment: Optional[int] = None - colorGradient: Optional[Gradient] = None - endWidth: Optional[float] = None - generateLightingData: Optional[bool] = None - m_EndColor: Optional[ColorRGBA] = None - m_StartColor: Optional[ColorRGBA] = None - numCapVertices: Optional[int] = None - numCornerVertices: Optional[int] = None - shadowBias: Optional[float] = None - startWidth: Optional[float] = None - textureMode: Optional[int] = None - textureScale: Optional[Vector2f] = None - widthCurve: Optional[AnimationCurve] = None - widthMultiplier: Optional[float] = None + alignment: Optional[int] = None + colorGradient: Optional[Gradient] = None + endWidth: Optional[float] = None + generateLightingData: Optional[bool] = None + m_EndColor: Optional[ColorRGBA] = None + m_StartColor: Optional[ColorRGBA] = None + numCapVertices: Optional[int] = None + numCornerVertices: Optional[int] = None + shadowBias: Optional[float] = None + startWidth: Optional[float] = None + textureMode: Optional[int] = None + textureScale: Optional[Vector2f] = None + widthCurve: Optional[AnimationCurve] = None + widthMultiplier: Optional[float] = None + + +@unitypy_define +class LodSelectionCurve: + m_LodBias: float + m_LodSlope: float + + +@unitypy_define +class LookupKey: + extension: str + hash: Hash128 @unitypy_define class Lumin: - depthFormat: int - enableGLCache: bool - frameTiming: int - glCacheMaxBlobSize: int - glCacheMaxFileSize: int + depthFormat: int + enableGLCache: bool + frameTiming: int + glCacheMaxBlobSize: int + glCacheMaxFileSize: int @unitypy_define class MaterialImportOutput: - baked: int - currentSettings: BuildTargetSettings + baked: int + currentSettings: BuildTargetSettings @unitypy_define class MaterialInstanceSettings: - buildTargetSettings: List[BuildTargetSettings] - inputs: List[InputImportSettings] - materialInformation: ProceduralMaterialInformation - materialProperties: UnityPropertySheet - name: str - prototypeName: str - textureParameters: List[InputImportSettings] - lightmapFlags: Optional[int] = None - renderQueue: Optional[int] = None - shader: Optional[PPtr[Shader]] = None - shaderKeywords: Optional[str] = None - shaderName: Optional[str] = None - textureAssignments: Optional[List[ProceduralTextureAssignment]] = None + buildTargetSettings: List[BuildTargetSettings] + inputs: List[InputImportSettings] + materialInformation: ProceduralMaterialInformation + materialProperties: UnityPropertySheet + name: str + prototypeName: str + textureParameters: List[InputImportSettings] + lightmapFlags: Optional[int] = None + renderQueue: Optional[int] = None + shader: Optional[PPtr[Shader]] = None + shaderKeywords: Optional[str] = None + shaderName: Optional[str] = None + textureAssignments: Optional[List[ProceduralTextureAssignment]] = None @unitypy_define class MatrixParameter: - m_ArraySize: int - m_Index: int - m_NameIndex: int - m_RowCount: int - m_Type: int + m_ArraySize: int + m_NameIndex: int + m_RowCount: int + m_Type: int + m_Index: Optional[int] = None + m_OffsetInConstantBuffer: Optional[int] = None @unitypy_define class MdFour: - md4_hash: bytes + md4_hash: bytes @unitypy_define class MeshBlendShape: - firstVertex: int - hasNormals: bool - hasTangents: bool - vertexCount: int - aabbMaxDelta: Optional[Vector3f] = None - aabbMinDelta: Optional[Vector3f] = None - name: Optional[str] = None + firstVertex: int + hasNormals: bool + hasTangents: bool + vertexCount: int + aabbMaxDelta: Optional[Vector3f] = None + aabbMinDelta: Optional[Vector3f] = None + name: Optional[str] = None @unitypy_define class MeshBlendShapeChannel: - frameCount: int - frameIndex: int - name: str - nameHash: int + frameCount: int + frameIndex: int + name: str + nameHash: int @unitypy_define class MeshBlendShapeVertex: - index: int - normal: Vector3f - tangent: Vector3f - vertex: Vector3f + index: int + normal: Vector3f + tangent: Vector3f + vertex: Vector3f + + +@unitypy_define +class MeshLodInfo: + m_LodSelectionCurve: LodSelectionCurve + m_NumLevels: int + m_SubMeshes: List[MeshLodSubMesh] + + +@unitypy_define +class MeshLodRange: + m_IndexCount: int + m_IndexStart: int + + +@unitypy_define +class MeshLodSubMesh: + m_Levels: List[MeshLodRange] + + +@unitypy_define +class Message: + m_Code: int + m_Location: SourceLocation + m_Severity: int + m_Text: Optional[str] = None @unitypy_define class MinMaxAABB: - m_Max: Vector3f - m_Min: Vector3f + m_Max: Vector3f + m_Min: Vector3f @unitypy_define class MinMaxCurve: - maxCurve: AnimationCurve - minCurve: AnimationCurve - minMaxState: int - scalar: float - minScalar: Optional[float] = None + maxCurve: AnimationCurve + minCurve: AnimationCurve + minMaxState: int + scalar: float + minScalar: Optional[float] = None @unitypy_define class MinMaxGradient: - maxColor: ColorRGBA - maxGradient: Union[GradientNEW, Gradient] - minColor: ColorRGBA - minGradient: Union[GradientNEW, Gradient] - minMaxState: int + maxColor: ColorRGBA + maxGradient: Union[Gradient, GradientNEW] + minColor: ColorRGBA + minGradient: Union[Gradient, GradientNEW] + minMaxState: int @unitypy_define class MipmapLimitSettings: - limitBias: int - limitBiasMode: int + limitBias: int + limitBiasMode: int @unitypy_define class Module: - dependencies: List[str] - name: str - strippable: bool - controlledByBuiltinPackage: Optional[bool] = None + dependencies: List[str] + name: str + strippable: bool + controlledByBuiltinPackage: Optional[bool] = None @unitypy_define class MonoAssemblyImporter(AssetImporter): - m_ExecutionOrder: List[Tuple[str, int]] - m_IconMap: List[Tuple[str, PPtr[Texture2D]]] - m_Name: str - m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None - m_NewHashIdentity: Optional[MdFour] = None - m_OldHashIdentity: Optional[MdFour] = None - m_UserData: Optional[str] = None + m_ExecutionOrder: List[Tuple[str, int]] + m_IconMap: List[Tuple[str, PPtr[Texture2D]]] + m_Name: str + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None @unitypy_define class MonoObject(ABC): - pass + pass @unitypy_define class MotionNeighborList: - m_NeighborArray: List[int] + m_NeighborArray: List[int] @unitypy_define class MultiModeParameter: - mode: int - speed: MinMaxCurve - spread: float - value: Optional[float] = None + mode: int + speed: MinMaxCurve + spread: float + value: Optional[float] = None @unitypy_define class NameToObjectMap: - m_ObjectToName: List[Tuple[PPtr[Shader], str]] + m_ObjectToName: List[Tuple[PPtr[Shader], str]] @unitypy_define class NativeType: - a: int - b: float - embedded: EmbeddedNativeType + a: int + b: float + embedded: EmbeddedNativeType @unitypy_define class NavMesh(NamedObject): - m_Heightmaps: List[HeightmapData] - m_MeshData: List[int] - m_Name: str + m_Heightmaps: List[HeightmapData] + m_MeshData: List[int] + m_Name: str @unitypy_define class NavMeshAreaData: - cost: float - name: str + cost: float + name: str @unitypy_define class NavMeshAreas(GlobalGameManager): - areas: List[NavMeshAreaData] + areas: List[NavMeshAreaData] @unitypy_define class NavMeshBuildDebugSettings: - m_Flags: int + m_Flags: int @unitypy_define class NavMeshBuildSettings: - agentClimb: float - agentHeight: float - agentRadius: float - agentSlope: float - agentTypeID: int - cellSize: float - ledgeDropHeight: float - manualCellSize: Union[bool, int] - manualTileSize: Union[bool, int] - maxJumpAcrossDistance: float - minRegionArea: float - tileSize: int - accuratePlacement: Optional[Union[bool, int]] = None - buildHeightMesh: Optional[int] = None - debug: Optional[NavMeshBuildDebugSettings] = None - keepTiles: Optional[int] = None - maxJobWorkers: Optional[int] = None - preserveTilesOutsideBounds: Optional[int] = None + agentClimb: float + agentHeight: float + agentRadius: float + agentSlope: float + agentTypeID: int + cellSize: float + ledgeDropHeight: float + manualCellSize: Union[bool, int] + manualTileSize: Union[bool, int] + maxJumpAcrossDistance: float + minRegionArea: float + tileSize: int + accuratePlacement: Optional[Union[bool, int]] = None + buildHeightMesh: Optional[int] = None + debug: Optional[NavMeshBuildDebugSettings] = None + keepTiles: Optional[int] = None + maxJobWorkers: Optional[int] = None + preserveTilesOutsideBounds: Optional[int] = None @unitypy_define class NavMeshLayerData: - cost: float - editType: int - name: str + cost: float + editType: int + name: str @unitypy_define class NavMeshLayers(GlobalGameManager): - Built_in_Layer_0: NavMeshLayerData - Built_in_Layer_1: NavMeshLayerData - Built_in_Layer_2: NavMeshLayerData - User_Layer_0: NavMeshLayerData - User_Layer_1: NavMeshLayerData - User_Layer_10: NavMeshLayerData - User_Layer_11: NavMeshLayerData - User_Layer_12: NavMeshLayerData - User_Layer_13: NavMeshLayerData - User_Layer_14: NavMeshLayerData - User_Layer_15: NavMeshLayerData - User_Layer_16: NavMeshLayerData - User_Layer_17: NavMeshLayerData - User_Layer_18: NavMeshLayerData - User_Layer_19: NavMeshLayerData - User_Layer_2: NavMeshLayerData - User_Layer_20: NavMeshLayerData - User_Layer_21: NavMeshLayerData - User_Layer_22: NavMeshLayerData - User_Layer_23: NavMeshLayerData - User_Layer_24: NavMeshLayerData - User_Layer_25: NavMeshLayerData - User_Layer_26: NavMeshLayerData - User_Layer_27: NavMeshLayerData - User_Layer_28: NavMeshLayerData - User_Layer_3: NavMeshLayerData - User_Layer_4: NavMeshLayerData - User_Layer_5: NavMeshLayerData - User_Layer_6: NavMeshLayerData - User_Layer_7: NavMeshLayerData - User_Layer_8: NavMeshLayerData - User_Layer_9: NavMeshLayerData + Built_in_Layer_0: NavMeshLayerData + Built_in_Layer_1: NavMeshLayerData + Built_in_Layer_2: NavMeshLayerData + User_Layer_0: NavMeshLayerData + User_Layer_1: NavMeshLayerData + User_Layer_10: NavMeshLayerData + User_Layer_11: NavMeshLayerData + User_Layer_12: NavMeshLayerData + User_Layer_13: NavMeshLayerData + User_Layer_14: NavMeshLayerData + User_Layer_15: NavMeshLayerData + User_Layer_16: NavMeshLayerData + User_Layer_17: NavMeshLayerData + User_Layer_18: NavMeshLayerData + User_Layer_19: NavMeshLayerData + User_Layer_2: NavMeshLayerData + User_Layer_20: NavMeshLayerData + User_Layer_21: NavMeshLayerData + User_Layer_22: NavMeshLayerData + User_Layer_23: NavMeshLayerData + User_Layer_24: NavMeshLayerData + User_Layer_25: NavMeshLayerData + User_Layer_26: NavMeshLayerData + User_Layer_27: NavMeshLayerData + User_Layer_28: NavMeshLayerData + User_Layer_3: NavMeshLayerData + User_Layer_4: NavMeshLayerData + User_Layer_5: NavMeshLayerData + User_Layer_6: NavMeshLayerData + User_Layer_7: NavMeshLayerData + User_Layer_8: NavMeshLayerData + User_Layer_9: NavMeshLayerData @unitypy_define class NavMeshParams: - cellSize: float - tileSize: float - walkableClimb: float - walkableHeight: float - walkableRadius: float + cellSize: float + tileSize: float + walkableClimb: float + walkableHeight: float + walkableRadius: float @unitypy_define class NavMeshTileData: - m_MeshData: List[int] - m_Hash: Optional[Hash128] = None + m_MeshData: List[int] + m_Hash: Optional[Hash128] = None @unitypy_define class NetworkViewID: - m_ID: int - m_Type: int + m_ID: int + m_Type: int @unitypy_define class Node: - m_AxesId: int - m_ParentId: int + m_AxesId: int + m_ParentId: int @unitypy_define class NoiseModule: - damping: bool - enabled: bool - frequency: float - octaveMultiplier: float - octaveScale: float - octaves: int - quality: int - remap: MinMaxCurve - remapEnabled: bool - remapY: MinMaxCurve - remapZ: MinMaxCurve - scrollSpeed: MinMaxCurve - separateAxes: bool - strength: MinMaxCurve - strengthY: MinMaxCurve - strengthZ: MinMaxCurve - positionAmount: Optional[MinMaxCurve] = None - rotationAmount: Optional[MinMaxCurve] = None - sizeAmount: Optional[MinMaxCurve] = None + damping: bool + enabled: bool + frequency: float + octaveMultiplier: float + octaveScale: float + octaves: int + quality: int + remap: MinMaxCurve + remapEnabled: bool + remapY: MinMaxCurve + remapZ: MinMaxCurve + scrollSpeed: MinMaxCurve + separateAxes: bool + strength: MinMaxCurve + strengthY: MinMaxCurve + strengthZ: MinMaxCurve + positionAmount: Optional[MinMaxCurve] = None + rotationAmount: Optional[MinMaxCurve] = None + sizeAmount: Optional[MinMaxCurve] = None @unitypy_define class NonAlignedStruct: - m_Bool: bool + m_Bool: bool @unitypy_define class ObjectRolePair: - m_Object: PPtr[Object] - m_RolesMask: int + m_Object: PPtr[Object] + m_RolesMask: int @unitypy_define class OcclusionScene: - indexPortals: int - indexRenderers: int - scene: GUID - sizePortals: int - sizeRenderers: int + indexPortals: int + indexRenderers: int + scene: GUID + sizePortals: int + sizeRenderers: int @unitypy_define class Oculus: - dashSupport: bool - sharedDepthBuffer: bool - lowOverheadMode: Optional[bool] = None - protectedContext: Optional[bool] = None - v2Signing: Optional[bool] = None + dashSupport: bool + sharedDepthBuffer: bool + lowOverheadMode: Optional[bool] = None + protectedContext: Optional[bool] = None + v2Signing: Optional[bool] = None @unitypy_define class OffsetPtr: - data: Union[ - SkeletonMask, - SkeletonPose, - Blend2dDataConstant, - Blend1dDataConstant, - BlendTreeConstant, - Skeleton, - Clip, - SelectorTransitionConstant, - LayerConstant, - ValueArray, - SelectorStateConstant, - ConditionConstant, - Human, - HumanLayerConstant, - Hand, - StateConstant, - StateMachineConstant, - BlendTreeNodeConstant, - BlendDirectDataConstant, - ValueArrayConstant, - TransitionConstant, - ] + data: Union[Blend1dDataConstant, Blend2dDataConstant, BlendDirectDataConstant, BlendTreeConstant, BlendTreeNodeConstant, Clip, ConditionConstant, Hand, Human, HumanLayerConstant, LayerConstant, SelectorStateConstant, SelectorTransitionConstant, Skeleton, SkeletonMask, SkeletonPose, StateConstant, StateMachineConstant, TransitionConstant, ValueArray, ValueArrayConstant] @unitypy_define class Output: - hasEmptyFontData: Optional[bool] = None - importedType: Optional[int] = None - previewData: Optional[List[float]] = None + hasEmptyFontData: Optional[bool] = None + importedType: Optional[int] = None + previewData: Optional[List[float]] = None @unitypy_define class PPtrCurve: - attribute: str - classID: int - curve: List[PPtrKeyframe] - path: str - script: PPtr[MonoScript] - flags: Optional[int] = None + attribute: str + classID: int + curve: List[PPtrKeyframe] + path: str + script: PPtr[MonoScript] + flags: Optional[int] = None @unitypy_define class PPtrKeyframe: - time: float - value: PPtr[Object] + time: float + value: PPtr[Object] @unitypy_define class PackedBitVector: - m_Data: List[int] - m_NumItems: int - m_BitSize: Optional[int] = None - m_Range: Optional[float] = None - m_Start: Optional[float] = None + m_Data: List[int] + m_NumItems: int + m_BitSize: Optional[int] = None + m_Range: Optional[float] = None + m_Start: Optional[float] = None @unitypy_define class PackingSettings: - allowAlphaSplitting: bool - blockOffset: int - enableRotation: bool - enableTightPacking: bool - padding: int - enableAlphaDilation: Optional[bool] = None + allowAlphaSplitting: bool + blockOffset: int + enableRotation: bool + enableTightPacking: bool + padding: int + enableAlphaDilation: Optional[bool] = None @unitypy_define class Parameter: - m_GUID: GUID - m_ParameterName: str + m_GUID: GUID + m_ParameterName: str @unitypy_define class ParserBindChannels: - m_Channels: List[ShaderBindChannel] - m_SourceMap: int + m_Channels: List[ShaderBindChannel] + m_SourceMap: int @unitypy_define class ParticleSystemEmissionBurst: - cycleCount: int - repeatInterval: float - time: float - countCurve: Optional[MinMaxCurve] = None - maxCount: Optional[int] = None - minCount: Optional[int] = None - probability: Optional[float] = None + cycleCount: int + repeatInterval: float + time: float + countCurve: Optional[MinMaxCurve] = None + maxCount: Optional[int] = None + minCount: Optional[int] = None + probability: Optional[float] = None @unitypy_define class ParticleSystemForceFieldParameters: - m_DirectionCurveX: MinMaxCurve - m_DirectionCurveY: MinMaxCurve - m_DirectionCurveZ: MinMaxCurve - m_DragCurve: MinMaxCurve - m_EndRange: float - m_GravityCurve: MinMaxCurve - m_GravityFocus: float - m_Length: float - m_MultiplyDragByParticleSize: bool - m_MultiplyDragByParticleVelocity: bool - m_RotationAttractionCurve: MinMaxCurve - m_RotationRandomness: Vector2f - m_RotationSpeedCurve: MinMaxCurve - m_Shape: int - m_StartRange: float - m_VectorField: PPtr[Texture3D] - m_VectorFieldAttractionCurve: MinMaxCurve - m_VectorFieldSpeedCurve: MinMaxCurve + m_DirectionCurveX: MinMaxCurve + m_DirectionCurveY: MinMaxCurve + m_DirectionCurveZ: MinMaxCurve + m_DragCurve: MinMaxCurve + m_EndRange: float + m_GravityCurve: MinMaxCurve + m_GravityFocus: float + m_Length: float + m_MultiplyDragByParticleSize: bool + m_MultiplyDragByParticleVelocity: bool + m_RotationAttractionCurve: MinMaxCurve + m_RotationRandomness: Vector2f + m_RotationSpeedCurve: MinMaxCurve + m_Shape: int + m_StartRange: float + m_VectorField: PPtr[Texture3D] + m_VectorFieldAttractionCurve: MinMaxCurve + m_VectorFieldSpeedCurve: MinMaxCurve @unitypy_define class PerLODSettings: - castShadows: bool - enableBump: bool - enableHue: bool - height: float - receiveShadows: bool - reflectionProbeUsage: int - useLightProbes: bool - windQuality: int - enableSettingOverride: Optional[bool] = None - enableSubsurface: Optional[bool] = None + castShadows: bool + enableBump: bool + enableHue: bool + height: float + receiveShadows: bool + reflectionProbeUsage: int + useLightProbes: bool + windQuality: int + enableSettingOverride: Optional[bool] = None + enableSubsurface: Optional[bool] = None @unitypy_define class PerformanceReportingSettings: - m_Enabled: bool + m_Enabled: bool @unitypy_define class PhysicMaterial(NamedObject): - bounceCombine: int - bounciness: float - dynamicFriction: float - frictionCombine: int - m_Name: str - staticFriction: float - dynamicFriction2: Optional[float] = None - frictionDirection2: Optional[Vector3f] = None - staticFriction2: Optional[float] = None + bounceCombine: int + bounciness: float + dynamicFriction: float + frictionCombine: int + m_Name: str + staticFriction: float + dynamicFriction2: Optional[float] = None + frictionDirection2: Optional[Vector3f] = None + staticFriction2: Optional[float] = None @unitypy_define class PhysicsJobOptions2D: - m_ClearBodyForcesPerJob: int - m_ClearFlagsPerJob: int - m_CollideContactsPerJob: int - m_FindNearestContactsPerJob: int - m_InterpolationPosesPerJob: int - m_IslandSolverBodiesPerJob: int - m_IslandSolverBodyCostScale: int - m_IslandSolverContactCostScale: int - m_IslandSolverContactsPerJob: int - m_IslandSolverCostThreshold: int - m_IslandSolverJointCostScale: int - m_NewContactsPerJob: int - m_SyncContinuousFixturesPerJob: int - m_SyncDiscreteFixturesPerJob: int - m_UpdateTriggerContactsPerJob: int - m_UseConsistencySorting: Optional[bool] = None - m_UseMultithreading: Optional[bool] = None - useConsistencySorting: Optional[bool] = None - useMultithreading: Optional[bool] = None + m_ClearBodyForcesPerJob: int + m_ClearFlagsPerJob: int + m_CollideContactsPerJob: int + m_FindNearestContactsPerJob: int + m_InterpolationPosesPerJob: int + m_IslandSolverBodiesPerJob: int + m_IslandSolverBodyCostScale: int + m_IslandSolverContactCostScale: int + m_IslandSolverContactsPerJob: int + m_IslandSolverCostThreshold: int + m_IslandSolverJointCostScale: int + m_NewContactsPerJob: int + m_SyncContinuousFixturesPerJob: int + m_SyncDiscreteFixturesPerJob: int + m_UpdateTriggerContactsPerJob: int + m_UseConsistencySorting: Optional[bool] = None + m_UseMultithreading: Optional[bool] = None + useConsistencySorting: Optional[bool] = None + useMultithreading: Optional[bool] = None @unitypy_define class PhysicsShape: - m_AdjacentEnd: Vector2f - m_AdjacentStart: Vector2f - m_Radius: float - m_ShapeType: int - m_UseAdjacentEnd: int - m_UseAdjacentStart: int - m_VertexCount: int - m_VertexStartIndex: int + m_AdjacentEnd: Vector2f + m_AdjacentStart: Vector2f + m_Radius: float + m_ShapeType: int + m_UseAdjacentEnd: int + m_UseAdjacentStart: int + m_VertexCount: int + m_VertexStartIndex: int @unitypy_define class PhysicsShapeGroup2D: - m_Shapes: List[PhysicsShape] - m_Vertices: List[Vector2f] + m_Shapes: List[PhysicsShape] + m_Vertices: List[Vector2f] @unitypy_define class PlatformSettings: - m_AllowsAlphaSplitting: bool - m_BuildTarget: str - m_CompressionQuality: int - m_CrunchedCompression: bool - m_MaxTextureSize: int - m_Overridden: bool - m_TextureCompression: int - m_TextureFormat: int - m_ResizeAlgorithm: Optional[int] = None + m_AllowsAlphaSplitting: bool + m_BuildTarget: str + m_CompressionQuality: int + m_CrunchedCompression: bool + m_MaxTextureSize: int + m_Overridden: bool + m_TextureCompression: int + m_TextureFormat: int + m_ResizeAlgorithm: Optional[int] = None @unitypy_define class PlatformSettingsData: - settings: List[Tuple[str, str]] - enabled: Optional[bool] = None + settings: List[Tuple[str, str]] + enabled: Optional[bool] = None @unitypy_define class PlatformShaderDefines: - defines_Tier1: List[int] - defines_Tier2: List[int] - defines_Tier3: List[int] - shaderPlatform: int + defines_Tier1: List[int] + defines_Tier2: List[int] + defines_Tier3: List[int] + shaderPlatform: int @unitypy_define class PlatformShaderSettings: - useCascadedShadowMaps: Optional[bool] = None - useScreenSpaceShadows: Optional[bool] = None + useCascadedShadowMaps: Optional[bool] = None + useScreenSpaceShadows: Optional[bool] = None @unitypy_define class PluginImportOutput: - dllType: Optional[int] = None - pluginType: Optional[int] = None - scriptingRuntimeVersion: Optional[int] = None + dllType: Optional[int] = None + pluginType: Optional[int] = None + scriptingRuntimeVersion: Optional[int] = None @unitypy_define class Polygon2D(ABC): - m_Paths: Optional[List[List[Vector2f]]] = None + m_Paths: Optional[List[List[Vector2f]]] = None @unitypy_define class PrefabModification: - m_Modifications: List[PropertyModification] - m_RemovedComponents: Union[List[PPtr[Object]], List[PPtr[Component]]] - m_TransformParent: PPtr[Transform] - m_AddedComponents: Optional[List[AddedComponent]] = None - m_AddedGameObjects: Optional[List[AddedGameObject]] = None - m_RemovedGameObjects: Optional[List[PPtr[GameObject]]] = None + m_Modifications: List[PropertyModification] + m_RemovedComponents: Union[List[PPtr[Component]], List[PPtr[Object]]] + m_TransformParent: PPtr[Transform] + m_AddedComponents: Optional[List[AddedComponent]] = None + m_AddedGameObjects: Optional[List[AddedGameObject]] = None + m_RemovedGameObjects: Optional[List[PPtr[GameObject]]] = None @unitypy_define class PresetType: - m_ManagedTypeFallback: str - m_ManagedTypePPtr: PPtr[MonoScript] - m_NativeTypeID: int + m_ManagedTypeFallback: str + m_ManagedTypePPtr: PPtr[MonoScript] + m_NativeTypeID: int @unitypy_define class PreviewData: - m_CompSize: int - m_OrigSize: int - m_PreviewData: List[float] + m_CompSize: int + m_OrigSize: int + m_PreviewData: List[float] @unitypy_define class ProbeSetIndex: - m_Hash: Hash128 - m_Offset: int - m_Size: int + m_Hash: Hash128 + m_Offset: int + m_Size: int @unitypy_define class ProbeSetTetrahedralization: - m_HullRays: List[Vector3f] - m_Tetrahedra: List[Tetrahedron] + m_HullRays: List[Vector3f] + m_Tetrahedra: List[Tetrahedron] @unitypy_define class ProceduralMaterialInformation: - m_Offset: Vector2f - m_Scale: Vector2f - m_AnimationUpdateRate: Optional[int] = None - m_GenerateAllOutputs: Optional[int] = None - m_GenerateMipmaps: Optional[bool] = None - m_GeneratedAtLoading: Optional[int] = None + m_Offset: Vector2f + m_Scale: Vector2f + m_AnimationUpdateRate: Optional[int] = None + m_GenerateAllOutputs: Optional[int] = None + m_GenerateMipmaps: Optional[bool] = None + m_GeneratedAtLoading: Optional[int] = None @unitypy_define class ProceduralTextureAssignment: - baseUID: int - material: PPtr[ProceduralMaterial] - shaderProp: Union[FastPropertyName, str] + baseUID: int + material: PPtr[ProceduralMaterial] + shaderProp: Union[FastPropertyName, str] + + +@unitypy_define +class ProgramParameters: + m_BufferParams: List[BufferBindingParameter] + m_ConstantBufferBindings: List[BufferBindingParameter] + m_ConstantBuffers: List[ConstantBufferParameter] + m_Samplers: List[SamplerParameter] + m_TextureParams: List[TextureParameter] + m_UAVParams: List[UAVParameter] + m_MatrixParams: Optional[List[MatrixParameter]] = None + m_SpecializationConstantParams: Optional[List[SpecializationConstantParameter]] = None + m_VectorParams: Optional[List[VectorParameter]] = None @unitypy_define class PropertyModification: - objectReference: PPtr[Object] - propertyPath: str - target: PPtr[Object] - value: str + objectReference: PPtr[Object] + propertyPath: str + target: PPtr[Object] + value: str @unitypy_define class PropertyModificationsTargetTestNativeObject: - m_FloatValue: float - m_IntegerValue: int + m_FloatValue: float + m_IntegerValue: int @unitypy_define class QualitySetting: - anisotropicTextures: int - antiAliasing: int - pixelLightCount: int - shadowCascades: int - shadowDistance: float - shadowProjection: int - shadowResolution: int - shadows: int - softParticles: bool - softVegetation: bool - vSyncCount: int - adaptiveVsync: Optional[bool] = None - adaptiveVsyncExtraA: Optional[int] = None - adaptiveVsyncExtraB: Optional[int] = None - asyncUploadBufferSize: Optional[int] = None - asyncUploadPersistentBuffer: Optional[bool] = None - asyncUploadTimeSlice: Optional[int] = None - billboardsFaceCameraPosition: Optional[bool] = None - blendWeights: Optional[int] = None - customRenderPipeline: Optional[PPtr[MonoBehaviour]] = None - enableLODCrossFade: Optional[bool] = None - globalTextureMipmapLimit: Optional[int] = None - lodBias: Optional[float] = None - maximumLODLevel: Optional[int] = None - name: Optional[str] = None - particleRaycastBudget: Optional[int] = None - realtimeGICPUUsage: Optional[int] = None - realtimeReflectionProbes: Optional[bool] = None - resolutionScalingFixedDPIFactor: Optional[float] = None - shadowCascade2Split: Optional[float] = None - shadowCascade4Split: Optional[Vector3f] = None - shadowNearPlaneOffset: Optional[float] = None - shadowmaskMode: Optional[int] = None - skinWeights: Optional[int] = None - streamingMipmapsActive: Optional[bool] = None - streamingMipmapsAddAllCameras: Optional[bool] = None - streamingMipmapsMaxFileIORequests: Optional[int] = None - streamingMipmapsMaxLevelReduction: Optional[int] = None - streamingMipmapsMemoryBudget: Optional[float] = None - streamingMipmapsRenderersPerFrame: Optional[int] = None - terrainBasemapDistance: Optional[float] = None - terrainBillboardStart: Optional[float] = None - terrainDetailDensityScale: Optional[float] = None - terrainDetailDistance: Optional[float] = None - terrainFadeLength: Optional[float] = None - terrainMaxTrees: Optional[int] = None - terrainPixelError: Optional[float] = None - terrainQualityOverrides: Optional[int] = None - terrainTreeDistance: Optional[float] = None - textureMipmapLimitSettings: Optional[List[MipmapLimitSettings]] = None - textureQuality: Optional[int] = None - useLegacyDetailDistribution: Optional[bool] = None + anisotropicTextures: int + antiAliasing: int + pixelLightCount: int + shadowCascades: int + shadowDistance: float + shadowProjection: int + shadowResolution: int + shadows: int + softParticles: bool + softVegetation: bool + vSyncCount: int + adaptiveVsync: Optional[bool] = None + adaptiveVsyncExtraA: Optional[int] = None + adaptiveVsyncExtraB: Optional[int] = None + asyncUploadBufferSize: Optional[int] = None + asyncUploadPersistentBuffer: Optional[bool] = None + asyncUploadTimeSlice: Optional[int] = None + billboardsFaceCameraPosition: Optional[bool] = None + blendWeights: Optional[int] = None + customRenderPipeline: Optional[PPtr[MonoBehaviour]] = None + enableLODCrossFade: Optional[bool] = None + globalTextureMipmapLimit: Optional[int] = None + lodBias: Optional[float] = None + maximumLODLevel: Optional[int] = None + meshLodThreshold: Optional[float] = None + name: Optional[str] = None + particleRaycastBudget: Optional[int] = None + realtimeGICPUUsage: Optional[int] = None + realtimeReflectionProbes: Optional[bool] = None + resolutionScalingFixedDPIFactor: Optional[float] = None + shadowCascade2Split: Optional[float] = None + shadowCascade4Split: Optional[Vector3f] = None + shadowNearPlaneOffset: Optional[float] = None + shadowmaskMode: Optional[int] = None + skinWeights: Optional[int] = None + streamingMipmapsActive: Optional[bool] = None + streamingMipmapsAddAllCameras: Optional[bool] = None + streamingMipmapsMaxFileIORequests: Optional[int] = None + streamingMipmapsMaxLevelReduction: Optional[int] = None + streamingMipmapsMemoryBudget: Optional[float] = None + streamingMipmapsRenderersPerFrame: Optional[int] = None + terrainBasemapDistance: Optional[float] = None + terrainBillboardStart: Optional[float] = None + terrainDetailDensityScale: Optional[float] = None + terrainDetailDistance: Optional[float] = None + terrainFadeLength: Optional[float] = None + terrainMaxTrees: Optional[int] = None + terrainPixelError: Optional[float] = None + terrainQualityOverrides: Optional[int] = None + terrainTreeDistance: Optional[float] = None + textureMipmapLimitSettings: Optional[List[MipmapLimitSettings]] = None + textureQuality: Optional[int] = None + useLegacyDetailDistribution: Optional[bool] = None @unitypy_define class QuaternionCurve: - curve: AnimationCurve - path: str + curve: AnimationCurve + path: str @unitypy_define class RationalTime: - m_Count: int - m_Rate: TicksPerSecond + m_Count: int + m_Rate: TicksPerSecond @unitypy_define class RayTracingShaderBuiltinSampler: - bindPoint: int - sampler: int + bindPoint: int + sampler: int @unitypy_define class RayTracingShaderConstantBuffer: - byteSize: int - name: str - params: List[RayTracingShaderParam] - hash: Optional[int] = None + byteSize: int + name: str + params: List[RayTracingShaderParam] + hash: Optional[int] = None @unitypy_define class RayTracingShaderFunctionDesc: - attributeSizeInBytes: int - identifier: RayTracingShaderID - payloadSizeInBytes: int + attributeSizeInBytes: int + identifier: RayTracingShaderID + payloadSizeInBytes: int @unitypy_define class RayTracingShaderID: - name: str - type: int + name: str + type: int @unitypy_define class RayTracingShaderParam: - arraySize: int - colCount: int - name: str - offset: int - rowCount: int - dataSize: Optional[int] = None - dataType: Optional[int] = None - propertySheetType: Optional[int] = None - type: Optional[int] = None + arraySize: int + colCount: int + name: str + offset: int + rowCount: int + dataSize: Optional[int] = None + dataType: Optional[int] = None + propertySheetType: Optional[int] = None + type: Optional[int] = None + + +@unitypy_define +class RayTracingShaderPlatformVariant: + dynamicKeywords: List[str] + editorOnlyVariant: bool + globalKeywords: List[str] + localKeywords: List[str] + targetRenderer: int + uniqueVariants: List[RayTracingShaderReflectionData] + variantIndices: List[Tuple[str, int]] @unitypy_define class RayTracingShaderReflectionData: - code: List[int] - functions: List[RayTracingShaderFunctionDesc] - globalResources: RayTracingShaderResources - hasErrors: bool - localResources: RayTracingShaderResources - precompiled: Optional[List[int]] = None - requirements: Optional[int] = None + code: List[int] + functions: List[RayTracingShaderFunctionDesc] + globalResources: RayTracingShaderResources + hasErrors: bool + localResources: RayTracingShaderResources + codeHash: Optional[int] = None + precompiled: Optional[List[int]] = None + requirements: Optional[int] = None @unitypy_define class RayTracingShaderResource: - bindPoint: int - name: str - rayGenMask: int - samplerBindPoint: int - texDimension: int - arraySize: Optional[int] = None - multisampled: Optional[bool] = None + bindPoint: int + name: str + rayGenMask: int + samplerBindPoint: int + texDimension: int + arraySize: Optional[int] = None + multisampled: Optional[bool] = None + resType: Optional[int] = None @unitypy_define class RayTracingShaderResources: - builtinSamplers: List[RayTracingShaderBuiltinSampler] - constantBuffers: List[RayTracingShaderResource] - constantBuffersDesc: List[RayTracingShaderConstantBuffer] - inputBuffers: List[RayTracingShaderResource] - outputBuffers: List[RayTracingShaderResource] - textures: List[RayTracingShaderResource] + builtinSamplers: List[RayTracingShaderBuiltinSampler] + constantBuffers: List[RayTracingShaderResource] + constantBuffersDesc: List[RayTracingShaderConstantBuffer] + inputBuffers: List[RayTracingShaderResource] + outputBuffers: List[RayTracingShaderResource] + textures: List[RayTracingShaderResource] @unitypy_define class RayTracingShaderVariant: - resourceReflectionData: RayTracingShaderReflectionData - targetRenderer: int + resourceReflectionData: RayTracingShaderReflectionData + targetRenderer: int + editorOnlyVariant: Optional[bool] = None @unitypy_define class Rectf: - height: float - width: float - x: float - y: float + height: float + width: float + x: float + y: float + + +@unitypy_define +class ReflectedFunction: + m_Hints: List[Hint] + m_Name: str + m_Parameters: List[ReflectedParameter] + m_ReturnTypeName: str + m_Body: Optional[str] = None + m_Namespace: Optional[List[str]] = None + + +@unitypy_define +class ReflectedParameter: + m_Direction: int + m_Hints: List[Hint] + m_Name: str + m_TypeName: str @unitypy_define class RenderManager(GlobalGameManager): - pass + pass @unitypy_define class RenderPassInfo: - attachmentCount: int - attachments: List[AttachmentInfo] - depthAttachmentIndex: int - multiviewCount: int - sampleCount: int - shadingRateIndex: int - subPassCount: int - subPasses: List[SubPassDescriptor] + attachmentCount: int + attachments: List[AttachmentInfo] + depthAttachmentIndex: int + multiviewCount: int + sampleCount: int + shadingRateIndex: int + subPassCount: int + subPasses: List[SubPassDescriptor] + foveationImageIndex: Optional[int] = None + hasEyeTexture: Optional[bool] = None @unitypy_define class RenderStateBlock: - blendState: GfxBlendState - depthState: GfxDepthState - mask: int - rasterState: GfxRasterState - stencilRef: int - stencilState: GfxStencilState + blendState: GfxBlendState + depthState: GfxDepthState + mask: int + rasterState: GfxRasterState + stencilRef: int + stencilState: GfxStencilState @unitypy_define class RenderStateInfo: - renderState: RenderStateBlock + renderState: RenderStateBlock @unitypy_define class RendererData: - lightmapIndex: int - lightmapIndexDynamic: int - lightmapST: Vector4f - lightmapSTDynamic: Vector4f - terrainChunkDynamicUVST: Vector4f - terrainDynamicUVST: Vector4f - uvMesh: PPtr[Mesh] - explicitProbeSetHash: Optional[Hash128] = None + lightmapIndex: int + lightmapIndexDynamic: int + lightmapST: Vector4f + lightmapSTDynamic: Vector4f + terrainChunkDynamicUVST: Vector4f + terrainDynamicUVST: Vector4f + uvMesh: PPtr[Mesh] + explicitProbeSetHash: Optional[Hash128] = None @unitypy_define class ResourceManager_Dependency: - m_Dependencies: List[PPtr[Object]] - m_Object: PPtr[Object] + m_Dependencies: List[PPtr[Object]] + m_Object: PPtr[Object] @unitypy_define class RippleGroup: - m_afDirectional_0: float - m_afDirectional_1: float - m_afDirectional_10: float - m_afDirectional_11: float - m_afDirectional_12: float - m_afDirectional_13: float - m_afDirectional_14: float - m_afDirectional_15: float - m_afDirectional_16: float - m_afDirectional_17: float - m_afDirectional_18: float - m_afDirectional_19: float - m_afDirectional_2: float - m_afDirectional_3: float - m_afDirectional_4: float - m_afDirectional_5: float - m_afDirectional_6: float - m_afDirectional_7: float - m_afDirectional_8: float - m_afDirectional_9: float - m_afFlexibility_0: float - m_afFlexibility_1: float - m_afFlexibility_10: float - m_afFlexibility_11: float - m_afFlexibility_12: float - m_afFlexibility_13: float - m_afFlexibility_14: float - m_afFlexibility_15: float - m_afFlexibility_16: float - m_afFlexibility_17: float - m_afFlexibility_18: float - m_afFlexibility_19: float - m_afFlexibility_2: float - m_afFlexibility_3: float - m_afFlexibility_4: float - m_afFlexibility_5: float - m_afFlexibility_6: float - m_afFlexibility_7: float - m_afFlexibility_8: float - m_afFlexibility_9: float - m_afPlanar_0: float - m_afPlanar_1: float - m_afPlanar_10: float - m_afPlanar_11: float - m_afPlanar_12: float - m_afPlanar_13: float - m_afPlanar_14: float - m_afPlanar_15: float - m_afPlanar_16: float - m_afPlanar_17: float - m_afPlanar_18: float - m_afPlanar_19: float - m_afPlanar_2: float - m_afPlanar_3: float - m_afPlanar_4: float - m_afPlanar_5: float - m_afPlanar_6: float - m_afPlanar_7: float - m_afPlanar_8: float - m_afPlanar_9: float - m_afSpeed_0: float - m_afSpeed_1: float - m_afSpeed_10: float - m_afSpeed_11: float - m_afSpeed_12: float - m_afSpeed_13: float - m_afSpeed_14: float - m_afSpeed_15: float - m_afSpeed_16: float - m_afSpeed_17: float - m_afSpeed_18: float - m_afSpeed_19: float - m_afSpeed_2: float - m_afSpeed_3: float - m_afSpeed_4: float - m_afSpeed_5: float - m_afSpeed_6: float - m_afSpeed_7: float - m_afSpeed_8: float - m_afSpeed_9: float - m_fIndependence: float - m_fShimmer: float + m_afDirectional_0: float + m_afDirectional_1: float + m_afDirectional_10: float + m_afDirectional_11: float + m_afDirectional_12: float + m_afDirectional_13: float + m_afDirectional_14: float + m_afDirectional_15: float + m_afDirectional_16: float + m_afDirectional_17: float + m_afDirectional_18: float + m_afDirectional_19: float + m_afDirectional_2: float + m_afDirectional_3: float + m_afDirectional_4: float + m_afDirectional_5: float + m_afDirectional_6: float + m_afDirectional_7: float + m_afDirectional_8: float + m_afDirectional_9: float + m_afFlexibility_0: float + m_afFlexibility_1: float + m_afFlexibility_10: float + m_afFlexibility_11: float + m_afFlexibility_12: float + m_afFlexibility_13: float + m_afFlexibility_14: float + m_afFlexibility_15: float + m_afFlexibility_16: float + m_afFlexibility_17: float + m_afFlexibility_18: float + m_afFlexibility_19: float + m_afFlexibility_2: float + m_afFlexibility_3: float + m_afFlexibility_4: float + m_afFlexibility_5: float + m_afFlexibility_6: float + m_afFlexibility_7: float + m_afFlexibility_8: float + m_afFlexibility_9: float + m_afPlanar_0: float + m_afPlanar_1: float + m_afPlanar_10: float + m_afPlanar_11: float + m_afPlanar_12: float + m_afPlanar_13: float + m_afPlanar_14: float + m_afPlanar_15: float + m_afPlanar_16: float + m_afPlanar_17: float + m_afPlanar_18: float + m_afPlanar_19: float + m_afPlanar_2: float + m_afPlanar_3: float + m_afPlanar_4: float + m_afPlanar_5: float + m_afPlanar_6: float + m_afPlanar_7: float + m_afPlanar_8: float + m_afPlanar_9: float + m_afSpeed_0: float + m_afSpeed_1: float + m_afSpeed_10: float + m_afSpeed_11: float + m_afSpeed_12: float + m_afSpeed_13: float + m_afSpeed_14: float + m_afSpeed_15: float + m_afSpeed_16: float + m_afSpeed_17: float + m_afSpeed_18: float + m_afSpeed_19: float + m_afSpeed_2: float + m_afSpeed_3: float + m_afSpeed_4: float + m_afSpeed_5: float + m_afSpeed_6: float + m_afSpeed_7: float + m_afSpeed_8: float + m_afSpeed_9: float + m_fIndependence: float + m_fShimmer: float @unitypy_define class RootMotionData(ABC): - pass + pass @unitypy_define class RotationBySpeedModule: - curve: MinMaxCurve - enabled: bool - range: Vector2f - separateAxes: Optional[bool] = None - x: Optional[MinMaxCurve] = None - y: Optional[MinMaxCurve] = None + curve: MinMaxCurve + enabled: bool + range: Vector2f + separateAxes: Optional[bool] = None + x: Optional[MinMaxCurve] = None + y: Optional[MinMaxCurve] = None @unitypy_define class RotationModule: - curve: MinMaxCurve - enabled: bool - separateAxes: Optional[bool] = None - x: Optional[MinMaxCurve] = None - y: Optional[MinMaxCurve] = None + curve: MinMaxCurve + enabled: bool + separateAxes: Optional[bool] = None + x: Optional[MinMaxCurve] = None + y: Optional[MinMaxCurve] = None @unitypy_define class SBranchWindLevel: - m_afDirectionAdherence_0: float - m_afDirectionAdherence_1: float - m_afDirectionAdherence_2: float - m_afDirectionAdherence_3: float - m_afDirectionAdherence_4: float - m_afDirectionAdherence_5: float - m_afDirectionAdherence_6: float - m_afDirectionAdherence_7: float - m_afDirectionAdherence_8: float - m_afDirectionAdherence_9: float - m_afDistance_0: float - m_afDistance_1: float - m_afDistance_2: float - m_afDistance_3: float - m_afDistance_4: float - m_afDistance_5: float - m_afDistance_6: float - m_afDistance_7: float - m_afDistance_8: float - m_afDistance_9: float - m_afWhip_0: float - m_afWhip_1: float - m_afWhip_2: float - m_afWhip_3: float - m_afWhip_4: float - m_afWhip_5: float - m_afWhip_6: float - m_afWhip_7: float - m_afWhip_8: float - m_afWhip_9: float - m_fTurbulence: float - m_fTwitch: float - m_fTwitchFreqScale: float + m_afDirectionAdherence_0: float + m_afDirectionAdherence_1: float + m_afDirectionAdherence_2: float + m_afDirectionAdherence_3: float + m_afDirectionAdherence_4: float + m_afDirectionAdherence_5: float + m_afDirectionAdherence_6: float + m_afDirectionAdherence_7: float + m_afDirectionAdherence_8: float + m_afDirectionAdherence_9: float + m_afDistance_0: float + m_afDistance_1: float + m_afDistance_2: float + m_afDistance_3: float + m_afDistance_4: float + m_afDistance_5: float + m_afDistance_6: float + m_afDistance_7: float + m_afDistance_8: float + m_afDistance_9: float + m_afWhip_0: float + m_afWhip_1: float + m_afWhip_2: float + m_afWhip_3: float + m_afWhip_4: float + m_afWhip_5: float + m_afWhip_6: float + m_afWhip_7: float + m_afWhip_8: float + m_afWhip_9: float + m_fTurbulence: float + m_fTwitch: float + m_fTwitchFreqScale: float @unitypy_define class SParams: - BranchLevel1: SBranchWindLevel - BranchLevel2: SBranchWindLevel - LeafGroup1: SWindGroup - LeafGroup2: SWindGroup - Oscillation0_0: float - Oscillation0_1: float - Oscillation0_2: float - Oscillation0_3: float - Oscillation0_4: float - Oscillation0_5: float - Oscillation0_6: float - Oscillation0_7: float - Oscillation0_8: float - Oscillation0_9: float - Oscillation1_0: float - Oscillation1_1: float - Oscillation1_2: float - Oscillation1_3: float - Oscillation1_4: float - Oscillation1_5: float - Oscillation1_6: float - Oscillation1_7: float - Oscillation1_8: float - Oscillation1_9: float - Oscillation2_0: float - Oscillation2_1: float - Oscillation2_2: float - Oscillation2_3: float - Oscillation2_4: float - Oscillation2_5: float - Oscillation2_6: float - Oscillation2_7: float - Oscillation2_8: float - Oscillation2_9: float - Oscillation3_0: float - Oscillation3_1: float - Oscillation3_2: float - Oscillation3_3: float - Oscillation3_4: float - Oscillation3_5: float - Oscillation3_6: float - Oscillation3_7: float - Oscillation3_8: float - Oscillation3_9: float - Oscillation4_0: float - Oscillation4_1: float - Oscillation4_2: float - Oscillation4_3: float - Oscillation4_4: float - Oscillation4_5: float - Oscillation4_6: float - Oscillation4_7: float - Oscillation4_8: float - Oscillation4_9: float - Oscillation5_0: float - Oscillation5_1: float - Oscillation5_2: float - Oscillation5_3: float - Oscillation5_4: float - Oscillation5_5: float - Oscillation5_6: float - Oscillation5_7: float - Oscillation5_8: float - Oscillation5_9: float - Oscillation6_0: float - Oscillation6_1: float - Oscillation6_2: float - Oscillation6_3: float - Oscillation6_4: float - Oscillation6_5: float - Oscillation6_6: float - Oscillation6_7: float - Oscillation6_8: float - Oscillation6_9: float - Oscillation7_0: float - Oscillation7_1: float - Oscillation7_2: float - Oscillation7_3: float - Oscillation7_4: float - Oscillation7_5: float - Oscillation7_6: float - Oscillation7_7: float - Oscillation7_8: float - Oscillation7_9: float - Oscillation8_0: float - Oscillation8_1: float - Oscillation8_2: float - Oscillation8_3: float - Oscillation8_4: float - Oscillation8_5: float - Oscillation8_6: float - Oscillation8_7: float - Oscillation8_8: float - Oscillation8_9: float - Oscillation9_0: float - Oscillation9_1: float - Oscillation9_2: float - Oscillation9_3: float - Oscillation9_4: float - Oscillation9_5: float - Oscillation9_6: float - Oscillation9_7: float - Oscillation9_8: float - Oscillation9_9: float - m_afFrondRippleDistance_0: float - m_afFrondRippleDistance_1: float - m_afFrondRippleDistance_2: float - m_afFrondRippleDistance_3: float - m_afFrondRippleDistance_4: float - m_afFrondRippleDistance_5: float - m_afFrondRippleDistance_6: float - m_afFrondRippleDistance_7: float - m_afFrondRippleDistance_8: float - m_afFrondRippleDistance_9: float - m_afGlobalDirectionAdherence_0: float - m_afGlobalDirectionAdherence_1: float - m_afGlobalDirectionAdherence_2: float - m_afGlobalDirectionAdherence_3: float - m_afGlobalDirectionAdherence_4: float - m_afGlobalDirectionAdherence_5: float - m_afGlobalDirectionAdherence_6: float - m_afGlobalDirectionAdherence_7: float - m_afGlobalDirectionAdherence_8: float - m_afGlobalDirectionAdherence_9: float - m_afGlobalDistance_0: float - m_afGlobalDistance_1: float - m_afGlobalDistance_2: float - m_afGlobalDistance_3: float - m_afGlobalDistance_4: float - m_afGlobalDistance_5: float - m_afGlobalDistance_6: float - m_afGlobalDistance_7: float - m_afGlobalDistance_8: float - m_afGlobalDistance_9: float - m_fAnchorDistanceScale: float - m_fAnchorOffset: float - m_fDirectionResponse: float - m_fFrondRippleLightingScalar: float - m_fFrondRippleTile: float - m_fGlobalHeight: float - m_fGlobalHeightExponent: float - m_fGustDurationMax: float - m_fGustDurationMin: float - m_fGustFallScalar: float - m_fGustFrequency: float - m_fGustRiseScalar: float - m_fGustStrengthMax: float - m_fGustStrengthMin: float - m_fRollingBranchFieldMin: float - m_fRollingBranchLightingAdjust: float - m_fRollingBranchVerticalOffset: float - m_fRollingLeafRippleMin: float - m_fRollingLeafTumbleMin: float - m_fRollingNoisePeriod: float - m_fRollingNoiseSize: float - m_fRollingNoiseSpeed: float - m_fRollingNoiseTurbulence: float - m_fRollingNoiseTwist: float - m_fStrengthResponse: float + BranchLevel1: SBranchWindLevel + BranchLevel2: SBranchWindLevel + LeafGroup1: SWindGroup + LeafGroup2: SWindGroup + Oscillation0_0: float + Oscillation0_1: float + Oscillation0_2: float + Oscillation0_3: float + Oscillation0_4: float + Oscillation0_5: float + Oscillation0_6: float + Oscillation0_7: float + Oscillation0_8: float + Oscillation0_9: float + Oscillation1_0: float + Oscillation1_1: float + Oscillation1_2: float + Oscillation1_3: float + Oscillation1_4: float + Oscillation1_5: float + Oscillation1_6: float + Oscillation1_7: float + Oscillation1_8: float + Oscillation1_9: float + Oscillation2_0: float + Oscillation2_1: float + Oscillation2_2: float + Oscillation2_3: float + Oscillation2_4: float + Oscillation2_5: float + Oscillation2_6: float + Oscillation2_7: float + Oscillation2_8: float + Oscillation2_9: float + Oscillation3_0: float + Oscillation3_1: float + Oscillation3_2: float + Oscillation3_3: float + Oscillation3_4: float + Oscillation3_5: float + Oscillation3_6: float + Oscillation3_7: float + Oscillation3_8: float + Oscillation3_9: float + Oscillation4_0: float + Oscillation4_1: float + Oscillation4_2: float + Oscillation4_3: float + Oscillation4_4: float + Oscillation4_5: float + Oscillation4_6: float + Oscillation4_7: float + Oscillation4_8: float + Oscillation4_9: float + Oscillation5_0: float + Oscillation5_1: float + Oscillation5_2: float + Oscillation5_3: float + Oscillation5_4: float + Oscillation5_5: float + Oscillation5_6: float + Oscillation5_7: float + Oscillation5_8: float + Oscillation5_9: float + Oscillation6_0: float + Oscillation6_1: float + Oscillation6_2: float + Oscillation6_3: float + Oscillation6_4: float + Oscillation6_5: float + Oscillation6_6: float + Oscillation6_7: float + Oscillation6_8: float + Oscillation6_9: float + Oscillation7_0: float + Oscillation7_1: float + Oscillation7_2: float + Oscillation7_3: float + Oscillation7_4: float + Oscillation7_5: float + Oscillation7_6: float + Oscillation7_7: float + Oscillation7_8: float + Oscillation7_9: float + Oscillation8_0: float + Oscillation8_1: float + Oscillation8_2: float + Oscillation8_3: float + Oscillation8_4: float + Oscillation8_5: float + Oscillation8_6: float + Oscillation8_7: float + Oscillation8_8: float + Oscillation8_9: float + Oscillation9_0: float + Oscillation9_1: float + Oscillation9_2: float + Oscillation9_3: float + Oscillation9_4: float + Oscillation9_5: float + Oscillation9_6: float + Oscillation9_7: float + Oscillation9_8: float + Oscillation9_9: float + m_afFrondRippleDistance_0: float + m_afFrondRippleDistance_1: float + m_afFrondRippleDistance_2: float + m_afFrondRippleDistance_3: float + m_afFrondRippleDistance_4: float + m_afFrondRippleDistance_5: float + m_afFrondRippleDistance_6: float + m_afFrondRippleDistance_7: float + m_afFrondRippleDistance_8: float + m_afFrondRippleDistance_9: float + m_afGlobalDirectionAdherence_0: float + m_afGlobalDirectionAdherence_1: float + m_afGlobalDirectionAdherence_2: float + m_afGlobalDirectionAdherence_3: float + m_afGlobalDirectionAdherence_4: float + m_afGlobalDirectionAdherence_5: float + m_afGlobalDirectionAdherence_6: float + m_afGlobalDirectionAdherence_7: float + m_afGlobalDirectionAdherence_8: float + m_afGlobalDirectionAdherence_9: float + m_afGlobalDistance_0: float + m_afGlobalDistance_1: float + m_afGlobalDistance_2: float + m_afGlobalDistance_3: float + m_afGlobalDistance_4: float + m_afGlobalDistance_5: float + m_afGlobalDistance_6: float + m_afGlobalDistance_7: float + m_afGlobalDistance_8: float + m_afGlobalDistance_9: float + m_fAnchorDistanceScale: float + m_fAnchorOffset: float + m_fDirectionResponse: float + m_fFrondRippleLightingScalar: float + m_fFrondRippleTile: float + m_fGlobalHeight: float + m_fGlobalHeightExponent: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fRollingBranchFieldMin: float + m_fRollingBranchLightingAdjust: float + m_fRollingBranchVerticalOffset: float + m_fRollingLeafRippleMin: float + m_fRollingLeafTumbleMin: float + m_fRollingNoisePeriod: float + m_fRollingNoiseSize: float + m_fRollingNoiseSpeed: float + m_fRollingNoiseTurbulence: float + m_fRollingNoiseTwist: float + m_fStrengthResponse: float @unitypy_define class SWindGroup: - m_afRippleDistance_0: float - m_afRippleDistance_1: float - m_afRippleDistance_2: float - m_afRippleDistance_3: float - m_afRippleDistance_4: float - m_afRippleDistance_5: float - m_afRippleDistance_6: float - m_afRippleDistance_7: float - m_afRippleDistance_8: float - m_afRippleDistance_9: float - m_afTumbleDirectionAdherence_0: float - m_afTumbleDirectionAdherence_1: float - m_afTumbleDirectionAdherence_2: float - m_afTumbleDirectionAdherence_3: float - m_afTumbleDirectionAdherence_4: float - m_afTumbleDirectionAdherence_5: float - m_afTumbleDirectionAdherence_6: float - m_afTumbleDirectionAdherence_7: float - m_afTumbleDirectionAdherence_8: float - m_afTumbleDirectionAdherence_9: float - m_afTumbleFlip_0: float - m_afTumbleFlip_1: float - m_afTumbleFlip_2: float - m_afTumbleFlip_3: float - m_afTumbleFlip_4: float - m_afTumbleFlip_5: float - m_afTumbleFlip_6: float - m_afTumbleFlip_7: float - m_afTumbleFlip_8: float - m_afTumbleFlip_9: float - m_afTumbleTwist_0: float - m_afTumbleTwist_1: float - m_afTumbleTwist_2: float - m_afTumbleTwist_3: float - m_afTumbleTwist_4: float - m_afTumbleTwist_5: float - m_afTumbleTwist_6: float - m_afTumbleTwist_7: float - m_afTumbleTwist_8: float - m_afTumbleTwist_9: float - m_afTwitchThrow_0: float - m_afTwitchThrow_1: float - m_afTwitchThrow_2: float - m_afTwitchThrow_3: float - m_afTwitchThrow_4: float - m_afTwitchThrow_5: float - m_afTwitchThrow_6: float - m_afTwitchThrow_7: float - m_afTwitchThrow_8: float - m_afTwitchThrow_9: float - m_fLeewardScalar: float - m_fRollMaxScale: float - m_fRollMinScale: float - m_fRollSeparation: float - m_fRollSpeed: float - m_fTwitchSharpness: float + m_afRippleDistance_0: float + m_afRippleDistance_1: float + m_afRippleDistance_2: float + m_afRippleDistance_3: float + m_afRippleDistance_4: float + m_afRippleDistance_5: float + m_afRippleDistance_6: float + m_afRippleDistance_7: float + m_afRippleDistance_8: float + m_afRippleDistance_9: float + m_afTumbleDirectionAdherence_0: float + m_afTumbleDirectionAdherence_1: float + m_afTumbleDirectionAdherence_2: float + m_afTumbleDirectionAdherence_3: float + m_afTumbleDirectionAdherence_4: float + m_afTumbleDirectionAdherence_5: float + m_afTumbleDirectionAdherence_6: float + m_afTumbleDirectionAdherence_7: float + m_afTumbleDirectionAdherence_8: float + m_afTumbleDirectionAdherence_9: float + m_afTumbleFlip_0: float + m_afTumbleFlip_1: float + m_afTumbleFlip_2: float + m_afTumbleFlip_3: float + m_afTumbleFlip_4: float + m_afTumbleFlip_5: float + m_afTumbleFlip_6: float + m_afTumbleFlip_7: float + m_afTumbleFlip_8: float + m_afTumbleFlip_9: float + m_afTumbleTwist_0: float + m_afTumbleTwist_1: float + m_afTumbleTwist_2: float + m_afTumbleTwist_3: float + m_afTumbleTwist_4: float + m_afTumbleTwist_5: float + m_afTumbleTwist_6: float + m_afTumbleTwist_7: float + m_afTumbleTwist_8: float + m_afTumbleTwist_9: float + m_afTwitchThrow_0: float + m_afTwitchThrow_1: float + m_afTwitchThrow_2: float + m_afTwitchThrow_3: float + m_afTwitchThrow_4: float + m_afTwitchThrow_5: float + m_afTwitchThrow_6: float + m_afTwitchThrow_7: float + m_afTwitchThrow_8: float + m_afTwitchThrow_9: float + m_fLeewardScalar: float + m_fRollMaxScale: float + m_fRollMinScale: float + m_fRollSeparation: float + m_fRollSpeed: float + m_fTwitchSharpness: float @unitypy_define class SampleSettings: - compressionFormat: int - conversionMode: int - loadType: int - quality: float - sampleRateOverride: int - sampleRateSetting: int - preloadAudioData: Optional[bool] = None + compressionFormat: int + conversionMode: int + loadType: int + quality: float + sampleRateOverride: int + sampleRateSetting: int + preloadAudioData: Optional[bool] = None @unitypy_define class SamplerParameter: - bindPoint: int - sampler: int + sampler: int + bindPoint: Optional[int] = None + m_Binding: Optional[Binding] = None @unitypy_define class Scene(LevelGameManager): - enabled: Optional[bool] = None - guid: Optional[GUID] = None - m_PVSData: Optional[List[int]] = None - m_PVSObjectsArray: Optional[List[PPtr[Renderer]]] = None - m_PVSPortalsArray: Optional[List[PPtr[OcclusionPortal]]] = None - m_QueryMode: Optional[int] = None - path: Optional[str] = None + enabled: Optional[bool] = None + guid: Optional[GUID] = None + m_PVSData: Optional[List[int]] = None + m_PVSObjectsArray: Optional[List[PPtr[Renderer]]] = None + m_PVSPortalsArray: Optional[List[PPtr[OcclusionPortal]]] = None + m_QueryMode: Optional[int] = None + path: Optional[str] = None @unitypy_define class SceneDataContainer: - m_SceneData: List[Tuple[SceneIdentifier, HierarchicalSceneData]] + m_SceneData: List[Tuple[SceneIdentifier, HierarchicalSceneData]] @unitypy_define class SceneIdentifier: - guid: GUID - handle: int + guid: GUID + handle: Union[UnitySceneHandle, int] @unitypy_define class SceneObjectIdentifier: - targetObject: int - targetPrefab: int + targetObject: int + targetPrefab: int @unitypy_define class SceneSettings(LevelGameManager): - m_PVSData: List[int] - m_PVSObjectsArray: List[PPtr[Renderer]] - m_PVSPortalsArray: List[PPtr[OcclusionPortal]] - m_QueryMode: Optional[int] = None + m_PVSData: List[int] + m_PVSObjectsArray: List[PPtr[Renderer]] + m_PVSPortalsArray: List[PPtr[OcclusionPortal]] + m_QueryMode: Optional[int] = None @unitypy_define class SceneVisibilityData: - m_SceneGUID: GUID + m_SceneGUID: GUID @unitypy_define class ScriptMapper(GlobalGameManager): - m_Shaders: NameToObjectMap - m_PreloadShaders: Optional[bool] = None + m_Shaders: NameToObjectMap + m_PreloadShaders: Optional[bool] = None @unitypy_define class SecondarySpriteTexture: - name: str - texture: PPtr[Texture2D] + name: str + texture: PPtr[Texture2D] @unitypy_define class SecondaryTextureSettings: - platformSettings: List[TextureImporterPlatformSettings] - sRGB: Optional[bool] = None + platformSettings: List[TextureImporterPlatformSettings] + sRGB: Optional[bool] = None @unitypy_define class SelectorStateConstant: - m_FullPathID: int - m_IsEntry: bool - m_TransitionConstantArray: List[OffsetPtr] + m_FullPathID: int + m_IsEntry: bool + m_TransitionConstantArray: List[OffsetPtr] @unitypy_define class SelectorTransitionConstant: - m_ConditionConstantArray: List[OffsetPtr] - m_Destination: int + m_ConditionConstantArray: List[OffsetPtr] + m_Destination: int @unitypy_define class SerializedCustomEditorForRenderPipeline: - customEditorName: str - renderPipelineType: str + customEditorName: str + renderPipelineType: str @unitypy_define class SerializedPass: - m_HasInstancingVariant: bool - m_Name: str - m_NameIndices: List[Tuple[str, int]] - m_ProgramMask: int - m_State: SerializedShaderState - m_Tags: SerializedTagMap - m_TextureName: str - m_Type: int - m_UseName: str - progDomain: SerializedProgram - progFragment: SerializedProgram - progGeometry: SerializedProgram - progHull: SerializedProgram - progVertex: SerializedProgram - m_EditorDataHash: Optional[List[Hash128]] = None - m_GlobalKeywordMask: Optional[List[int]] = None - m_HasProceduralInstancingVariant: Optional[bool] = None - m_LocalKeywordMask: Optional[List[int]] = None - m_Platforms: Optional[List[int]] = None - m_SerializedKeywordStateMask: Optional[List[int]] = None - progRayTracing: Optional[SerializedProgram] = None + m_HasInstancingVariant: bool + m_Name: str + m_NameIndices: List[Tuple[str, int]] + m_ProgramMask: int + m_State: SerializedShaderState + m_Tags: SerializedTagMap + m_TextureName: str + m_Type: int + m_UseName: str + progDomain: SerializedProgram + progFragment: SerializedProgram + progGeometry: SerializedProgram + progHull: SerializedProgram + progVertex: SerializedProgram + m_EditorDataHash: Optional[List[Hash128]] = None + m_GlobalKeywordMask: Optional[List[int]] = None + m_HasProceduralInstancingVariant: Optional[bool] = None + m_LocalKeywordMask: Optional[List[int]] = None + m_Platforms: Optional[List[int]] = None + m_SerializedDynamicBranchKeywordMask: Optional[List[int]] = None + m_SerializedKeywordStateMask: Optional[List[int]] = None + progRayTracing: Optional[SerializedProgram] = None @unitypy_define class SerializedPlayerSubProgram: - m_BlobIndex: int - m_GpuProgramType: int - m_KeywordIndices: List[int] - m_ShaderRequirements: int + m_BlobIndex: int + m_GpuProgramType: int + m_KeywordIndices: List[int] + m_ShaderRequirements: int @unitypy_define class SerializedProgram: - m_SubPrograms: List[SerializedSubProgram] - m_CommonParameters: Optional[SerializedProgramParameters] = None - m_ParameterBlobIndices: Optional[List[List[int]]] = None - m_PlayerSubPrograms: Optional[List[List[SerializedPlayerSubProgram]]] = None - m_SerializedKeywordStateMask: Optional[List[int]] = None + m_SubPrograms: List[SerializedSubProgram] + m_CommonParameters: Optional[Union[ProgramParameters, SerializedProgramParameters]] = None + m_ParameterBlobIndices: Optional[List[List[int]]] = None + m_PlayerSubPrograms: Optional[List[List[SerializedPlayerSubProgram]]] = None + m_SerializedKeywordStateMask: Optional[List[int]] = None @unitypy_define class SerializedProgramParameters: - m_BufferParams: List[BufferBinding] - m_ConstantBufferBindings: List[BufferBinding] - m_ConstantBuffers: List[ConstantBuffer] - m_MatrixParams: List[MatrixParameter] - m_Samplers: List[SamplerParameter] - m_TextureParams: List[TextureParameter] - m_UAVParams: List[UAVParameter] - m_VectorParams: List[VectorParameter] + m_BufferParams: List[BufferBinding] + m_ConstantBufferBindings: List[BufferBinding] + m_ConstantBuffers: List[ConstantBuffer] + m_MatrixParams: List[MatrixParameter] + m_Samplers: List[SamplerParameter] + m_TextureParams: List[TextureParameter] + m_UAVParams: List[UAVParameter] + m_VectorParams: List[VectorParameter] @unitypy_define class SerializedProperties: - m_Props: List[SerializedProperty] + m_Props: List[SerializedProperty] @unitypy_define class SerializedProperty: - m_Attributes: List[str] - m_DefTexture: SerializedTextureProperty - m_DefValue_0_: float - m_DefValue_1_: float - m_DefValue_2_: float - m_DefValue_3_: float - m_Description: str - m_Flags: int - m_Name: str - m_Type: int + m_Attributes: List[str] + m_DefTexture: SerializedTextureProperty + m_DefValue_0_: float + m_DefValue_1_: float + m_DefValue_2_: float + m_DefValue_3_: float + m_Description: str + m_Flags: int + m_Name: str + m_Type: int @unitypy_define class SerializedShader: - m_CustomEditorName: str - m_Dependencies: List[SerializedShaderDependency] - m_DisableNoSubshadersMessage: bool - m_FallbackName: str - m_Name: str - m_PropInfo: SerializedProperties - m_SubShaders: List[SerializedSubShader] - m_CustomEditorForRenderPipelines: Optional[ - List[SerializedCustomEditorForRenderPipeline] - ] = None - m_KeywordFlags: Optional[List[int]] = None - m_KeywordNames: Optional[List[str]] = None + m_CustomEditorName: str + m_Dependencies: List[SerializedShaderDependency] + m_DisableNoSubshadersMessage: bool + m_FallbackName: str + m_Name: str + m_PropInfo: SerializedProperties + m_SubShaders: List[SerializedSubShader] + m_CustomEditorForRenderPipelines: Optional[List[SerializedCustomEditorForRenderPipeline]] = None + m_KeywordFlags: Optional[List[int]] = None + m_KeywordNames: Optional[List[str]] = None @unitypy_define class SerializedShaderDependency: - from_: str - to: str + from_: str + to: str @unitypy_define class SerializedShaderFloatValue: - name: Union[FastPropertyName, str] - val: float + name: Union[FastPropertyName, str] + val: float @unitypy_define class SerializedShaderRTBlendState: - blendOp: SerializedShaderFloatValue - blendOpAlpha: SerializedShaderFloatValue - colMask: SerializedShaderFloatValue - destBlend: SerializedShaderFloatValue - destBlendAlpha: SerializedShaderFloatValue - srcBlend: SerializedShaderFloatValue - srcBlendAlpha: SerializedShaderFloatValue + blendOp: SerializedShaderFloatValue + blendOpAlpha: SerializedShaderFloatValue + colMask: SerializedShaderFloatValue + destBlend: SerializedShaderFloatValue + destBlendAlpha: SerializedShaderFloatValue + srcBlend: SerializedShaderFloatValue + srcBlendAlpha: SerializedShaderFloatValue @unitypy_define class SerializedShaderState: - alphaToMask: SerializedShaderFloatValue - culling: SerializedShaderFloatValue - fogColor: SerializedShaderVectorValue - fogDensity: SerializedShaderFloatValue - fogEnd: SerializedShaderFloatValue - fogMode: int - fogStart: SerializedShaderFloatValue - gpuProgramID: int - lighting: bool - m_LOD: int - m_Name: str - m_Tags: SerializedTagMap - offsetFactor: SerializedShaderFloatValue - offsetUnits: SerializedShaderFloatValue - rtBlend0: SerializedShaderRTBlendState - rtBlend1: SerializedShaderRTBlendState - rtBlend2: SerializedShaderRTBlendState - rtBlend3: SerializedShaderRTBlendState - rtBlend4: SerializedShaderRTBlendState - rtBlend5: SerializedShaderRTBlendState - rtBlend6: SerializedShaderRTBlendState - rtBlend7: SerializedShaderRTBlendState - rtSeparateBlend: bool - stencilOp: SerializedStencilOp - stencilOpBack: SerializedStencilOp - stencilOpFront: SerializedStencilOp - stencilReadMask: SerializedShaderFloatValue - stencilRef: SerializedShaderFloatValue - stencilWriteMask: SerializedShaderFloatValue - zTest: SerializedShaderFloatValue - zWrite: SerializedShaderFloatValue - conservative: Optional[SerializedShaderFloatValue] = None - zClip: Optional[SerializedShaderFloatValue] = None + alphaToMask: SerializedShaderFloatValue + culling: SerializedShaderFloatValue + fogColor: SerializedShaderVectorValue + fogDensity: SerializedShaderFloatValue + fogEnd: SerializedShaderFloatValue + fogMode: int + fogStart: SerializedShaderFloatValue + gpuProgramID: int + lighting: bool + m_LOD: int + m_Name: str + m_Tags: SerializedTagMap + offsetFactor: SerializedShaderFloatValue + offsetUnits: SerializedShaderFloatValue + rtBlend0: SerializedShaderRTBlendState + rtBlend1: SerializedShaderRTBlendState + rtBlend2: SerializedShaderRTBlendState + rtBlend3: SerializedShaderRTBlendState + rtBlend4: SerializedShaderRTBlendState + rtBlend5: SerializedShaderRTBlendState + rtBlend6: SerializedShaderRTBlendState + rtBlend7: SerializedShaderRTBlendState + rtSeparateBlend: bool + stencilOp: SerializedStencilOp + stencilOpBack: SerializedStencilOp + stencilOpFront: SerializedStencilOp + stencilReadMask: SerializedShaderFloatValue + stencilRef: SerializedShaderFloatValue + stencilWriteMask: SerializedShaderFloatValue + zTest: SerializedShaderFloatValue + zWrite: SerializedShaderFloatValue + conservative: Optional[SerializedShaderFloatValue] = None + zClip: Optional[SerializedShaderFloatValue] = None @unitypy_define class SerializedShaderVectorValue: - name: Union[FastPropertyName, str] - w: SerializedShaderFloatValue - x: SerializedShaderFloatValue - y: SerializedShaderFloatValue - z: SerializedShaderFloatValue + name: Union[FastPropertyName, str] + w: SerializedShaderFloatValue + x: SerializedShaderFloatValue + y: SerializedShaderFloatValue + z: SerializedShaderFloatValue @unitypy_define class SerializedStencilOp: - comp: SerializedShaderFloatValue - fail: SerializedShaderFloatValue - pass_: SerializedShaderFloatValue - zFail: SerializedShaderFloatValue + comp: SerializedShaderFloatValue + fail: SerializedShaderFloatValue + pass_: SerializedShaderFloatValue + zFail: SerializedShaderFloatValue @unitypy_define class SerializedSubProgram: - m_BlobIndex: int - m_Channels: ParserBindChannels - m_GpuProgramType: int - m_ShaderHardwareTier: int - m_BufferParams: Optional[List[BufferBinding]] = None - m_ConstantBufferBindings: Optional[List[BufferBinding]] = None - m_ConstantBuffers: Optional[List[ConstantBuffer]] = None - m_GlobalKeywordIndices: Optional[List[int]] = None - m_KeywordIndices: Optional[List[int]] = None - m_LocalKeywordIndices: Optional[List[int]] = None - m_MatrixParams: Optional[List[MatrixParameter]] = None - m_Parameters: Optional[SerializedProgramParameters] = None - m_Samplers: Optional[List[SamplerParameter]] = None - m_ShaderRequirements: Optional[int] = None - m_TextureParams: Optional[List[TextureParameter]] = None - m_UAVParams: Optional[List[UAVParameter]] = None - m_VectorParams: Optional[List[VectorParameter]] = None + m_BlobIndex: int + m_Channels: ParserBindChannels + m_GpuProgramType: int + m_ShaderHardwareTier: int + m_BufferParams: Optional[List[BufferBinding]] = None + m_ConstantBufferBindings: Optional[List[BufferBinding]] = None + m_ConstantBuffers: Optional[List[ConstantBuffer]] = None + m_GlobalKeywordIndices: Optional[List[int]] = None + m_KeywordIndices: Optional[List[int]] = None + m_LocalKeywordIndices: Optional[List[int]] = None + m_MatrixParams: Optional[List[MatrixParameter]] = None + m_Parameters: Optional[Union[ProgramParameters, SerializedProgramParameters]] = None + m_Samplers: Optional[List[SamplerParameter]] = None + m_ShaderRequirements: Optional[int] = None + m_TextureParams: Optional[List[TextureParameter]] = None + m_UAVParams: Optional[List[UAVParameter]] = None + m_VectorParams: Optional[List[VectorParameter]] = None @unitypy_define class SerializedSubShader: - m_LOD: int - m_Passes: List[SerializedPass] - m_Tags: SerializedTagMap + m_LOD: int + m_Passes: List[SerializedPass] + m_Tags: SerializedTagMap @unitypy_define class SerializedTagMap: - tags: List[Tuple[str, str]] + tags: List[Tuple[str, str]] @unitypy_define class SerializedTextureProperty: - m_DefaultName: str - m_TexDim: int + m_DefaultName: str + m_TexDim: int @unitypy_define class ShaderBindChannel: - source: int - target: int + source: int + target: int @unitypy_define class ShaderInfo: - variants: List[VariantInfo] + variants: List[VariantInfo] @unitypy_define class ShadowSettings: - m_Bias: float - m_Resolution: int - m_Strength: float - m_Type: int - m_CullingMatrixOverride: Optional[Matrix4x4f] = None - m_CustomResolution: Optional[int] = None - m_NearPlane: Optional[float] = None - m_NormalBias: Optional[float] = None - m_Softness: Optional[float] = None - m_SoftnessFade: Optional[float] = None - m_UseCullingMatrixOverride: Optional[bool] = None + m_Bias: float + m_Resolution: int + m_Strength: float + m_Type: int + m_CullingMatrixOverride: Optional[Matrix4x4f] = None + m_CustomResolution: Optional[int] = None + m_NearPlane: Optional[float] = None + m_NormalBias: Optional[float] = None + m_Softness: Optional[float] = None + m_SoftnessFade: Optional[float] = None + m_UseCullingMatrixOverride: Optional[bool] = None @unitypy_define class ShapeModule: - angle: float - enabled: bool - m_Mesh: PPtr[Mesh] - placementMode: int - radius: Union[MultiModeParameter, float] - type: int - alignToDirection: Optional[bool] = None - arc: Optional[Union[MultiModeParameter, float]] = None - boxThickness: Optional[Vector3f] = None - boxX: Optional[float] = None - boxY: Optional[float] = None - boxZ: Optional[float] = None - donutRadius: Optional[float] = None - length: Optional[float] = None - m_MeshMaterialIndex: Optional[int] = None - m_MeshNormalOffset: Optional[float] = None - m_MeshRenderer: Optional[PPtr[MeshRenderer]] = None - m_MeshScale: Optional[float] = None - m_MeshSpawn: Optional[MultiModeParameter] = None - m_Position: Optional[Vector3f] = None - m_Rotation: Optional[Vector3f] = None - m_Scale: Optional[Vector3f] = None - m_SkinnedMeshRenderer: Optional[PPtr[SkinnedMeshRenderer]] = None - m_Sprite: Optional[PPtr[Sprite]] = None - m_SpriteRenderer: Optional[PPtr[SpriteRenderer]] = None - m_Texture: Optional[PPtr[Texture2D]] = None - m_TextureAlphaAffectsParticles: Optional[bool] = None - m_TextureBilinearFiltering: Optional[bool] = None - m_TextureClipChannel: Optional[int] = None - m_TextureClipThreshold: Optional[float] = None - m_TextureColorAffectsParticles: Optional[bool] = None - m_TextureUVChannel: Optional[int] = None - m_UseMeshColors: Optional[bool] = None - m_UseMeshMaterialIndex: Optional[bool] = None - radiusThickness: Optional[float] = None - randomDirection: Optional[bool] = None - randomDirectionAmount: Optional[float] = None - randomPositionAmount: Optional[float] = None - sphericalDirectionAmount: Optional[float] = None + angle: float + enabled: bool + m_Mesh: PPtr[Mesh] + placementMode: int + radius: Union[MultiModeParameter, float] + type: int + alignToDirection: Optional[bool] = None + arc: Optional[Union[MultiModeParameter, float]] = None + boxThickness: Optional[Vector3f] = None + boxX: Optional[float] = None + boxY: Optional[float] = None + boxZ: Optional[float] = None + donutRadius: Optional[float] = None + length: Optional[float] = None + m_MeshMaterialIndex: Optional[int] = None + m_MeshNormalOffset: Optional[float] = None + m_MeshRenderer: Optional[PPtr[MeshRenderer]] = None + m_MeshScale: Optional[float] = None + m_MeshSpawn: Optional[MultiModeParameter] = None + m_Position: Optional[Vector3f] = None + m_Rotation: Optional[Vector3f] = None + m_Scale: Optional[Vector3f] = None + m_SkinnedMeshRenderer: Optional[PPtr[SkinnedMeshRenderer]] = None + m_Sprite: Optional[PPtr[Sprite]] = None + m_SpriteRenderer: Optional[PPtr[SpriteRenderer]] = None + m_Texture: Optional[PPtr[Texture2D]] = None + m_TextureAlphaAffectsParticles: Optional[bool] = None + m_TextureBilinearFiltering: Optional[bool] = None + m_TextureClipChannel: Optional[int] = None + m_TextureClipThreshold: Optional[float] = None + m_TextureColorAffectsParticles: Optional[bool] = None + m_TextureUVChannel: Optional[int] = None + m_UseMeshColors: Optional[bool] = None + m_UseMeshMaterialIndex: Optional[bool] = None + radiusThickness: Optional[float] = None + randomDirection: Optional[bool] = None + randomDirectionAmount: Optional[float] = None + randomPositionAmount: Optional[float] = None + sphericalDirectionAmount: Optional[float] = None @unitypy_define class SizeBySpeedModule: - curve: MinMaxCurve - enabled: bool - range: Vector2f - separateAxes: Optional[bool] = None - y: Optional[MinMaxCurve] = None - z: Optional[MinMaxCurve] = None + curve: MinMaxCurve + enabled: bool + range: Vector2f + separateAxes: Optional[bool] = None + y: Optional[MinMaxCurve] = None + z: Optional[MinMaxCurve] = None @unitypy_define class SizeModule: - curve: MinMaxCurve - enabled: bool - separateAxes: Optional[bool] = None - y: Optional[MinMaxCurve] = None - z: Optional[MinMaxCurve] = None + curve: MinMaxCurve + enabled: bool + separateAxes: Optional[bool] = None + y: Optional[MinMaxCurve] = None + z: Optional[MinMaxCurve] = None @unitypy_define class Skeleton: - m_AxesArray: List[Axes] - m_ID: List[int] - m_Node: List[Node] + m_AxesArray: List[Axes] + m_ID: List[int] + m_Node: List[Node] @unitypy_define class SkeletonBone: - m_Name: str - m_Position: Vector3f - m_Rotation: Quaternionf - m_Scale: Vector3f - m_ParentName: Optional[str] = None - m_TransformModified: Optional[bool] = None + m_Name: str + m_Position: Vector3f + m_Rotation: Quaternionf + m_Scale: Vector3f + m_ParentName: Optional[str] = None + m_TransformModified: Optional[bool] = None @unitypy_define class SkeletonBoneLimit: - m_Length: float - m_Max: Vector3f - m_Min: Vector3f - m_Modified: bool - m_Value: Vector3f - m_PostQ: Optional[Quaternionf] = None - m_PreQ: Optional[Quaternionf] = None + m_Length: float + m_Max: Vector3f + m_Min: Vector3f + m_Modified: bool + m_Value: Vector3f + m_PostQ: Optional[Quaternionf] = None + m_PreQ: Optional[Quaternionf] = None @unitypy_define class SkeletonMask: - m_Data: List[SkeletonMaskElement] + m_Data: List[SkeletonMaskElement] @unitypy_define class SkeletonMaskElement: - m_Weight: float - m_Index: Optional[int] = None - m_PathHash: Optional[int] = None + m_Weight: float + m_Index: Optional[int] = None + m_PathHash: Optional[int] = None @unitypy_define class SkeletonPose: - m_X: List[xform] + m_X: List[xform] @unitypy_define class SketchUpImportCamera: - aspectRatio: float - fov: float - isPerspective: int - lookAt: Vector3f - orthoSize: float - position: Vector3f - up: Vector3f - farPlane: Optional[float] = None - nearPlane: Optional[float] = None + aspectRatio: float + fov: float + isPerspective: int + lookAt: Vector3f + orthoSize: float + position: Vector3f + up: Vector3f + farPlane: Optional[float] = None + nearPlane: Optional[float] = None @unitypy_define class SketchUpImportData: - defaultCamera: SketchUpImportCamera - scenes: List[SketchUpImportScene] + defaultCamera: SketchUpImportCamera + scenes: List[SketchUpImportScene] @unitypy_define class SketchUpImportScene: - camera: SketchUpImportCamera - name: str + camera: SketchUpImportCamera + name: str @unitypy_define class SnapshotConstant: - nameHash: int - transitionIndices: List[int] - transitionTypes: List[int] - values: List[float] + nameHash: int + transitionIndices: List[int] + transitionTypes: List[int] + values: List[float] @unitypy_define class SoftJointLimit: - bounciness: float - limit: float - contactDistance: Optional[float] = None - damper: Optional[float] = None - spring: Optional[float] = None + bounciness: float + limit: float + contactDistance: Optional[float] = None + damper: Optional[float] = None + spring: Optional[float] = None @unitypy_define class SoftJointLimitSpring: - damper: float - spring: float + damper: float + spring: float @unitypy_define class SortingLayerEntry: - name: str - uniqueID: int - userID: Optional[int] = None + name: str + uniqueID: int + userID: Optional[int] = None @unitypy_define class SourceAssetIdentifier: - assembly: str - name: str - type: str + assembly: str + name: str + type: str + + +@unitypy_define +class SourceLocation: + m_File: str + m_Position: int @unitypy_define class SourceTextureInformation: - doesTextureContainAlpha: bool - height: int - width: int - doesTextureContainColor: Optional[bool] = None - sourceWasHDR: Optional[bool] = None + doesTextureContainAlpha: bool + height: int + width: int + doesTextureContainColor: Optional[bool] = None + sourceWasHDR: Optional[bool] = None + + +@unitypy_define +class SpecializationConstantParameter: + m_Binding: Binding + m_NameIndex: int @unitypy_define class SpeedTreeWind: - BRANCH_DIRECTIONAL_1: bool - BRANCH_DIRECTIONAL_2: bool - BRANCH_DIRECTIONAL_FROND_1: bool - BRANCH_DIRECTIONAL_FROND_2: bool - BRANCH_OSC_COMPLEX_1: bool - BRANCH_OSC_COMPLEX_2: bool - BRANCH_SIMPLE_1: bool - BRANCH_SIMPLE_2: bool - BRANCH_TURBULENCE_1: bool - BRANCH_TURBULENCE_2: bool - BRANCH_WHIP_1: bool - BRANCH_WHIP_2: bool - BranchWindAnchor0: float - BranchWindAnchor1: float - BranchWindAnchor2: float - FROND_RIPPLE_ADJUST_LIGHTING: bool - FROND_RIPPLE_ONE_SIDED: bool - FROND_RIPPLE_TWO_SIDED: bool - GLOBAL_PRESERVE_SHAPE: bool - GLOBAL_WIND: bool - LEAF_OCCLUSION_1: bool - LEAF_OCCLUSION_2: bool - LEAF_RIPPLE_COMPUTED_1: bool - LEAF_RIPPLE_COMPUTED_2: bool - LEAF_RIPPLE_VERTEX_NORMAL_1: bool - LEAF_RIPPLE_VERTEX_NORMAL_2: bool - LEAF_TUMBLE_1: bool - LEAF_TUMBLE_2: bool - LEAF_TWITCH_1: bool - LEAF_TWITCH_2: bool - ROLLING: bool - m_fMaxBranchLevel1Length: float - m_sParams: SParams + BRANCH_DIRECTIONAL_1: bool + BRANCH_DIRECTIONAL_2: bool + BRANCH_DIRECTIONAL_FROND_1: bool + BRANCH_DIRECTIONAL_FROND_2: bool + BRANCH_OSC_COMPLEX_1: bool + BRANCH_OSC_COMPLEX_2: bool + BRANCH_SIMPLE_1: bool + BRANCH_SIMPLE_2: bool + BRANCH_TURBULENCE_1: bool + BRANCH_TURBULENCE_2: bool + BRANCH_WHIP_1: bool + BRANCH_WHIP_2: bool + BranchWindAnchor0: float + BranchWindAnchor1: float + BranchWindAnchor2: float + FROND_RIPPLE_ADJUST_LIGHTING: bool + FROND_RIPPLE_ONE_SIDED: bool + FROND_RIPPLE_TWO_SIDED: bool + GLOBAL_PRESERVE_SHAPE: bool + GLOBAL_WIND: bool + LEAF_OCCLUSION_1: bool + LEAF_OCCLUSION_2: bool + LEAF_RIPPLE_COMPUTED_1: bool + LEAF_RIPPLE_COMPUTED_2: bool + LEAF_RIPPLE_VERTEX_NORMAL_1: bool + LEAF_RIPPLE_VERTEX_NORMAL_2: bool + LEAF_TUMBLE_1: bool + LEAF_TUMBLE_2: bool + LEAF_TWITCH_1: bool + LEAF_TWITCH_2: bool + ROLLING: bool + m_fMaxBranchLevel1Length: float + m_sParams: SParams @unitypy_define class SpeedTreeWindConfig8: - BRANCH_DIRECTIONAL_1: bool - BRANCH_DIRECTIONAL_2: bool - BRANCH_DIRECTIONAL_FROND_1: bool - BRANCH_DIRECTIONAL_FROND_2: bool - BRANCH_OSC_COMPLEX_1: bool - BRANCH_OSC_COMPLEX_2: bool - BRANCH_SIMPLE_1: bool - BRANCH_SIMPLE_2: bool - BRANCH_TURBULENCE_1: bool - BRANCH_TURBULENCE_2: bool - BRANCH_WHIP_1: bool - BRANCH_WHIP_2: bool - BranchLevel1: SBranchWindLevel - BranchLevel2: SBranchWindLevel - BranchWindAnchor0: float - BranchWindAnchor1: float - BranchWindAnchor2: float - FROND_RIPPLE_ADJUST_LIGHTING: bool - FROND_RIPPLE_ONE_SIDED: bool - FROND_RIPPLE_TWO_SIDED: bool - GLOBAL_PRESERVE_SHAPE: bool - GLOBAL_WIND: bool - LEAF_OCCLUSION_1: bool - LEAF_OCCLUSION_2: bool - LEAF_RIPPLE_COMPUTED_1: bool - LEAF_RIPPLE_COMPUTED_2: bool - LEAF_RIPPLE_VERTEX_NORMAL_1: bool - LEAF_RIPPLE_VERTEX_NORMAL_2: bool - LEAF_TUMBLE_1: bool - LEAF_TUMBLE_2: bool - LEAF_TWITCH_1: bool - LEAF_TWITCH_2: bool - LeafGroup1: SWindGroup - LeafGroup2: SWindGroup - Oscillation0_0: float - Oscillation0_1: float - Oscillation0_2: float - Oscillation0_3: float - Oscillation0_4: float - Oscillation0_5: float - Oscillation0_6: float - Oscillation0_7: float - Oscillation0_8: float - Oscillation0_9: float - Oscillation1_0: float - Oscillation1_1: float - Oscillation1_2: float - Oscillation1_3: float - Oscillation1_4: float - Oscillation1_5: float - Oscillation1_6: float - Oscillation1_7: float - Oscillation1_8: float - Oscillation1_9: float - Oscillation2_0: float - Oscillation2_1: float - Oscillation2_2: float - Oscillation2_3: float - Oscillation2_4: float - Oscillation2_5: float - Oscillation2_6: float - Oscillation2_7: float - Oscillation2_8: float - Oscillation2_9: float - Oscillation3_0: float - Oscillation3_1: float - Oscillation3_2: float - Oscillation3_3: float - Oscillation3_4: float - Oscillation3_5: float - Oscillation3_6: float - Oscillation3_7: float - Oscillation3_8: float - Oscillation3_9: float - Oscillation4_0: float - Oscillation4_1: float - Oscillation4_2: float - Oscillation4_3: float - Oscillation4_4: float - Oscillation4_5: float - Oscillation4_6: float - Oscillation4_7: float - Oscillation4_8: float - Oscillation4_9: float - Oscillation5_0: float - Oscillation5_1: float - Oscillation5_2: float - Oscillation5_3: float - Oscillation5_4: float - Oscillation5_5: float - Oscillation5_6: float - Oscillation5_7: float - Oscillation5_8: float - Oscillation5_9: float - Oscillation6_0: float - Oscillation6_1: float - Oscillation6_2: float - Oscillation6_3: float - Oscillation6_4: float - Oscillation6_5: float - Oscillation6_6: float - Oscillation6_7: float - Oscillation6_8: float - Oscillation6_9: float - Oscillation7_0: float - Oscillation7_1: float - Oscillation7_2: float - Oscillation7_3: float - Oscillation7_4: float - Oscillation7_5: float - Oscillation7_6: float - Oscillation7_7: float - Oscillation7_8: float - Oscillation7_9: float - Oscillation8_0: float - Oscillation8_1: float - Oscillation8_2: float - Oscillation8_3: float - Oscillation8_4: float - Oscillation8_5: float - Oscillation8_6: float - Oscillation8_7: float - Oscillation8_8: float - Oscillation8_9: float - Oscillation9_0: float - Oscillation9_1: float - Oscillation9_2: float - Oscillation9_3: float - Oscillation9_4: float - Oscillation9_5: float - Oscillation9_6: float - Oscillation9_7: float - Oscillation9_8: float - Oscillation9_9: float - ROLLING: bool - m_afFrondRippleDistance_0: float - m_afFrondRippleDistance_1: float - m_afFrondRippleDistance_2: float - m_afFrondRippleDistance_3: float - m_afFrondRippleDistance_4: float - m_afFrondRippleDistance_5: float - m_afFrondRippleDistance_6: float - m_afFrondRippleDistance_7: float - m_afFrondRippleDistance_8: float - m_afFrondRippleDistance_9: float - m_afGlobalDirectionAdherence_0: float - m_afGlobalDirectionAdherence_1: float - m_afGlobalDirectionAdherence_2: float - m_afGlobalDirectionAdherence_3: float - m_afGlobalDirectionAdherence_4: float - m_afGlobalDirectionAdherence_5: float - m_afGlobalDirectionAdherence_6: float - m_afGlobalDirectionAdherence_7: float - m_afGlobalDirectionAdherence_8: float - m_afGlobalDirectionAdherence_9: float - m_afGlobalDistance_0: float - m_afGlobalDistance_1: float - m_afGlobalDistance_2: float - m_afGlobalDistance_3: float - m_afGlobalDistance_4: float - m_afGlobalDistance_5: float - m_afGlobalDistance_6: float - m_afGlobalDistance_7: float - m_afGlobalDistance_8: float - m_afGlobalDistance_9: float - m_fAnchorDistanceScale: float - m_fAnchorOffset: float - m_fDirectionResponse: float - m_fFrondRippleLightingScalar: float - m_fFrondRippleTile: float - m_fGlobalHeight: float - m_fGlobalHeightExponent: float - m_fGustDurationMax: float - m_fGustDurationMin: float - m_fGustFallScalar: float - m_fGustFrequency: float - m_fGustRiseScalar: float - m_fGustStrengthMax: float - m_fGustStrengthMin: float - m_fMaxBranchLevel1Length: float - m_fRollingBranchFieldMin: float - m_fRollingBranchLightingAdjust: float - m_fRollingBranchVerticalOffset: float - m_fRollingLeafRippleMin: float - m_fRollingLeafTumbleMin: float - m_fRollingNoisePeriod: float - m_fRollingNoiseSize: float - m_fRollingNoiseSpeed: float - m_fRollingNoiseTurbulence: float - m_fRollingNoiseTwist: float - m_fStrengthResponse: float + BRANCH_DIRECTIONAL_1: bool + BRANCH_DIRECTIONAL_2: bool + BRANCH_DIRECTIONAL_FROND_1: bool + BRANCH_DIRECTIONAL_FROND_2: bool + BRANCH_OSC_COMPLEX_1: bool + BRANCH_OSC_COMPLEX_2: bool + BRANCH_SIMPLE_1: bool + BRANCH_SIMPLE_2: bool + BRANCH_TURBULENCE_1: bool + BRANCH_TURBULENCE_2: bool + BRANCH_WHIP_1: bool + BRANCH_WHIP_2: bool + BranchLevel1: SBranchWindLevel + BranchLevel2: SBranchWindLevel + BranchWindAnchor0: float + BranchWindAnchor1: float + BranchWindAnchor2: float + FROND_RIPPLE_ADJUST_LIGHTING: bool + FROND_RIPPLE_ONE_SIDED: bool + FROND_RIPPLE_TWO_SIDED: bool + GLOBAL_PRESERVE_SHAPE: bool + GLOBAL_WIND: bool + LEAF_OCCLUSION_1: bool + LEAF_OCCLUSION_2: bool + LEAF_RIPPLE_COMPUTED_1: bool + LEAF_RIPPLE_COMPUTED_2: bool + LEAF_RIPPLE_VERTEX_NORMAL_1: bool + LEAF_RIPPLE_VERTEX_NORMAL_2: bool + LEAF_TUMBLE_1: bool + LEAF_TUMBLE_2: bool + LEAF_TWITCH_1: bool + LEAF_TWITCH_2: bool + LeafGroup1: SWindGroup + LeafGroup2: SWindGroup + Oscillation0_0: float + Oscillation0_1: float + Oscillation0_2: float + Oscillation0_3: float + Oscillation0_4: float + Oscillation0_5: float + Oscillation0_6: float + Oscillation0_7: float + Oscillation0_8: float + Oscillation0_9: float + Oscillation1_0: float + Oscillation1_1: float + Oscillation1_2: float + Oscillation1_3: float + Oscillation1_4: float + Oscillation1_5: float + Oscillation1_6: float + Oscillation1_7: float + Oscillation1_8: float + Oscillation1_9: float + Oscillation2_0: float + Oscillation2_1: float + Oscillation2_2: float + Oscillation2_3: float + Oscillation2_4: float + Oscillation2_5: float + Oscillation2_6: float + Oscillation2_7: float + Oscillation2_8: float + Oscillation2_9: float + Oscillation3_0: float + Oscillation3_1: float + Oscillation3_2: float + Oscillation3_3: float + Oscillation3_4: float + Oscillation3_5: float + Oscillation3_6: float + Oscillation3_7: float + Oscillation3_8: float + Oscillation3_9: float + Oscillation4_0: float + Oscillation4_1: float + Oscillation4_2: float + Oscillation4_3: float + Oscillation4_4: float + Oscillation4_5: float + Oscillation4_6: float + Oscillation4_7: float + Oscillation4_8: float + Oscillation4_9: float + Oscillation5_0: float + Oscillation5_1: float + Oscillation5_2: float + Oscillation5_3: float + Oscillation5_4: float + Oscillation5_5: float + Oscillation5_6: float + Oscillation5_7: float + Oscillation5_8: float + Oscillation5_9: float + Oscillation6_0: float + Oscillation6_1: float + Oscillation6_2: float + Oscillation6_3: float + Oscillation6_4: float + Oscillation6_5: float + Oscillation6_6: float + Oscillation6_7: float + Oscillation6_8: float + Oscillation6_9: float + Oscillation7_0: float + Oscillation7_1: float + Oscillation7_2: float + Oscillation7_3: float + Oscillation7_4: float + Oscillation7_5: float + Oscillation7_6: float + Oscillation7_7: float + Oscillation7_8: float + Oscillation7_9: float + Oscillation8_0: float + Oscillation8_1: float + Oscillation8_2: float + Oscillation8_3: float + Oscillation8_4: float + Oscillation8_5: float + Oscillation8_6: float + Oscillation8_7: float + Oscillation8_8: float + Oscillation8_9: float + Oscillation9_0: float + Oscillation9_1: float + Oscillation9_2: float + Oscillation9_3: float + Oscillation9_4: float + Oscillation9_5: float + Oscillation9_6: float + Oscillation9_7: float + Oscillation9_8: float + Oscillation9_9: float + ROLLING: bool + m_afFrondRippleDistance_0: float + m_afFrondRippleDistance_1: float + m_afFrondRippleDistance_2: float + m_afFrondRippleDistance_3: float + m_afFrondRippleDistance_4: float + m_afFrondRippleDistance_5: float + m_afFrondRippleDistance_6: float + m_afFrondRippleDistance_7: float + m_afFrondRippleDistance_8: float + m_afFrondRippleDistance_9: float + m_afGlobalDirectionAdherence_0: float + m_afGlobalDirectionAdherence_1: float + m_afGlobalDirectionAdherence_2: float + m_afGlobalDirectionAdherence_3: float + m_afGlobalDirectionAdherence_4: float + m_afGlobalDirectionAdherence_5: float + m_afGlobalDirectionAdherence_6: float + m_afGlobalDirectionAdherence_7: float + m_afGlobalDirectionAdherence_8: float + m_afGlobalDirectionAdherence_9: float + m_afGlobalDistance_0: float + m_afGlobalDistance_1: float + m_afGlobalDistance_2: float + m_afGlobalDistance_3: float + m_afGlobalDistance_4: float + m_afGlobalDistance_5: float + m_afGlobalDistance_6: float + m_afGlobalDistance_7: float + m_afGlobalDistance_8: float + m_afGlobalDistance_9: float + m_fAnchorDistanceScale: float + m_fAnchorOffset: float + m_fDirectionResponse: float + m_fFrondRippleLightingScalar: float + m_fFrondRippleTile: float + m_fGlobalHeight: float + m_fGlobalHeightExponent: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fMaxBranchLevel1Length: float + m_fRollingBranchFieldMin: float + m_fRollingBranchLightingAdjust: float + m_fRollingBranchVerticalOffset: float + m_fRollingLeafRippleMin: float + m_fRollingLeafTumbleMin: float + m_fRollingNoisePeriod: float + m_fRollingNoiseSize: float + m_fRollingNoiseSpeed: float + m_fRollingNoiseTurbulence: float + m_fRollingNoiseTwist: float + m_fStrengthResponse: float @unitypy_define class SpeedTreeWindConfig9: - m_bDoBranch1: int - m_bDoBranch2: int - m_bDoRipple: int - m_bDoShared: int - m_bDoShimmer: int - m_bLodFade: int - m_fBranch1StretchLimit: float - m_fBranch2StretchLimit: float - m_fDirectionResponse: float - m_fGustDurationMax: float - m_fGustDurationMin: float - m_fGustFallScalar: float - m_fGustFrequency: float - m_fGustRiseScalar: float - m_fGustStrengthMax: float - m_fGustStrengthMin: float - m_fSharedHeightStart: float - m_fStrengthResponse: float - m_fWindIndependence: float - m_sBranch1: BranchWindLevel - m_sBranch2: BranchWindLevel - m_sRipple: RippleGroup - m_sShared: BranchWindLevel - m_vTreeExtents: Vector3f - m_fImportScaling: Optional[float] = None - pad: Optional[int] = None + m_bDoBranch1: int + m_bDoBranch2: int + m_bDoRipple: int + m_bDoShared: int + m_bDoShimmer: int + m_bLodFade: int + m_fBranch1StretchLimit: float + m_fBranch2StretchLimit: float + m_fDirectionResponse: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fSharedHeightStart: float + m_fStrengthResponse: float + m_fWindIndependence: float + m_sBranch1: BranchWindLevel + m_sBranch2: BranchWindLevel + m_sRipple: RippleGroup + m_sShared: BranchWindLevel + m_vTreeExtents: Vector3f + m_fImportScaling: Optional[float] = None + pad: Optional[int] = None @unitypy_define class SphericalHarmonicsL2: - sh_10_: float - sh_11_: float - sh_12_: float - sh_13_: float - sh_14_: float - sh_15_: float - sh_16_: float - sh_17_: float - sh_18_: float - sh_19_: float - sh_20_: float - sh_21_: float - sh_22_: float - sh_23_: float - sh_24_: float - sh_25_: float - sh_26_: float - sh__0_: float - sh__1_: float - sh__2_: float - sh__3_: float - sh__4_: float - sh__5_: float - sh__6_: float - sh__7_: float - sh__8_: float - sh__9_: float + sh_10_: float + sh_11_: float + sh_12_: float + sh_13_: float + sh_14_: float + sh_15_: float + sh_16_: float + sh_17_: float + sh_18_: float + sh_19_: float + sh_20_: float + sh_21_: float + sh_22_: float + sh_23_: float + sh_24_: float + sh_25_: float + sh_26_: float + sh__0_: float + sh__1_: float + sh__2_: float + sh__3_: float + sh__4_: float + sh__5_: float + sh__6_: float + sh__7_: float + sh__8_: float + sh__9_: float @unitypy_define class SplashScreenLogo: - duration: float - logo: PPtr[Sprite] + duration: float + logo: PPtr[Sprite] @unitypy_define class SplatDatabase: - m_AlphaTextures: List[PPtr[Texture2D]] - m_AlphamapResolution: int - m_BaseMapResolution: int - m_ColorSpace: Optional[int] = None - m_MaterialRequiresMetallic: Optional[bool] = None - m_MaterialRequiresSmoothness: Optional[bool] = None - m_Splats: Optional[List[SplatPrototype]] = None - m_TerrainLayers: Optional[List[PPtr[TerrainLayer]]] = None + m_AlphaTextures: List[PPtr[Texture2D]] + m_AlphamapResolution: int + m_BaseMapResolution: int + m_ColorSpace: Optional[int] = None + m_MaterialRequiresMetallic: Optional[bool] = None + m_MaterialRequiresSmoothness: Optional[bool] = None + m_Splats: Optional[List[SplatPrototype]] = None + m_TerrainLayers: Optional[List[PPtr[TerrainLayer]]] = None @unitypy_define class SplatPrototype: - texture: PPtr[Texture2D] - tileOffset: Vector2f - tileSize: Vector2f - normalMap: Optional[PPtr[Texture2D]] = None - smoothness: Optional[float] = None - specularMetallic: Optional[Vector4f] = None + texture: PPtr[Texture2D] + tileOffset: Vector2f + tileSize: Vector2f + normalMap: Optional[PPtr[Texture2D]] = None + smoothness: Optional[float] = None + specularMetallic: Optional[Vector4f] = None @unitypy_define class SpriteAtlasAssetData: - packables: List[PPtr[Object]] + packables: List[PPtr[Object]] @unitypy_define class SpriteAtlasData: - alphaTexture: PPtr[Texture2D] - downscaleMultiplier: float - settingsRaw: int - texture: PPtr[Texture2D] - textureRect: Rectf - textureRectOffset: Vector2f - uvTransform: Vector4f - atlasRectOffset: Optional[Vector2f] = None - secondaryTextures: Optional[List[SecondarySpriteTexture]] = None + alphaTexture: PPtr[Texture2D] + downscaleMultiplier: float + settingsRaw: int + texture: PPtr[Texture2D] + textureRect: Rectf + textureRectOffset: Vector2f + uvTransform: Vector4f + atlasRectOffset: Optional[Vector2f] = None + secondaryTextures: Optional[List[SecondarySpriteTexture]] = None + spriteInstanceData: Optional[SpriteInstanceData] = None @unitypy_define class SpriteAtlasEditorData: - bindAsDefault: bool - cachedData: PPtr[CachedSpriteAtlasRuntimeData] - isAtlasV2: bool - packables: List[PPtr[Object]] - packingSettings: PackingSettings - platformSettings: List[TextureImporterPlatformSettings] - textureSettings: TextureSettings - variantMultiplier: float - secondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = ( - None - ) - storedHash: Optional[Hash128] = None - totalSpriteSurfaceArea: Optional[int] = None + bindAsDefault: bool + cachedData: PPtr[CachedSpriteAtlasRuntimeData] + isAtlasV2: bool + packables: List[PPtr[Object]] + packingSettings: PackingSettings + platformSettings: List[TextureImporterPlatformSettings] + textureSettings: TextureSettings + variantMultiplier: float + secondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + storedHash: Optional[Hash128] = None + totalSpriteSurfaceArea: Optional[int] = None @unitypy_define class SpriteBone: - length: float - name: str - parentId: int - position: Vector3f - rotation: Quaternionf - color: Optional[ColorRGBA] = None - guid: Optional[str] = None + length: float + name: str + parentId: int + position: Vector3f + rotation: Quaternionf + color: Optional[ColorRGBA] = None + guid: Optional[str] = None @unitypy_define class SpriteCustomDataEntry: - m_Key: str - m_Value: str + m_Key: str + m_Value: str @unitypy_define class SpriteCustomMetadata: - m_Entries: List[SpriteCustomDataEntry] + m_Entries: List[SpriteCustomDataEntry] @unitypy_define class SpriteData: - sprite: PPtr[Object] + sprite: PPtr[Object] + + +@unitypy_define +class SpriteInstanceData: + border: Vector4f + m_Bindpose: List[Matrix4x4f] + m_BlendShapes: BlendShapeData + m_IndexBuffer: List[int] + m_IndexFormat: int + m_SubMeshes: List[SubMesh] + m_VertexData: VertexData + physicsShape: List[List[Vector2f]] + pivot: Vector2f + pixelsToUnits: float + rect: Rectf + spriteBones: List[SpriteBone] + spriteName: str @unitypy_define class SpriteMetaData: - m_Alignment: int - m_Name: str - m_Pivot: Vector2f - m_Rect: Rectf - m_Bones: Optional[List[SpriteBone]] = None - m_Border: Optional[Vector4f] = None - m_CustomData: Optional[str] = None - m_Edges: Optional[List[int2_storage]] = None - m_Indices: Optional[List[int]] = None - m_InternalID: Optional[int] = None - m_Outline: Optional[List[List[Vector2f]]] = None - m_PhysicsShape: Optional[List[List[Vector2f]]] = None - m_SpriteID: Optional[str] = None - m_TessellationDetail: Optional[float] = None - m_Vertices: Optional[List[Vector2f]] = None - m_Weights: Optional[List[BoneWeights4]] = None + m_Alignment: int + m_Name: str + m_Pivot: Vector2f + m_Rect: Rectf + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_CustomData: Optional[str] = None + m_Edges: Optional[List[int2_storage]] = None + m_Indices: Optional[List[int]] = None + m_InternalID: Optional[int] = None + m_Outline: Optional[List[List[Vector2f]]] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_SpriteID: Optional[str] = None + m_TessellationDetail: Optional[float] = None + m_Vertices: Optional[List[Vector2f]] = None + m_Weights: Optional[List[BoneWeights4]] = None @unitypy_define class SpriteRenderData: - settingsRaw: int - texture: PPtr[Texture2D] - textureRect: Rectf - textureRectOffset: Vector2f - alphaTexture: Optional[PPtr[Texture2D]] = None - atlasRectOffset: Optional[Vector2f] = None - downscaleMultiplier: Optional[float] = None - indices: Optional[List[int]] = None - m_Bindpose: Optional[List[Matrix4x4f]] = None - m_IndexBuffer: Optional[List[int]] = None - m_SourceSkin: Optional[List[BoneWeights4]] = None - m_SubMeshes: Optional[List[SubMesh]] = None - m_VertexData: Optional[VertexData] = None - secondaryTextures: Optional[List[SecondarySpriteTexture]] = None - uvTransform: Optional[Vector4f] = None - vertices: Optional[List[SpriteVertex]] = None + settingsRaw: int + texture: PPtr[Texture2D] + textureRect: Rectf + textureRectOffset: Vector2f + alphaTexture: Optional[PPtr[Texture2D]] = None + atlasRectOffset: Optional[Vector2f] = None + downscaleMultiplier: Optional[float] = None + indices: Optional[List[int]] = None + m_Bindpose: Optional[List[Matrix4x4f]] = None + m_BlendShapes: Optional[BlendShapeData] = None + m_IndexBuffer: Optional[List[int]] = None + m_SourceSkin: Optional[List[BoneWeights4]] = None + m_SubMeshes: Optional[List[SubMesh]] = None + m_VertexData: Optional[VertexData] = None + secondaryTextures: Optional[List[SecondarySpriteTexture]] = None + uvTransform: Optional[Vector4f] = None + vertices: Optional[List[SpriteVertex]] = None @unitypy_define class SpriteSheetMetaData: - m_Sprites: List[SpriteMetaData] - m_Bones: Optional[List[SpriteBone]] = None - m_CustomData: Optional[str] = None - m_Edges: Optional[List[int2_storage]] = None - m_Indices: Optional[List[int]] = None - m_InternalID: Optional[int] = None - m_NameFileIdTable: Optional[List[Tuple[str, int]]] = None - m_Outline: Optional[List[List[Vector2f]]] = None - m_PhysicsShape: Optional[List[List[Vector2f]]] = None - m_SecondaryTextures: Optional[List[SecondarySpriteTexture]] = None - m_SpriteCustomMetadata: Optional[SpriteCustomMetadata] = None - m_SpriteID: Optional[str] = None - m_Vertices: Optional[List[Vector2f]] = None - m_Weights: Optional[List[BoneWeights4]] = None + m_Sprites: List[SpriteMetaData] + m_Bones: Optional[List[SpriteBone]] = None + m_CustomData: Optional[str] = None + m_Edges: Optional[List[int2_storage]] = None + m_Indices: Optional[List[int]] = None + m_InternalID: Optional[int] = None + m_NameFileIdTable: Optional[List[Tuple[str, int]]] = None + m_Outline: Optional[List[List[Vector2f]]] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_SecondaryTextures: Optional[List[SecondarySpriteTexture]] = None + m_SpriteCustomMetadata: Optional[SpriteCustomMetadata] = None + m_SpriteID: Optional[str] = None + m_Vertices: Optional[List[Vector2f]] = None + m_Weights: Optional[List[BoneWeights4]] = None @unitypy_define class SpriteTilingProperty: - adaptiveTiling: bool - adaptiveTilingThreshold: float - border: Vector4f - drawMode: int - newSize: Vector2f - oldSize: Vector2f - pivot: Vector2f + adaptiveTiling: bool + adaptiveTilingThreshold: float + border: Vector4f + drawMode: int + newSize: Vector2f + oldSize: Vector2f + pivot: Vector2f @unitypy_define class SpriteVertex: - pos: Vector3f - uv: Optional[Vector2f] = None + pos: Vector3f + uv: Optional[Vector2f] = None @unitypy_define class State(NamedObject): - m_IKOnFeet: bool - m_Motions: List[PPtr[Motion]] - m_Name: str - m_ParentStateMachine: PPtr[StateMachine] - m_Position: Vector3f - m_Speed: float - m_Tag: str - m_CycleOffset: Optional[float] = None - m_Mirror: Optional[bool] = None + m_IKOnFeet: bool + m_Motions: List[PPtr[Motion]] + m_Name: str + m_ParentStateMachine: PPtr[StateMachine] + m_Position: Vector3f + m_Speed: float + m_Tag: str + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None @unitypy_define class StateConstant: - m_BlendTreeConstantArray: List[OffsetPtr] - m_BlendTreeConstantIndexArray: List[int] - m_IKOnFeet: bool - m_Loop: bool - m_Speed: float - m_TagID: int - m_TransitionConstantArray: List[OffsetPtr] - m_CycleOffset: Optional[float] = None - m_CycleOffsetParamID: Optional[int] = None - m_FullPathID: Optional[int] = None - m_ID: Optional[int] = None - m_LeafInfoArray: Optional[List[LeafInfoConstant]] = None - m_Mirror: Optional[bool] = None - m_MirrorParamID: Optional[int] = None - m_NameID: Optional[int] = None - m_PathID: Optional[int] = None - m_SpeedParamID: Optional[int] = None - m_TimeParamID: Optional[int] = None - m_WriteDefaultValues: Optional[bool] = None + m_BlendTreeConstantArray: List[OffsetPtr] + m_BlendTreeConstantIndexArray: List[int] + m_IKOnFeet: bool + m_Loop: bool + m_Speed: float + m_TagID: int + m_TransitionConstantArray: List[OffsetPtr] + m_CycleOffset: Optional[float] = None + m_CycleOffsetParamID: Optional[int] = None + m_FullPathID: Optional[int] = None + m_ID: Optional[int] = None + m_LeafInfoArray: Optional[List[LeafInfoConstant]] = None + m_Mirror: Optional[bool] = None + m_MirrorParamID: Optional[int] = None + m_NameID: Optional[int] = None + m_PathID: Optional[int] = None + m_SpeedParamID: Optional[int] = None + m_TimeParamID: Optional[int] = None + m_WriteDefaultValues: Optional[bool] = None @unitypy_define class StateKey: - m_LayerIndex: int - m_StateID: int + m_LayerIndex: int + m_StateID: int @unitypy_define class StateMachine(NamedObject): - m_AnyStatePosition: Vector3f - m_ChildStateMachine: List[PPtr[StateMachine]] - m_ChildStateMachinePosition: List[Vector3f] - m_DefaultState: PPtr[State] - m_MotionSetCount: int - m_Name: str - m_OrderedTransitions: List[Tuple[PPtr[State], List[PPtr[Transition]]]] - m_ParentStateMachinePosition: Vector3f - m_States: List[PPtr[State]] - m_LocalTransitions: Optional[List[Tuple[PPtr[State], List[PPtr[Transition]]]]] = ( - None - ) + m_AnyStatePosition: Vector3f + m_ChildStateMachine: List[PPtr[StateMachine]] + m_ChildStateMachinePosition: List[Vector3f] + m_DefaultState: PPtr[State] + m_MotionSetCount: int + m_Name: str + m_OrderedTransitions: List[Tuple[PPtr[State], List[PPtr[Transition]]]] + m_ParentStateMachinePosition: Vector3f + m_States: List[PPtr[State]] + m_LocalTransitions: Optional[List[Tuple[PPtr[State], List[PPtr[Transition]]]]] = None @unitypy_define class StateMachineBehaviourVectorDescription: - m_StateMachineBehaviourIndices: List[int] - m_StateMachineBehaviourRanges: List[Tuple[StateKey, StateRange]] + m_StateMachineBehaviourIndices: List[int] + m_StateMachineBehaviourRanges: List[Tuple[StateKey, StateRange]] @unitypy_define class StateMachineConstant: - m_AnyStateTransitionConstantArray: List[OffsetPtr] - m_DefaultState: int - m_StateConstantArray: List[OffsetPtr] - m_MotionSetCount: Optional[int] = None - m_SelectorStateConstantArray: Optional[List[OffsetPtr]] = None - m_SynchronizedLayerCount: Optional[int] = None + m_AnyStateTransitionConstantArray: List[OffsetPtr] + m_DefaultState: int + m_StateConstantArray: List[OffsetPtr] + m_EvaluateTransitionsOnStart: Optional[bool] = None + m_MotionSetCount: Optional[int] = None + m_SelectorStateConstantArray: Optional[List[OffsetPtr]] = None + m_SynchronizedLayerCount: Optional[int] = None @unitypy_define class StateRange: - m_Count: int - m_StartIndex: int + m_Count: int + m_StartIndex: int @unitypy_define class StaticBatchInfo: - firstSubMesh: int - subMeshCount: int + firstSubMesh: int + subMeshCount: int @unitypy_define class StreamInfo: - channelMask: int - offset: int - stride: int - align: Optional[int] = None - dividerOp: Optional[int] = None - frequency: Optional[int] = None + channelMask: int + offset: int + stride: int + align: Optional[int] = None + dividerOp: Optional[int] = None + frequency: Optional[int] = None @unitypy_define class StreamedClip: - curveCount: int - data: List[int] - discreteCurveCount: Optional[int] = None + curveCount: int + data: List[int] + discreteCurveCount: Optional[int] = None @unitypy_define class StreamedResource: - m_Offset: int - m_Size: int - m_Source: str + m_Offset: int + m_Size: int + m_Source: str @unitypy_define class StreamingInfo: - offset: int - path: str - size: int + offset: int + path: str + size: int @unitypy_define class StructParameter: - m_ArraySize: int - m_Index: int - m_MatrixMembers: List[MatrixParameter] - m_NameIndex: int - m_StructSize: int - m_VectorMembers: List[VectorParameter] + m_ArraySize: int + m_MatrixMembers: List[MatrixParameter] + m_NameIndex: int + m_StructSize: int + m_VectorMembers: List[VectorParameter] + m_Index: Optional[int] = None + m_OffsetInConstantBuffer: Optional[int] = None @unitypy_define class SubCollider: - m_Collider: PPtr[Collider2D] - m_ColliderPaths: List[List[IntPoint]] + m_Collider: PPtr[Collider2D] + m_ColliderPaths: List[List[IntPoint]] @unitypy_define class SubEmitterData: - emitter: PPtr[ParticleSystem] - properties: int - type: int - emitProbability: Optional[float] = None + emitter: PPtr[ParticleSystem] + properties: int + type: int + emitProbability: Optional[float] = None @unitypy_define class SubMesh: - firstByte: int - firstVertex: int - indexCount: int - localAABB: AABB - vertexCount: int - baseVertex: Optional[int] = None - isTriStrip: Optional[int] = None - topology: Optional[int] = None - triangleCount: Optional[int] = None + firstByte: int + firstVertex: int + indexCount: int + localAABB: AABB + vertexCount: int + baseVertex: Optional[int] = None + isTriStrip: Optional[int] = None + topology: Optional[int] = None + triangleCount: Optional[int] = None @unitypy_define class SubModule: - enabled: bool - subEmitterBirth: Optional[PPtr[ParticleSystem]] = None - subEmitterBirth1: Optional[PPtr[ParticleSystem]] = None - subEmitterCollision: Optional[PPtr[ParticleSystem]] = None - subEmitterCollision1: Optional[PPtr[ParticleSystem]] = None - subEmitterDeath: Optional[PPtr[ParticleSystem]] = None - subEmitterDeath1: Optional[PPtr[ParticleSystem]] = None - subEmitters: Optional[List[SubEmitterData]] = None + enabled: bool + subEmitterBirth: Optional[PPtr[ParticleSystem]] = None + subEmitterBirth1: Optional[PPtr[ParticleSystem]] = None + subEmitterCollision: Optional[PPtr[ParticleSystem]] = None + subEmitterCollision1: Optional[PPtr[ParticleSystem]] = None + subEmitterDeath: Optional[PPtr[ParticleSystem]] = None + subEmitterDeath1: Optional[PPtr[ParticleSystem]] = None + subEmitters: Optional[List[SubEmitterData]] = None @unitypy_define class SubPassDescriptor: - colorOutputs: AttachmentIndexArray - flags: int - inputs: AttachmentIndexArray + colorOutputs: AttachmentIndexArray + flags: int + inputs: AttachmentIndexArray @unitypy_define class SubstanceEnumItem: - text: str - value: int + text: str + value: int @unitypy_define class SubstanceInput: - alteredTexturesUID: List[int] - enumValues: List[SubstanceEnumItem] - flags: int - internalIndex: int - internalType: int - maximum: float - minimum: float - name: str - step: float - type: int - value: SubstanceValue - componentLabels: Optional[List[str]] = None - group: Optional[str] = None - internalIdentifier: Optional[int] = None - label: Optional[str] = None - visibleIf: Optional[str] = None + alteredTexturesUID: List[int] + enumValues: List[SubstanceEnumItem] + flags: int + internalIndex: int + internalType: int + maximum: float + minimum: float + name: str + step: float + type: int + value: SubstanceValue + componentLabels: Optional[List[str]] = None + group: Optional[str] = None + internalIdentifier: Optional[int] = None + label: Optional[str] = None + visibleIf: Optional[str] = None @unitypy_define class SubstanceValue: - scalar_0_: float - scalar_1_: float - scalar_2_: float - scalar_3_: float - texture: PPtr[Texture2D] - stringvalue: Optional[str] = None + scalar_0_: float + scalar_1_: float + scalar_2_: float + scalar_3_: float + texture: PPtr[Texture2D] + stringvalue: Optional[str] = None @unitypy_define class TakeInfo: - bakeStartTime: float - bakeStopTime: float - clip: PPtr[AnimationClip] - defaultClipName: str - name: str - sampleRate: float - startTime: float - stopTime: float - internalID: Optional[int] = None + bakeStartTime: float + bakeStopTime: float + clip: PPtr[AnimationClip] + defaultClipName: str + name: str + sampleRate: float + startTime: float + stopTime: float + internalID: Optional[int] = None @unitypy_define class Tetrahedron: - indices_0_: int - indices_1_: int - indices_2_: int - indices_3_: int - matrix: Matrix3x4f - neighbors_0_: int - neighbors_1_: int - neighbors_2_: int - neighbors_3_: int + indices_0_: int + indices_1_: int + indices_2_: int + indices_3_: int + matrix: Matrix3x4f + neighbors_0_: int + neighbors_1_: int + neighbors_2_: int + neighbors_3_: int @unitypy_define class TextureImportInstructions: - colorSpace: int - compressedFormat: int - compressionQuality: int - height: int - uncompressedFormat: int - usageMode: int - width: int - androidETC2FallbackDownscale: Optional[bool] = None - androidETC2FallbackFormat: Optional[int] = None - cubeIntermediateSize: Optional[int] = None - cubeLayout: Optional[int] = None - cubeMode: Optional[int] = None - depth: Optional[int] = None - desiredFormat: Optional[int] = None - recommendedFormat: Optional[int] = None - vtOnly: Optional[bool] = None + colorSpace: int + compressedFormat: int + compressionQuality: int + height: int + uncompressedFormat: int + usageMode: int + width: int + androidETC2FallbackDownscale: Optional[bool] = None + androidETC2FallbackFormat: Optional[int] = None + cubeIntermediateSize: Optional[int] = None + cubeLayout: Optional[int] = None + cubeMode: Optional[int] = None + depth: Optional[int] = None + desiredFormat: Optional[int] = None + recommendedFormat: Optional[int] = None + vtOnly: Optional[bool] = None @unitypy_define class TextureImportOutput: - sourceTextureInformation: SourceTextureInformation - textureImportInstructions: TextureImportInstructions - importInspectorWarnings: Optional[str] = None + sourceTextureInformation: SourceTextureInformation + textureImportInstructions: TextureImportInstructions + importInspectorWarnings: Optional[str] = None @unitypy_define class TextureImporterPlatformSettings: - m_AllowsAlphaSplitting: bool - m_AndroidETC2FallbackOverride: int - m_BuildTarget: str - m_CompressionQuality: int - m_CrunchedCompression: bool - m_MaxTextureSize: int - m_Overridden: bool - m_ResizeAlgorithm: int - m_TextureCompression: int - m_TextureFormat: int - m_ForceMaximumCompressionQuality_BC6H_BC7: Optional[bool] = None - m_IgnorePlatformSupport: Optional[bool] = None + m_AllowsAlphaSplitting: bool + m_AndroidETC2FallbackOverride: int + m_BuildTarget: str + m_CompressionQuality: int + m_CrunchedCompression: bool + m_MaxTextureSize: int + m_Overridden: bool + m_ResizeAlgorithm: int + m_TextureCompression: int + m_TextureFormat: int + m_ForceMaximumCompressionQuality_BC6H_BC7: Optional[bool] = None + m_IgnorePlatformSupport: Optional[bool] = None @unitypy_define class TextureParameter: - m_Dim: int - m_Index: int - m_NameIndex: int - m_SamplerIndex: int - m_MultiSampled: Optional[bool] = None + m_Dim: int + m_NameIndex: int + m_Binding: Optional[Binding] = None + m_Index: Optional[int] = None + m_MultiSampled: Optional[bool] = None + m_SamplerBinding: Optional[Binding] = None + m_SamplerIndex: Optional[int] = None @unitypy_define class TextureParameters: - height: int - mipLevels: int - textureFormat: int - width: int + height: int + mipLevels: int + textureFormat: int + width: int @unitypy_define class TextureSettings: - anisoLevel: int - compressionQuality: int - crunchedCompression: bool - filterMode: int - generateMipMaps: bool - maxTextureSize: int - readable: bool - sRGB: bool - textureCompression: int + anisoLevel: int + compressionQuality: int + crunchedCompression: bool + filterMode: int + generateMipMaps: bool + maxTextureSize: int + readable: bool + sRGB: bool + textureCompression: int @unitypy_define class TicksPerSecond: - m_Denominator: int - m_Numerator: int + m_Denominator: int + m_Numerator: int @unitypy_define class TierGraphicsSettings: - renderingPath: int - useCascadedShadowMaps: bool - enableLPPV: Optional[bool] = None - hdrMode: Optional[int] = None - prefer32BitShadowMaps: Optional[bool] = None - realtimeGICPUUsage: Optional[int] = None - useHDR: Optional[bool] = None + renderingPath: int + useCascadedShadowMaps: bool + enableLPPV: Optional[bool] = None + hdrMode: Optional[int] = None + prefer32BitShadowMaps: Optional[bool] = None + realtimeGICPUUsage: Optional[int] = None + useHDR: Optional[bool] = None @unitypy_define class Tile: - m_TileColorIndex: int - m_TileIndex: int - m_TileMatrixIndex: int - m_TileSpriteIndex: int - dummyAlignment: Optional[int] = None - m_AllTileFlags: Optional[int] = None - m_ColliderType: Optional[int] = None - m_ObjectToInstantiate: Optional[PPtr[GameObject]] = None - m_TileFlags: Optional[int] = None - m_TileObjectToInstantiateIndex: Optional[int] = None + m_TileColorIndex: int + m_TileIndex: int + m_TileMatrixIndex: int + m_TileSpriteIndex: int + dummyAlignment: Optional[int] = None + m_AllTileFlags: Optional[int] = None + m_ColliderType: Optional[int] = None + m_ObjectToInstantiate: Optional[PPtr[GameObject]] = None + m_TileFlags: Optional[int] = None + m_TileObjectToInstantiateIndex: Optional[int] = None @unitypy_define class TileAnimationData: - m_AnimatedSprites: List[PPtr[Sprite]] - m_AnimationSpeed: float - m_AnimationTimeOffset: float - m_Flags: Optional[int] = None - m_IsLooping: Optional[bool] = None + m_AnimatedSprites: List[PPtr[Sprite]] + m_AnimationSpeed: float + m_AnimationTimeOffset: float + m_Flags: Optional[int] = None + m_IsLooping: Optional[bool] = None @unitypy_define class TilemapRefCountedData: - m_Data: Union[PPtr[GameObject], ColorRGBA, PPtr[Object], Matrix4x4f, PPtr[Sprite]] - m_RefCount: int + m_Data: Union[ColorRGBA, Matrix4x4f, PPtr[GameObject], PPtr[Object], PPtr[Sprite]] + m_RefCount: int @unitypy_define class TrailModule: - colorOverLifetime: MinMaxGradient - colorOverTrail: MinMaxGradient - dieWithParticles: bool - enabled: bool - inheritParticleColor: bool - lifetime: MinMaxCurve - minVertexDistance: float - ratio: float - sizeAffectsLifetime: bool - sizeAffectsWidth: bool - textureMode: int - widthOverTrail: MinMaxCurve - worldSpace: bool - attachRibbonsToTransform: Optional[bool] = None - generateLightingData: Optional[bool] = None - mode: Optional[int] = None - ribbonCount: Optional[int] = None - shadowBias: Optional[float] = None - splitSubEmitterRibbons: Optional[bool] = None - textureScale: Optional[Vector2f] = None + colorOverLifetime: MinMaxGradient + colorOverTrail: MinMaxGradient + dieWithParticles: bool + enabled: bool + inheritParticleColor: bool + lifetime: MinMaxCurve + minVertexDistance: float + ratio: float + sizeAffectsLifetime: bool + sizeAffectsWidth: bool + textureMode: int + widthOverTrail: MinMaxCurve + worldSpace: bool + attachRibbonsToTransform: Optional[bool] = None + generateLightingData: Optional[bool] = None + mode: Optional[int] = None + ribbonCount: Optional[int] = None + shadowBias: Optional[float] = None + splitSubEmitterRibbons: Optional[bool] = None + textureScale: Optional[Vector2f] = None @unitypy_define class TransformMaskElement: - m_Path: str - m_Weight: float + m_Path: str + m_Weight: float @unitypy_define class Transition(NamedObject): - m_Atomic: bool - m_Conditions: List[Condition] - m_DstState: PPtr[State] - m_Mute: bool - m_Name: str - m_Solo: bool - m_SrcState: PPtr[State] - m_TransitionDuration: float - m_TransitionOffset: float - m_CanTransitionToSelf: Optional[bool] = None + m_Atomic: bool + m_Conditions: List[Condition] + m_DstState: PPtr[State] + m_Mute: bool + m_Name: str + m_Solo: bool + m_SrcState: PPtr[State] + m_TransitionDuration: float + m_TransitionOffset: float + m_CanTransitionToSelf: Optional[bool] = None @unitypy_define class TransitionConstant: - m_ConditionConstantArray: List[OffsetPtr] - m_DestinationState: int - m_ID: int - m_TransitionDuration: float - m_TransitionOffset: float - m_UserID: int - m_Atomic: Optional[bool] = None - m_CanTransitionToSelf: Optional[bool] = None - m_ExitTime: Optional[float] = None - m_FullPathID: Optional[int] = None - m_HasExitTime: Optional[bool] = None - m_HasFixedDuration: Optional[bool] = None - m_InterruptionSource: Optional[int] = None - m_OrderedInterruption: Optional[bool] = None + m_ConditionConstantArray: List[OffsetPtr] + m_DestinationState: int + m_ID: int + m_TransitionDuration: float + m_TransitionOffset: float + m_UserID: int + m_Atomic: Optional[bool] = None + m_CanTransitionToSelf: Optional[bool] = None + m_ExitTime: Optional[float] = None + m_FullPathID: Optional[int] = None + m_HasExitTime: Optional[bool] = None + m_HasFixedDuration: Optional[bool] = None + m_InterruptionSource: Optional[int] = None + m_OrderedInterruption: Optional[bool] = None @unitypy_define class TreeInstance: - color: ColorRGBA - heightScale: float - index: int - lightmapColor: ColorRGBA - position: Vector3f - widthScale: float - rotation: Optional[float] = None + color: ColorRGBA + heightScale: float + index: int + lightmapColor: ColorRGBA + position: Vector3f + widthScale: float + rotation: Optional[float] = None @unitypy_define class TreePrototype: - bendFactor: float - prefab: PPtr[GameObject] - navMeshLod: Optional[int] = None + bendFactor: float + prefab: PPtr[GameObject] + navMeshLod: Optional[int] = None @unitypy_define class TriggerModule: - enabled: bool - enter: int - exit: int - inside: int - outside: int - radiusScale: float - colliderQueryMode: Optional[int] = None - collisionShape0: Optional[PPtr[Component]] = None - collisionShape1: Optional[PPtr[Component]] = None - collisionShape2: Optional[PPtr[Component]] = None - collisionShape3: Optional[PPtr[Component]] = None - collisionShape4: Optional[PPtr[Component]] = None - collisionShape5: Optional[PPtr[Component]] = None - primitives: Optional[List[PPtr[Component]]] = None + enabled: bool + enter: int + exit: int + inside: int + outside: int + radiusScale: float + colliderQueryMode: Optional[int] = None + collisionShape0: Optional[PPtr[Component]] = None + collisionShape1: Optional[PPtr[Component]] = None + collisionShape2: Optional[PPtr[Component]] = None + collisionShape3: Optional[PPtr[Component]] = None + collisionShape4: Optional[PPtr[Component]] = None + collisionShape5: Optional[PPtr[Component]] = None + primitives: Optional[List[PPtr[Component]]] = None + + +@unitypy_define +class TypeStats: + classID: int + objectCount: int + resourceCount: int + size: int @unitypy_define class UAVParameter: - m_Index: int - m_NameIndex: int - m_OriginalIndex: int + m_NameIndex: int + m_Binding: Optional[Binding] = None + m_Index: Optional[int] = None + m_OriginalBinding: Optional[Binding] = None + m_OriginalIndex: Optional[int] = None @unitypy_define class UVAnimation: - cycles: float - x_Tile: int - y_Tile: int + cycles: float + x_Tile: int + y_Tile: int @unitypy_define class UVModule: - animationType: int - cycles: float - enabled: bool - frameOverTime: MinMaxCurve - rowIndex: int - tilesX: int - tilesY: int - flipU: Optional[float] = None - flipV: Optional[float] = None - fps: Optional[float] = None - mode: Optional[int] = None - randomRow: Optional[bool] = None - rowMode: Optional[int] = None - speedRange: Optional[Vector2f] = None - sprites: Optional[List[SpriteData]] = None - startFrame: Optional[MinMaxCurve] = None - timeMode: Optional[int] = None - uvChannelMask: Optional[int] = None + animationType: int + cycles: float + enabled: bool + frameOverTime: MinMaxCurve + rowIndex: int + tilesX: int + tilesY: int + flipU: Optional[float] = None + flipV: Optional[float] = None + fps: Optional[float] = None + mode: Optional[int] = None + randomRow: Optional[bool] = None + rowMode: Optional[int] = None + speedRange: Optional[Vector2f] = None + sprites: Optional[List[SpriteData]] = None + startFrame: Optional[MinMaxCurve] = None + timeMode: Optional[int] = None + uvChannelMask: Optional[int] = None @unitypy_define class UnityAdsSettings(GlobalGameManager): - m_Enabled: bool - m_InitializeOnStartup: bool - m_TestMode: bool - m_AndroidGameId: Optional[str] = None - m_EnabledPlatforms: Optional[int] = None - m_GameId: Optional[str] = None - m_IosGameId: Optional[str] = None + m_Enabled: bool + m_InitializeOnStartup: bool + m_TestMode: bool + m_AndroidGameId: Optional[str] = None + m_EnabledPlatforms: Optional[int] = None + m_GameId: Optional[str] = None + m_IosGameId: Optional[str] = None @unitypy_define class UnityAnalyticsSettings: - m_Enabled: bool - m_InitializeOnStartup: bool - m_TestMode: bool - m_PackageRequiringCoreStatsPresent: Optional[bool] = None - m_TestConfigUrl: Optional[str] = None - m_TestEventUrl: Optional[str] = None + m_Enabled: bool + m_TestMode: bool + m_InitializeOnStartup: Optional[bool] = None + m_PackageRequiringCoreStatsPresent: Optional[bool] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None @unitypy_define class UnityPropertySheet: - m_Colors: Union[ - List[Tuple[FastPropertyName, ColorRGBA]], List[Tuple[str, ColorRGBA]] - ] - m_Floats: Union[List[Tuple[FastPropertyName, float]], List[Tuple[str, float]]] - m_TexEnvs: Union[ - List[Tuple[FastPropertyName, UnityTexEnv]], List[Tuple[str, UnityTexEnv]] - ] - m_Ints: Optional[List[Tuple[str, int]]] = None + m_Colors: Union[List[Tuple[FastPropertyName, ColorRGBA]], List[Tuple[str, ColorRGBA]]] + m_Floats: Union[List[Tuple[FastPropertyName, float]], List[Tuple[str, float]]] + m_TexEnvs: Union[List[Tuple[FastPropertyName, UnityTexEnv]], List[Tuple[str, UnityTexEnv]]] + m_Ints: Optional[List[Tuple[str, int]]] = None @unitypy_define class UnityPurchasingSettings: - m_Enabled: bool - m_TestMode: bool + m_Enabled: bool + m_TestMode: bool + + +@unitypy_define +class UnitySceneHandle: + value: EntityId @unitypy_define class UnityTexEnv: - m_Offset: Vector2f - m_Scale: Vector2f - m_Texture: PPtr[Texture] + m_Offset: Vector2f + m_Scale: Vector2f + m_Texture: PPtr[Texture] @unitypy_define class UpdateZoneInfo: - needSwap: bool - passIndex: int - rotation: float - updateZoneCenter: Vector3f - updateZoneSize: Vector3f + needSwap: bool + passIndex: int + rotation: float + updateZoneCenter: Vector3f + updateZoneSize: Vector3f @unitypy_define class VFXCPUBufferData: - data: List[int] + data: List[int] @unitypy_define class VFXCPUBufferDesc: - capacity: int - initialData: VFXCPUBufferData - layout: List[VFXLayoutElementDesc] - stride: int + capacity: int + initialData: VFXCPUBufferData + layout: List[VFXLayoutElementDesc] + stride: int + debugName: Optional[str] = None @unitypy_define class VFXEditorSystemDesc: - buffers: List[VFXMapping] - capacity: int - flags: int - layer: int - tasks: List[VFXEditorTaskDesc] - type: int - values: List[VFXMapping] - name: Optional[str] = None + buffers: List[VFXMapping] + capacity: int + flags: int + layer: int + tasks: List[VFXEditorTaskDesc] + type: int + values: List[VFXMapping] + name: Optional[str] = None @unitypy_define class VFXEditorTaskDesc: - buffers: List[VFXMapping] - params: List[VFXMapping] - processor: PPtr[NamedObject] - shaderSourceIndex: int - type: int - values: List[VFXMapping] - temporaryBuffers: Optional[List[VFXMappingTemporary]] = None + buffers: List[VFXMapping] + params: List[VFXMapping] + processor: PPtr[NamedObject] + shaderSourceIndex: int + type: int + values: List[VFXMapping] + temporaryBuffers: Optional[List[VFXMappingTemporary]] = None @unitypy_define class VFXEntryExposed: - m_Name: str - m_Overridden: bool - m_Value: Union[ - Gradient, - Vector3f, - float, - PPtr[NamedObject], - Vector4f, - AnimationCurve, - PPtr[Object], - int, - Vector2f, - bool, - Matrix4x4f, - ] + m_Name: str + m_Overridden: bool + m_Value: Union[AnimationCurve, Gradient, Matrix4x4f, PPtr[NamedObject], PPtr[Object], Vector2f, Vector3f, Vector4f, bool, float, int] @unitypy_define class VFXEntryExpressionValue: - m_ExpressionIndex: int - m_Value: Union[ - Gradient, - Vector3f, - float, - PPtr[NamedObject], - Vector4f, - AnimationCurve, - PPtr[Object], - int, - Vector2f, - bool, - Matrix4x4f, - ] + m_ExpressionIndex: int + m_Value: Union[AnimationCurve, Gradient, Matrix4x4f, PPtr[NamedObject], PPtr[Object], Vector2f, Vector3f, Vector4f, bool, float, int] @unitypy_define class VFXEventDesc: - name: str - playSystems: List[int] - stopSystems: List[int] - initSystems: Optional[List[int]] = None + name: str + playSystems: List[int] + stopSystems: List[int] + initSystems: Optional[List[int]] = None @unitypy_define class VFXExposedMapping: - mapping: VFXMapping - space: int + mapping: VFXMapping + space: int @unitypy_define class VFXExpressionContainer: - m_Expressions: List[Expression] - m_NeedsLocalToWorld: bool - m_NeedsWorldToLocal: bool - m_ConstantBakeCurveCount: Optional[int] = None - m_ConstantBakeGradientCount: Optional[int] = None - m_DynamicBakeCurveCount: Optional[int] = None - m_DynamicBakeGradientCount: Optional[int] = None - m_MaxCommonExpressionsIndex: Optional[int] = None - m_NeededMainCameraBuffers: Optional[int] = None - m_NeedsMainCamera: Optional[bool] = None + m_Expressions: List[Expression] + m_NeedsLocalToWorld: bool + m_NeedsWorldToLocal: bool + m_ConstantBakeCurveCount: Optional[int] = None + m_ConstantBakeGradientCount: Optional[int] = None + m_DynamicBakeCurveCount: Optional[int] = None + m_DynamicBakeGradientCount: Optional[int] = None + m_MaxCommonExpressionsIndex: Optional[int] = None + m_NeededMainCameraBuffers: Optional[int] = None + m_NeedsMainCamera: Optional[bool] = None @unitypy_define class VFXField: - m_Array: Union[List[VFXEntryExpressionValue], List[VFXEntryExposed]] + m_Array: Union[List[VFXEntryExposed], List[VFXEntryExpressionValue]] @unitypy_define class VFXGPUBufferDesc: - capacity: int - layout: List[VFXLayoutElementDesc] - size: int - stride: int - mode: Optional[int] = None - target: Optional[int] = None - type: Optional[int] = None + capacity: int + layout: List[VFXLayoutElementDesc] + size: int + stride: int + debugName: Optional[str] = None + mode: Optional[int] = None + target: Optional[int] = None + type: Optional[int] = None @unitypy_define class VFXInstanceSplitDesc: - values: List[int] + values: List[int] @unitypy_define class VFXLayoutElementDesc: - name: str - offset: VFXLayoutOffset - type: int + name: str + offset: VFXLayoutOffset + type: int @unitypy_define class VFXLayoutOffset: - bucket: int - element: int - structure: int + bucket: int + element: int + structure: int @unitypy_define class VFXMapping: - index: int - nameId: str + index: int + nameId: str @unitypy_define class VFXMappingTemporary: - mapping: VFXMapping - pastFrameIndex: int - perCameraBuffer: bool + mapping: VFXMapping + pastFrameIndex: int + perCameraBuffer: bool @unitypy_define class VFXPropertySheetSerializedBase: - m_AnimationCurve: VFXField - m_Bool: VFXField - m_Float: VFXField - m_Gradient: VFXField - m_Int: VFXField - m_Matrix4x4f: VFXField - m_NamedObject: VFXField - m_Uint: VFXField - m_Vector2f: VFXField - m_Vector3f: VFXField - m_Vector4f: VFXField + m_AnimationCurve: VFXField + m_Bool: VFXField + m_Float: VFXField + m_Gradient: VFXField + m_Int: VFXField + m_Matrix4x4f: VFXField + m_NamedObject: VFXField + m_Uint: VFXField + m_Vector2f: VFXField + m_Vector3f: VFXField + m_Vector4f: VFXField @unitypy_define class VFXRendererSettings: - lightProbeUsage: int - motionVectorGenerationMode: int - receiveShadows: bool - reflectionProbeUsage: int - shadowCastingMode: int - rayTracingMode: Optional[int] = None + motionVectorGenerationMode: int + shadowCastingMode: int + lightProbeUsage: Optional[int] = None + rayTracingMode: Optional[int] = None + receiveShadows: Optional[bool] = None + reflectionProbeUsage: Optional[int] = None + transparencyPriority: Optional[int] = None @unitypy_define class VFXShaderSourceDesc: - compute: bool - name: str - source: str + compute: bool + name: str + source: str @unitypy_define class VFXSystemDesc: - buffers: List[VFXMapping] - capacity: int - flags: int - layer: int - tasks: List[VFXTaskDesc] - type: int - values: List[VFXMapping] - instanceSplitDescs: Optional[List[VFXInstanceSplitDesc]] = None - name: Optional[str] = None + buffers: List[VFXMapping] + capacity: int + flags: int + layer: int + tasks: List[VFXTaskDesc] + type: int + values: List[VFXMapping] + instanceSplitDescs: Optional[List[VFXInstanceSplitDesc]] = None + name: Optional[str] = None @unitypy_define class VFXTaskDesc: - buffers: List[VFXMapping] - params: List[VFXMapping] - processor: PPtr[NamedObject] - type: int - values: List[VFXMapping] - instanceSplitIndex: Optional[int] = None - temporaryBuffers: Optional[List[VFXMappingTemporary]] = None + buffers: List[VFXMapping] + params: List[VFXMapping] + processor: Union[PPtr[NamedObject], PPtr[Object]] + type: int + values: List[VFXMapping] + instanceSplitIndex: Optional[int] = None + temporaryBuffers: Optional[List[VFXMappingTemporary]] = None @unitypy_define class VFXTemplate: - category: str - description: str - icon: PPtr[Texture2D] - name: str - thumbnail: PPtr[Texture2D] + category: str + description: str + icon: PPtr[Texture2D] + name: str + thumbnail: PPtr[Texture2D] + order: Optional[int] = None @unitypy_define class VFXTemporaryGPUBufferDesc: - desc: VFXGPUBufferDesc - frameCount: int + desc: VFXGPUBufferDesc + frameCount: int @unitypy_define class VRSettings: - cardboard: Optional[Google] = None - daydream: Optional[Google] = None - enable360StereoCapture: Optional[bool] = None - hololens: Optional[HoloLens] = None - lumin: Optional[Lumin] = None - none: Optional[DeviceNone] = None - oculus: Optional[Oculus] = None + cardboard: Optional[Google] = None + daydream: Optional[Google] = None + enable360StereoCapture: Optional[bool] = None + hololens: Optional[HoloLens] = None + lumin: Optional[Lumin] = None + none: Optional[DeviceNone] = None + oculus: Optional[Oculus] = None @unitypy_define class ValueArray: - m_BoolValues: List[bool] - m_FloatValues: List[float] - m_IntValues: List[int] - m_PositionValues: Optional[Union[List[float4], List[float3]]] = None - m_QuaternionValues: Optional[List[float4]] = None - m_ScaleValues: Optional[Union[List[float4], List[float3]]] = None - m_VectorValues: Optional[List[float4]] = None + m_BoolValues: List[bool] + m_FloatValues: List[float] + m_IntValues: List[int] + m_EntityIdValues: Optional[List[EntityId]] = None + m_PositionValues: Optional[Union[List[float3], List[float4]]] = None + m_QuaternionValues: Optional[List[float4]] = None + m_ScaleValues: Optional[Union[List[float3], List[float4]]] = None + m_VectorValues: Optional[List[float4]] = None @unitypy_define class ValueArrayConstant: - m_ValueArray: List[ValueConstant] + m_ValueArray: List[ValueConstant] @unitypy_define class ValueConstant: - m_ID: int - m_Index: int - m_Type: int - m_TypeID: Optional[int] = None + m_ID: int + m_Index: int + m_Type: int + m_TypeID: Optional[int] = None @unitypy_define class ValueDelta: - m_Start: float - m_Stop: float + m_Start: float + m_Stop: float @unitypy_define class VariableBoneCountWeights: - m_Data: List[int] + m_Data: List[int] @unitypy_define class VariantInfo: - graphicsStateInfoSet: Optional[List[GraphicsStateInfo]] = None - keywordNames: Optional[str] = None - keywords: Optional[str] = None - passIndex: Optional[int] = None - passType: Optional[int] = None - shader: Optional[PPtr[Shader]] = None - shaderAssetGUID: Optional[str] = None - shaderName: Optional[str] = None - subShaderIndex: Optional[int] = None + graphicsStateInfoSet: Optional[List[GraphicsStateInfo]] = None + keywordNames: Optional[str] = None + keywords: Optional[str] = None + passIndex: Optional[int] = None + passType: Optional[int] = None + shader: Optional[PPtr[Shader]] = None + shaderAssetGUID: Optional[str] = None + shaderAssetLocalIdentifierInFile: Optional[int] = None + shaderName: Optional[str] = None + subShaderIndex: Optional[int] = None @unitypy_define class Vector3Curve: - curve: AnimationCurve - path: str + curve: AnimationCurve + path: str @unitypy_define class VectorParameter: - m_ArraySize: int - m_Dim: int - m_Index: int - m_NameIndex: int - m_Type: int + m_ArraySize: int + m_Dim: int + m_NameIndex: int + m_Type: int + m_Index: Optional[int] = None + m_OffsetInConstantBuffer: Optional[int] = None @unitypy_define class VelocityModule: - enabled: bool - inWorldSpace: bool - x: MinMaxCurve - y: MinMaxCurve - z: MinMaxCurve - orbitalOffsetX: Optional[MinMaxCurve] = None - orbitalOffsetY: Optional[MinMaxCurve] = None - orbitalOffsetZ: Optional[MinMaxCurve] = None - orbitalX: Optional[MinMaxCurve] = None - orbitalY: Optional[MinMaxCurve] = None - orbitalZ: Optional[MinMaxCurve] = None - radial: Optional[MinMaxCurve] = None - speedModifier: Optional[MinMaxCurve] = None + enabled: bool + inWorldSpace: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve + orbitalOffsetX: Optional[MinMaxCurve] = None + orbitalOffsetY: Optional[MinMaxCurve] = None + orbitalOffsetZ: Optional[MinMaxCurve] = None + orbitalX: Optional[MinMaxCurve] = None + orbitalY: Optional[MinMaxCurve] = None + orbitalZ: Optional[MinMaxCurve] = None + radial: Optional[MinMaxCurve] = None + speedModifier: Optional[MinMaxCurve] = None @unitypy_define class VertexData: - m_DataSize: bytes - m_VertexCount: int - m_Channels: Optional[List[ChannelInfo]] = None - m_CurrentChannels: Optional[int] = None - m_Streams: Optional[List[StreamInfo]] = None - m_Streams_0_: Optional[StreamInfo] = None - m_Streams_1_: Optional[StreamInfo] = None - m_Streams_2_: Optional[StreamInfo] = None - m_Streams_3_: Optional[StreamInfo] = None + m_DataSize: bytes + m_VertexCount: int + m_Channels: Optional[List[ChannelInfo]] = None + m_CurrentChannels: Optional[int] = None + m_Streams: Optional[List[StreamInfo]] = None + m_Streams_0_: Optional[StreamInfo] = None + m_Streams_1_: Optional[StreamInfo] = None + m_Streams_2_: Optional[StreamInfo] = None + m_Streams_3_: Optional[StreamInfo] = None @unitypy_define class VertexLayoutInfo: - vertexChannelsInfo: List[ChannelInfo] - vertexStreamCount: int - vertexStrides: List[int] + vertexChannelsInfo: List[ChannelInfo] + vertexStreamCount: int + vertexStrides: List[int] @unitypy_define class VideoClipImporterOutput: - encodedEndFrame: Optional[int] = None - encodedHeight: Optional[int] = None - encodedSettings: Optional[VideoClipImporterTargetSettings] = None - encodedStartFrame: Optional[int] = None - encodedWidth: Optional[int] = None - format: Optional[int] = None - originalFrameCount: Optional[int] = None - originalHeight: Optional[int] = None - originalWidth: Optional[int] = None - settings: Optional[VideoClipImporterTargetSettings] = None - sourceAudioChannelCount: Optional[List[int]] = None - sourceAudioSampleRate: Optional[List[int]] = None - sourceFileSize: Optional[int] = None - sourceFrameRate: Optional[float] = None - sourceHasAlpha: Optional[bool] = None - sourcePixelAspectRatioDenominator: Optional[int] = None - sourcePixelAspectRatioNumerator: Optional[int] = None - streamedResource: Optional[StreamedResource] = None - transcodeSkipped: Optional[bool] = None + encodedEndFrame: Optional[int] = None + encodedHeight: Optional[int] = None + encodedSettings: Optional[VideoClipImporterTargetSettings] = None + encodedStartFrame: Optional[int] = None + encodedWidth: Optional[int] = None + format: Optional[int] = None + originalFrameCount: Optional[int] = None + originalHeight: Optional[int] = None + originalWidth: Optional[int] = None + settings: Optional[VideoClipImporterTargetSettings] = None + sourceAudioChannelCount: Optional[List[int]] = None + sourceAudioSampleRate: Optional[List[int]] = None + sourceFileSize: Optional[int] = None + sourceFrameRate: Optional[float] = None + sourceHasAlpha: Optional[bool] = None + sourcePixelAspectRatioDenominator: Optional[int] = None + sourcePixelAspectRatioNumerator: Optional[int] = None + streamedResource: Optional[StreamedResource] = None + transcodeSkipped: Optional[bool] = None @unitypy_define class VideoClipImporterTargetSettings: - aspectRatio: int - bitrateMode: int - codec: int - customHeight: int - customWidth: int - enableTranscoding: bool - resizeFormat: int - spatialQuality: int + aspectRatio: int + bitrateMode: int + codec: int + customHeight: int + customWidth: int + enableTranscoding: bool + resizeFormat: int + spatialQuality: int @unitypy_define class VisualEffectInfo: - m_Buffers: List[VFXGPUBufferDesc] - m_CPUBuffers: List[VFXCPUBufferDesc] - m_CullingFlags: int - m_Events: List[VFXEventDesc] - m_ExposedExpressions: Union[List[VFXMapping], List[VFXExposedMapping]] - m_Expressions: VFXExpressionContainer - m_PropertySheet: VFXPropertySheetSerializedBase - m_RendererSettings: VFXRendererSettings - m_UpdateMode: int - m_CompilationVersion: Optional[int] = None - m_InitialEventName: Optional[str] = None - m_InstancingCapacity: Optional[int] = None - m_InstancingDisabledReason: Optional[int] = None - m_InstancingMode: Optional[int] = None - m_PreWarmDeltaTime: Optional[float] = None - m_PreWarmStepCount: Optional[int] = None - m_RuntimeVersion: Optional[int] = None - m_TemporaryBuffers: Optional[List[VFXTemporaryGPUBufferDesc]] = None + m_Buffers: List[VFXGPUBufferDesc] + m_CPUBuffers: List[VFXCPUBufferDesc] + m_CullingFlags: int + m_Events: List[VFXEventDesc] + m_ExposedExpressions: Union[List[VFXExposedMapping], List[VFXMapping]] + m_Expressions: VFXExpressionContainer + m_PropertySheet: VFXPropertySheetSerializedBase + m_RendererSettings: VFXRendererSettings + m_UpdateMode: int + m_CompilationVersion: Optional[int] = None + m_InitialEventName: Optional[str] = None + m_InstancingCapacity: Optional[int] = None + m_InstancingDisabledReason: Optional[int] = None + m_InstancingMode: Optional[int] = None + m_PreWarmDeltaTime: Optional[float] = None + m_PreWarmStepCount: Optional[int] = None + m_RuntimeVersion: Optional[int] = None + m_TemporaryBuffers: Optional[List[VFXTemporaryGPUBufferDesc]] = None @unitypy_define class VisualEffectSettings: - m_CullingFlags: int - m_InitialEventName: str - m_PreWarmDeltaTime: float - m_PreWarmStepCount: int - m_RendererSettings: VFXRendererSettings - m_UpdateMode: int - m_InstancingCapacity: Optional[int] = None - m_InstancingDisabledReason: Optional[int] = None - m_InstancingMode: Optional[int] = None + m_CullingFlags: int + m_InitialEventName: str + m_PreWarmDeltaTime: float + m_PreWarmStepCount: int + m_RendererSettings: VFXRendererSettings + m_UpdateMode: int + m_InstancingCapacity: Optional[int] = None + m_InstancingDisabledReason: Optional[int] = None + m_InstancingMode: Optional[int] = None + + +@unitypy_define +class VulkanGraphicsJobsDeviceFilterData: + filter: AndroidDeviceFilterData + preferredMode: int + + +@unitypy_define +class WebGPUDeviceFilterData: + browserName: str + browserVersion: str + browserVersionComparator: int + deviceType: int + features: List[int] + limits: List[WebGPUDeviceFilterLimit] + + +@unitypy_define +class WebGPUDeviceFilterLimit: + comparator: int + limit: int + value: int @unitypy_define class WheelFrictionCurve: - asymptoteSlip: Optional[float] = None - asymptoteValue: Optional[float] = None - extremumSlip: Optional[float] = None - extremumValue: Optional[float] = None - m_AsymptoteSlip: Optional[float] = None - m_AsymptoteValue: Optional[float] = None - m_ExtremumSlip: Optional[float] = None - m_ExtremumValue: Optional[float] = None - m_Stiffness: Optional[float] = None - stiffnessFactor: Optional[float] = None + asymptoteSlip: Optional[float] = None + asymptoteValue: Optional[float] = None + extremumSlip: Optional[float] = None + extremumValue: Optional[float] = None + m_AsymptoteSlip: Optional[float] = None + m_AsymptoteValue: Optional[float] = None + m_ExtremumSlip: Optional[float] = None + m_ExtremumValue: Optional[float] = None + m_Stiffness: Optional[float] = None + stiffnessFactor: Optional[float] = None @unitypy_define class bitset: - bitCount: int - bitblocks: bytes + bitCount: int + bitblocks: bytes @unitypy_define class int2_storage: - x: int - y: int + x: int + y: int @unitypy_define class int3_storage: - x: int - y: int - z: int + x: int + y: int + z: int @unitypy_define class xform: - q: float4 - s: Union[float3, float4] - t: Union[float3, float4] + q: float4 + s: Union[float3, float4] + t: Union[float3, float4] diff --git a/UnityPy/classes/legacy_patch/AudioClip.py b/UnityPy/classes/legacy_patch/AudioClip.py index 37a0052f1..7f74daba4 100644 --- a/UnityPy/classes/legacy_patch/AudioClip.py +++ b/UnityPy/classes/legacy_patch/AudioClip.py @@ -1,5 +1,5 @@ -from ..generated import AudioClip from ...enums import AUDIO_TYPE_EXTEMSION +from ..generated import AudioClip def _AudioClip_extension(self: AudioClip) -> str: diff --git a/UnityPy/classes/legacy_patch/AudioClip.pyi b/UnityPy/classes/legacy_patch/AudioClip.pyi index 6f8da3c19..f93994b73 100644 --- a/UnityPy/classes/legacy_patch/AudioClip.pyi +++ b/UnityPy/classes/legacy_patch/AudioClip.pyi @@ -3,29 +3,28 @@ from typing import Dict, List, Optional from UnityPy.classes.generated import SampleClip, StreamedResource class AudioClip(SampleClip): - m_Name: str - m_3D: Optional[bool] = None - m_Ambisonic: Optional[bool] = None - m_AudioData: Optional[List[int]] = None - m_BitsPerSample: Optional[int] = None - m_Channels: Optional[int] = None - m_CompressionFormat: Optional[int] = None - m_Format: Optional[int] = None - m_Frequency: Optional[int] = None - m_IsTrackerFormat: Optional[bool] = None - m_Legacy3D: Optional[bool] = None - m_Length: Optional[float] = None - m_LoadInBackground: Optional[bool] = None - m_LoadType: Optional[int] = None - m_PreloadAudioData: Optional[bool] = None - m_Resource: Optional[StreamedResource] = None - m_Stream: Optional[int] = None - m_SubsoundIndex: Optional[int] = None - m_Type: Optional[int] = None - m_UseHardware: Optional[bool] = None + m_Name: str + m_3D: Optional[bool] = None + m_Ambisonic: Optional[bool] = None + m_AudioData: Optional[List[int]] = None + m_BitsPerSample: Optional[int] = None + m_Channels: Optional[int] = None + m_CompressionFormat: Optional[int] = None + m_Format: Optional[int] = None + m_Frequency: Optional[int] = None + m_IsTrackerFormat: Optional[bool] = None + m_Legacy3D: Optional[bool] = None + m_Length: Optional[float] = None + m_LoadInBackground: Optional[bool] = None + m_LoadType: Optional[int] = None + m_PreloadAudioData: Optional[bool] = None + m_Resource: Optional[StreamedResource] = None + m_Stream: Optional[int] = None + m_SubsoundIndex: Optional[int] = None + m_Type: Optional[int] = None + m_UseHardware: Optional[bool] = None - @property - def extension(self) -> str: ... - - @property - def samples(self) -> Dict[str, bytes]: ... + @property + def extension(self) -> str: ... + @property + def samples(self) -> Dict[str, bytes]: ... diff --git a/UnityPy/classes/legacy_patch/GameObject.py b/UnityPy/classes/legacy_patch/GameObject.py index 5392b1d20..3b727d0bf 100644 --- a/UnityPy/classes/legacy_patch/GameObject.py +++ b/UnityPy/classes/legacy_patch/GameObject.py @@ -23,21 +23,11 @@ def _GameObject_GetComponent(self, type: ClassIDType) -> Union[PPtr[Component], GameObject.m_Components = property(_GameObject_Components) -GameObject.m_Animator = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) -) -GameObject.m_Animation = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) -) -GameObject.m_Transform = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) -) -GameObject.m_MeshRenderer = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) -) +GameObject.m_Animator = property(lambda self: _GameObject_GetComponent(self, ClassIDType.Animator)) +GameObject.m_Animation = property(lambda self: _GameObject_GetComponent(self, ClassIDType.Animation)) +GameObject.m_Transform = property(lambda self: _GameObject_GetComponent(self, ClassIDType.Transform)) +GameObject.m_MeshRenderer = property(lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer)) GameObject.m_SkinnedMeshRenderer = property( lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) ) -GameObject.m_MeshFilter = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) -) +GameObject.m_MeshFilter = property(lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter)) diff --git a/UnityPy/classes/legacy_patch/GameObject.pyi b/UnityPy/classes/legacy_patch/GameObject.pyi index 1a4143163..15fa33aa3 100644 --- a/UnityPy/classes/legacy_patch/GameObject.pyi +++ b/UnityPy/classes/legacy_patch/GameObject.pyi @@ -4,23 +4,23 @@ from UnityPy.classes import Component, PPtr from UnityPy.classes.generated import ComponentPair, EditorExtension class GameObject(EditorExtension): - m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] - m_IsActive: Union[bool, int] - m_Layer: int - m_Name: str - m_Tag: int + m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] + m_IsActive: Union[bool, int] + m_Layer: int + m_Name: str + m_Tag: int - @property - def m_Components(self) -> List[PPtr[Component]]: ... - @property - def m_Animator(self) -> Union[PPtr[Component], None]: ... - @property - def m_Animation(self) -> Union[PPtr[Component], None]: ... - @property - def m_Transform(self) -> Union[PPtr[Component], None]: ... - @property - def m_SkinnedMeshRenderer(self) -> Union[PPtr[Component], None]: ... - @property - def m_MeshRenderer(self) -> Union[PPtr[Component], None]: ... - @property - def m_MeshFilter(self) -> Union[PPtr[Component], None]: ... + @property + def m_Components(self) -> List[PPtr[Component]]: ... + @property + def m_Animator(self) -> Union[PPtr[Component], None]: ... + @property + def m_Animation(self) -> Union[PPtr[Component], None]: ... + @property + def m_Transform(self) -> Union[PPtr[Component], None]: ... + @property + def m_SkinnedMeshRenderer(self) -> Union[PPtr[Component], None]: ... + @property + def m_MeshRenderer(self) -> Union[PPtr[Component], None]: ... + @property + def m_MeshFilter(self) -> Union[PPtr[Component], None]: ... diff --git a/UnityPy/classes/legacy_patch/Mesh.pyi b/UnityPy/classes/legacy_patch/Mesh.pyi index 9d047012d..ee921b8c6 100644 --- a/UnityPy/classes/legacy_patch/Mesh.pyi +++ b/UnityPy/classes/legacy_patch/Mesh.pyi @@ -1,50 +1,58 @@ from typing import List, Optional, Union -from UnityPy.classes.generated import (AABB, BlendShapeData, BoneInfluence, - BoneWeights4, CompressedMesh, - MeshBlendShape, MeshBlendShapeVertex, - MinMaxAABB, NamedObject, StreamingInfo, - SubMesh, VariableBoneCountWeights, - VertexData) -from UnityPy.classes.math import (ColorRGBA, Matrix4x4f, Vector2f, Vector3f, - Vector4f) +from UnityPy.classes.generated import ( + AABB, + BlendShapeData, + BoneInfluence, + BoneWeights4, + CompressedMesh, + MeshBlendShape, + MeshBlendShapeVertex, + MinMaxAABB, + NamedObject, + StreamingInfo, + SubMesh, + VariableBoneCountWeights, + VertexData, +) +from UnityPy.classes.math import ColorRGBA, Matrix4x4f, Vector2f, Vector3f, Vector4f class Mesh(NamedObject): - m_BindPose: List[Matrix4x4f] - m_CompressedMesh: CompressedMesh - m_IndexBuffer: List[int] - m_LocalAABB: AABB - m_MeshCompression: int - m_MeshUsageFlags: int - m_Name: str - m_SubMeshes: List[SubMesh] - m_BakedConvexCollisionMesh: Optional[List[int]] = None - m_BakedTriangleCollisionMesh: Optional[List[int]] = None - m_BoneNameHashes: Optional[List[int]] = None - m_BonesAABB: Optional[List[MinMaxAABB]] = None - m_CollisionTriangles: Optional[List[int]] = None - m_CollisionVertexCount: Optional[int] = None - m_Colors: Optional[List[ColorRGBA]] = None - m_CookingOptions: Optional[int] = None - m_IndexFormat: Optional[int] = None - m_IsReadable: Optional[bool] = None - m_KeepIndices: Optional[bool] = None - m_KeepVertices: Optional[bool] = None - m_MeshMetrics_0_: Optional[float] = None - m_MeshMetrics_1_: Optional[float] = None - m_Normals: Optional[List[Vector3f]] = None - m_RootBoneNameHash: Optional[int] = None - m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None - m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None - m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None - m_StreamCompression: Optional[int] = None - m_StreamData: Optional[StreamingInfo] = None - m_Tangents: Optional[List[Vector4f]] = None - m_UV: Optional[List[Vector2f]] = None - m_UV1: Optional[List[Vector2f]] = None - m_Use16BitIndices: Optional[int] = None - m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None - m_VertexData: Optional[VertexData] = None - m_Vertices: Optional[List[Vector3f]] = None + m_BindPose: List[Matrix4x4f] + m_CompressedMesh: CompressedMesh + m_IndexBuffer: List[int] + m_LocalAABB: AABB + m_MeshCompression: int + m_MeshUsageFlags: int + m_Name: str + m_SubMeshes: List[SubMesh] + m_BakedConvexCollisionMesh: Optional[List[int]] = None + m_BakedTriangleCollisionMesh: Optional[List[int]] = None + m_BoneNameHashes: Optional[List[int]] = None + m_BonesAABB: Optional[List[MinMaxAABB]] = None + m_CollisionTriangles: Optional[List[int]] = None + m_CollisionVertexCount: Optional[int] = None + m_Colors: Optional[List[ColorRGBA]] = None + m_CookingOptions: Optional[int] = None + m_IndexFormat: Optional[int] = None + m_IsReadable: Optional[bool] = None + m_KeepIndices: Optional[bool] = None + m_KeepVertices: Optional[bool] = None + m_MeshMetrics_0_: Optional[float] = None + m_MeshMetrics_1_: Optional[float] = None + m_Normals: Optional[List[Vector3f]] = None + m_RootBoneNameHash: Optional[int] = None + m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None + m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None + m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None + m_StreamCompression: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_Tangents: Optional[List[Vector4f]] = None + m_UV: Optional[List[Vector2f]] = None + m_UV1: Optional[List[Vector2f]] = None + m_Use16BitIndices: Optional[int] = None + m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None + m_VertexData: Optional[VertexData] = None + m_Vertices: Optional[List[Vector3f]] = None - def export(self, format: str = "obj") -> str: ... + def export(self, format: str = "obj") -> str: ... diff --git a/UnityPy/classes/legacy_patch/Renderer.pyi b/UnityPy/classes/legacy_patch/Renderer.pyi index a5e8c2c4c..44ea8bf5a 100644 --- a/UnityPy/classes/legacy_patch/Renderer.pyi +++ b/UnityPy/classes/legacy_patch/Renderer.pyi @@ -3,6 +3,6 @@ from UnityPy.classes.generated import Component from UnityPy.classes.legacy_patch import GameObject class Renderer(Component): - m_GameObject: PPtr[GameObject] + m_GameObject: PPtr[GameObject] - def export(self, export_dir: str) -> None: ... + def export(self, export_dir: str) -> None: ... diff --git a/UnityPy/classes/legacy_patch/Shader.pyi b/UnityPy/classes/legacy_patch/Shader.pyi index 5b4339649..08ac3f0fc 100644 --- a/UnityPy/classes/legacy_patch/Shader.pyi +++ b/UnityPy/classes/legacy_patch/Shader.pyi @@ -1,25 +1,24 @@ from typing import List, Optional, Tuple, Union from UnityPy.classes import PPtr -from UnityPy.classes.generated import (GUID, NamedObject, SerializedShader, - Texture) +from UnityPy.classes.generated import GUID, NamedObject, SerializedShader, Texture class Shader(NamedObject): - m_Name: str - compressedBlob: Optional[List[int]] = None - compressedLengths: Optional[Union[List[int], List[List[int]]]] = None - decompressedLengths: Optional[Union[List[int], List[List[int]]]] = None - decompressedSize: Optional[int] = None - m_AssetGUID: Optional[GUID] = None - m_Dependencies: Optional[List[PPtr[Shader]]] = None - m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None - m_ParsedForm: Optional[SerializedShader] = None - m_PathName: Optional[str] = None - m_Script: Optional[str] = None - m_ShaderIsBaked: Optional[bool] = None - m_SubProgramBlob: Optional[List[int]] = None - offsets: Optional[Union[List[int], List[List[int]]]] = None - platforms: Optional[List[int]] = None - stageCounts: Optional[List[int]] = None + m_Name: str + compressedBlob: Optional[List[int]] = None + compressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedSize: Optional[int] = None + m_AssetGUID: Optional[GUID] = None + m_Dependencies: Optional[List[PPtr[Shader]]] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ParsedForm: Optional[SerializedShader] = None + m_PathName: Optional[str] = None + m_Script: Optional[str] = None + m_ShaderIsBaked: Optional[bool] = None + m_SubProgramBlob: Optional[List[int]] = None + offsets: Optional[Union[List[int], List[List[int]]]] = None + platforms: Optional[List[int]] = None + stageCounts: Optional[List[int]] = None - def export(self) -> str: ... + def export(self) -> str: ... diff --git a/UnityPy/classes/legacy_patch/Sprite.pyi b/UnityPy/classes/legacy_patch/Sprite.pyi index 3b3b18c1a..dc88a2dc0 100644 --- a/UnityPy/classes/legacy_patch/Sprite.pyi +++ b/UnityPy/classes/legacy_patch/Sprite.pyi @@ -3,27 +3,33 @@ from typing import List, Optional, Tuple from PIL.Image import Image from UnityPy.classes import PPtr -from UnityPy.classes.generated import (GUID, MonoBehaviour, NamedObject, Rectf, - SpriteAtlas, SpriteBone, - SpriteRenderData) +from UnityPy.classes.generated import ( + GUID, + MonoBehaviour, + NamedObject, + Rectf, + SpriteAtlas, + SpriteBone, + SpriteRenderData, +) from UnityPy.classes.math import Vector2f, Vector4f class Sprite(NamedObject): - m_Extrude: int - m_Name: str - m_Offset: Vector2f - m_PixelsToUnits: float - m_RD: SpriteRenderData - m_Rect: Rectf - m_AtlasTags: Optional[List[str]] = None - m_Bones: Optional[List[SpriteBone]] = None - m_Border: Optional[Vector4f] = None - m_IsPolygon: Optional[bool] = None - m_PhysicsShape: Optional[List[List[Vector2f]]] = None - m_Pivot: Optional[Vector2f] = None - m_RenderDataKey: Optional[Tuple[GUID, int]] = None - m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None - m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None + m_Extrude: int + m_Name: str + m_Offset: Vector2f + m_PixelsToUnits: float + m_RD: SpriteRenderData + m_Rect: Rectf + m_AtlasTags: Optional[List[str]] = None + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_IsPolygon: Optional[bool] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_Pivot: Optional[Vector2f] = None + m_RenderDataKey: Optional[Tuple[GUID, int]] = None + m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None + m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None - @property - def image(self) -> Image: ... + @property + def image(self) -> Image: ... diff --git a/UnityPy/classes/legacy_patch/Texture2D.py b/UnityPy/classes/legacy_patch/Texture2D.py index 93ae68de4..680829afa 100644 --- a/UnityPy/classes/legacy_patch/Texture2D.py +++ b/UnityPy/classes/legacy_patch/Texture2D.py @@ -1,4 +1,4 @@ -from typing import Union, BinaryIO, Optional +from typing import BinaryIO, Optional, Union from PIL import Image @@ -25,7 +25,8 @@ def _Texture2d_set_image( if not isinstance(img, Image.Image): img = Image.open(img) - img_data, tex_format = Texture2DConverter.image_to_texture2d(img, target_format) + platform = self.object_reader.platform if self.object_reader is not None else 0 + img_data, tex_format = Texture2DConverter.image_to_texture2d(img, target_format, platform, self.m_PlatformBlob) self.m_Width = img.width self.m_Height = img.height @@ -39,7 +40,7 @@ def _Texture2d_set_image( if width < 4 or height < 4: mipmap_count = i + 1 break - re_img = re_img.resize((width, height), Image.BICUBIC) + re_img = re_img.resize((width, height), Image.Resampling.BICUBIC) img_data += Texture2DConverter.image_to_texture2d(re_img, target_format)[0] # disable mipmaps as we don't store them ourselves by default @@ -50,9 +51,7 @@ def _Texture2d_set_image( self.image_data = img_data # width * height * channel count - self.m_CompleteImageSize = len( - img_data - ) # img.width * img.height * len(img.getbands()) + self.m_CompleteImageSize = len(img_data) # img.width * img.height * len(img.getbands()) self.m_TextureFormat = tex_format if self.m_StreamData is not None: diff --git a/UnityPy/classes/legacy_patch/Texture2D.pyi b/UnityPy/classes/legacy_patch/Texture2D.pyi index 40f26fa21..bc8df836d 100644 --- a/UnityPy/classes/legacy_patch/Texture2D.pyi +++ b/UnityPy/classes/legacy_patch/Texture2D.pyi @@ -5,41 +5,40 @@ from PIL.Image import Image from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture class Texture2D(Texture): - image_data: bytes - m_CompleteImageSize: int - m_Height: int - m_ImageCount: int - m_IsReadable: bool - m_LightmapFormat: int - m_Name: str - m_TextureDimension: int - m_TextureFormat: int - m_TextureSettings: GLTextureSettings - m_Width: int - m_ColorSpace: Optional[int] = None - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMasterTextureLimit: Optional[bool] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_IsPreProcessed: Optional[bool] = None - m_MipCount: Optional[int] = None - m_MipMap: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_PlatformBlob: Optional[List[int]] = None - m_ReadAllowed: Optional[bool] = None - m_StreamData: Optional[StreamingInfo] = None - m_StreamingMipmaps: Optional[bool] = None - m_StreamingMipmapsPriority: Optional[int] = None - - @property - def image(self) -> Image: ... - def set_image( - self, - img: Union[Image, str, BinaryIO], - target_format: Optional[int] = None, - mipmap_count: int = 1, - ) -> None: ... - def get_image_data(self) -> bytes: ... + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + @property + def image(self) -> Image: ... + def set_image( + self, + img: Union[Image, str, BinaryIO], + target_format: Optional[int] = None, + mipmap_count: int = 1, + ) -> None: ... + def get_image_data(self) -> bytes: ... diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.py b/UnityPy/classes/legacy_patch/Texture2DArray.py index e5591bcad..e43039ded 100644 --- a/UnityPy/classes/legacy_patch/Texture2DArray.py +++ b/UnityPy/classes/legacy_patch/Texture2DArray.py @@ -1,4 +1,5 @@ from __future__ import annotations + from typing import TYPE_CHECKING, List from ...enums.GraphicsFormat import GRAPHICS_TO_TEXTURE_MAP, GraphicsFormat diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.pyi b/UnityPy/classes/legacy_patch/Texture2DArray.pyi index 3f396ae74..d790ecd0a 100644 --- a/UnityPy/classes/legacy_patch/Texture2DArray.pyi +++ b/UnityPy/classes/legacy_patch/Texture2DArray.pyi @@ -5,25 +5,25 @@ from PIL.Image import Image from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture class Texture2DArray(Texture): - image_data: bytes - m_ColorSpace: int - m_DataSize: int - m_Depth: int - m_Format: int - m_Height: int - m_IsReadable: bool - m_MipCount: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_StreamData: Optional[StreamingInfo] = None - m_UsageMode: Optional[int] = None + image_data: bytes + m_ColorSpace: int + m_DataSize: int + m_Depth: int + m_Format: int + m_Height: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None - @property - def images(self) -> List[Image]: ... + @property + def images(self) -> List[Image]: ... diff --git a/UnityPy/classes/legacy_patch/__init__.py b/UnityPy/classes/legacy_patch/__init__.py index e761a0611..4e9159b9e 100644 --- a/UnityPy/classes/legacy_patch/__init__.py +++ b/UnityPy/classes/legacy_patch/__init__.py @@ -1,8 +1,19 @@ -from .AudioClip import AudioClip as AudioClip -from .GameObject import GameObject as GameObject -from .Mesh import Mesh as Mesh -from .Renderer import Renderer as Renderer -from .Shader import Shader as Shader -from .Sprite import Sprite as Sprite -from .Texture2D import Texture2D as Texture2D -from .Texture2DArray import Texture2DArray as Texture2DArray +from .AudioClip import AudioClip +from .GameObject import GameObject +from .Mesh import Mesh +from .Renderer import Renderer +from .Shader import Shader +from .Sprite import Sprite +from .Texture2D import Texture2D +from .Texture2DArray import Texture2DArray + +__all__ = [ + "AudioClip", + "GameObject", + "Mesh", + "Renderer", + "Shader", + "Sprite", + "Texture2D", + "Texture2DArray", +] diff --git a/UnityPy/classes/math.py b/UnityPy/classes/math.py index 8ba1d71a6..525710e0a 100644 --- a/UnityPy/classes/math.py +++ b/UnityPy/classes/math.py @@ -90,23 +90,18 @@ class ColorRGBA: b: float = 0 a: float = 1 - def __new__( - cls, r: float = 0, g: float = 0, b: float = 0, a: float = 1, rgba: int = -1 - ) -> "ColorRGBA": - obj = super().__new__(cls) + def __init__(self, r: float = 0, g: float = 0, b: float = 0, a: float = 1, rgba: int = -1): if rgba != -1: r = ((rgba >> 24) & 0xFF) / 255 g = ((rgba >> 16) & 0xFF) / 255 b = ((rgba >> 8) & 0xFF) / 255 a = (rgba & 0xFF) / 255 - obj.__init__(r, g, b, a) - return obj + # defined by attrs + self.__attrs_init__(r, g, b, a) # type: ignore @property def rgba(self) -> int: - return ( - self.r * 255 << 24 | self.g * 255 << 16 | self.b * 255 << 8 | self.a * 255 - ) + return int(self.r * 255) << 24 | int(self.g * 255) << 16 | int(self.b * 255) << 8 | int(self.a * 255) @rgba.setter def rgba(self, value: int): diff --git a/UnityPy/cli/__init__.py b/UnityPy/cli/__init__.py new file mode 100644 index 000000000..500815a9f --- /dev/null +++ b/UnityPy/cli/__init__.py @@ -0,0 +1,28 @@ +from argparse import ArgumentParser + +from UnityPy.cli.update_tpk import update_tpk + + +def main(): + parser = ArgumentParser( + prog="UnityPy", + description="UnityPy cli utility", + ) + + subparsers = parser.add_subparsers(title="utils") + + update_tpk_parser = subparsers.add_parser("update_tpk", help="Updates TPK (typetree dump) file") + update_tpk_parser.set_defaults(func=update_tpk) + + args = parser.parse_args() + + if not hasattr(args, "func"): + parser.print_help() + return + + operands = getattr(args, "operands", []) + args.func(*operands) + + +if __name__ == "__main__": + main() diff --git a/UnityPy/cli/update_tpk.py b/UnityPy/cli/update_tpk.py new file mode 100644 index 000000000..f2a512731 --- /dev/null +++ b/UnityPy/cli/update_tpk.py @@ -0,0 +1,29 @@ +import os + +from tpk_ar.utils import download_tpk + +RESOURCE_PATH = os.path.join(os.path.dirname(__file__), "..", "resources") + + +def update_tpk(): + print("Updating TPK file...") + print("\tDownloading...") + tpk_data = download_tpk() + + print("\tSaving...") + with open(os.path.join(RESOURCE_PATH, "lzma.tpk"), "wb") as f: + f.write(tpk_data) + + print("\tGenerating classes...") + # import here to avoid loading a potentially broken or missing tpk file + + from UnityPy.tools.TpkClassGenerator import generate_classes + + generate_classes() + print("\tDone.") + + +__all__ = ["update_tpk"] + +if __name__ == "__main__": + update_tpk() diff --git a/UnityPy/config.py b/UnityPy/config.py index a22a29628..98c5660b5 100644 --- a/UnityPy/config.py +++ b/UnityPy/config.py @@ -1,20 +1,40 @@ -# used when no version is defined by the SerializedFile or its BundleFile -FALLBACK_UNITY_VERSION = "2.5.0f5" -# determines if the typetree structures for the Object types will be parsed -# disabling this will reduce the load time by a lot (half of the time is spend on parsing the typetrees) -# but it will also prevent saving an edited file +import warnings + +from .exceptions import UnityVersionFallbackError, UnityVersionFallbackWarning + +FALLBACK_UNITY_VERSION = None +"""The Unity version to use when no version is defined + by the SerializedFile or its BundleFile. + + You may manually configure this value to a version string, e.g. `2.5.0f5`. +""" + SERIALIZED_FILE_PARSE_TYPETREE = True +"""Determines if the typetree structures for the Object types will be parsed. + + Disabling this will reduce the load time by a lot (half of the time is spend on parsing the typetrees), + but it will also prevent saving an edited file. +""" -# GLOBAL WARNING SUPPRESSION -FALLBACK_VERSION_WARNED = False # for FALLBACK_UNITY_VERSION + +# WARNINGS CONTROL +warnings.simplefilter("once", UnityVersionFallbackWarning) # GET FUNCTIONS def get_fallback_version(): - global FALLBACK_VERSION_WARNED - if not FALLBACK_VERSION_WARNED: - print( - f"Warning: 0.0.0 version found, defaulting to UnityPy.config.FALLBACK_UNITY_VERSION ({FALLBACK_UNITY_VERSION})" # noqa: E501 + global FALLBACK_UNITY_VERSION + + if not isinstance(FALLBACK_UNITY_VERSION, str): + raise UnityVersionFallbackError( + "No valid Unity version found, and the fallback version is not correctly configured. " + + "Please explicitly set the value of UnityPy.config.FALLBACK_UNITY_VERSION." ) - FALLBACK_VERSION_WARNED = True + + warnings.warn( + f"No valid Unity version found, defaulting to UnityPy.config.FALLBACK_UNITY_VERSION ({FALLBACK_UNITY_VERSION})", # noqa: E501 + category=UnityVersionFallbackWarning, + stacklevel=2, + ) + return FALLBACK_UNITY_VERSION diff --git a/UnityPy/enums/BundleFile.py b/UnityPy/enums/BundleFile.py index fec1cf4a5..d72fdb162 100644 --- a/UnityPy/enums/BundleFile.py +++ b/UnityPy/enums/BundleFile.py @@ -23,4 +23,4 @@ class ArchiveFlags(IntFlag): BlocksInfoAtTheEnd = 0x80 OldWebPluginCompatibility = 0x100 BlockInfoNeedPaddingAtStart = 0x200 - UsesAssetBundleEncryption = 0x400 + UsesAssetBundleEncryption = 0x1400 # old: 0x400, new: 0x1000 diff --git a/UnityPy/enums/ClassIDType.py b/UnityPy/enums/ClassIDType.py index b7c5f9241..9168fb8da 100644 --- a/UnityPy/enums/ClassIDType.py +++ b/UnityPy/enums/ClassIDType.py @@ -1,4 +1,4 @@ -# https://docs.unity3d.com/Manual/ClassIDReference.html +# https://docs.unity3d.com/Manual/ClassIDReference.html from .ExtendableEnum import ExtendableEnum diff --git a/UnityPy/enums/CommonString.py b/UnityPy/enums/CommonString.py deleted file mode 100644 index c91d2ca2f..000000000 --- a/UnityPy/enums/CommonString.py +++ /dev/null @@ -1,110 +0,0 @@ -CommonString = { - 0: "AABB", - 5: "AnimationClip", - 19: "AnimationCurve", - 34: "AnimationState", - 49: "Array", - 55: "Base", - 60: "BitField", - 69: "bitset", - 76: "bool", - 81: "char", - 86: "ColorRGBA", - 96: "Component", - 106: "data", - 111: "deque", - 117: "double", - 124: "dynamic_array", - 138: "FastPropertyName", - 155: "first", - 161: "float", - 167: "Font", - 172: "GameObject", - 183: "Generic Mono", - 196: "GradientNEW", - 208: "GUID", - 213: "GUIStyle", - 222: "int", - 226: "list", - 231: "long long", - 241: "map", - 245: "Matrix4x4f", - 256: "MdFour", - 263: "MonoBehaviour", - 277: "MonoScript", - 288: "m_ByteSize", - 299: "m_Curve", - 307: "m_EditorClassIdentifier", - 331: "m_EditorHideFlags", - 349: "m_Enabled", - 359: "m_ExtensionPtr", - 374: "m_GameObject", - 387: "m_Index", - 395: "m_IsArray", - 405: "m_IsStatic", - 416: "m_MetaFlag", - 427: "m_Name", - 434: "m_ObjectHideFlags", - 452: "m_PrefabInternal", - 469: "m_PrefabParentObject", - 490: "m_Script", - 499: "m_StaticEditorFlags", - 519: "m_Type", - 526: "m_Version", - 536: "Object", - 543: "pair", - 548: "PPtr", - 564: "PPtr", - 581: "PPtr", - 596: "PPtr", - 616: "PPtr", - 633: "PPtr", - 646: "PPtr", - 659: "PPtr", - 672: "PPtr", - 688: "PPtr", - 702: "PPtr", - 718: "PPtr", - 734: "Prefab", - 741: "Quaternionf", - 753: "Rectf", - 759: "RectInt", - 767: "RectOffset", - 778: "second", - 785: "set", - 789: "short", - 795: "size", - 800: "SInt16", - 807: "SInt32", - 814: "SInt64", - 821: "SInt8", - 827: "staticvector", - 840: "string", - 847: "TextAsset", - 857: "TextMesh", - 866: "Texture", - 874: "Texture2D", - 884: "Transform", - 894: "TypelessData", - 907: "UInt16", - 914: "UInt32", - 921: "UInt64", - 928: "UInt8", - 934: "unsigned int", - 947: "unsigned long long", - 966: "unsigned short", - 981: "vector", - 988: "Vector2f", - 997: "Vector3f", - 1006: "Vector4f", - 1015: "m_ScriptingClassIdentifier", - 1042: "Gradient", - 1051: "Type*", - 1057: "int2_storage", - 1070: "int3_storage", - 1083: "BoundsInt", - 1093: "m_CorrespondingSourceObject", - 1121: "m_PrefabInstance", - 1138: "m_PrefabAsset", - 1152: "FileSize" -} diff --git a/UnityPy/enums/GfxPrimitiveType.py b/UnityPy/enums/GfxPrimitiveType.py index f6d4cc965..591a7a34a 100644 --- a/UnityPy/enums/GfxPrimitiveType.py +++ b/UnityPy/enums/GfxPrimitiveType.py @@ -7,4 +7,4 @@ class GfxPrimitiveType(IntEnum): kPrimitiveQuads = 2 kPrimitiveLines = 3 kPrimitiveLineStrip = 4 - kPrimitivePoints = 5 \ No newline at end of file + kPrimitivePoints = 5 diff --git a/UnityPy/enums/SpritePackingMode.py b/UnityPy/enums/SpritePackingMode.py index 007208e23..e640576e6 100644 --- a/UnityPy/enums/SpritePackingMode.py +++ b/UnityPy/enums/SpritePackingMode.py @@ -1,5 +1,6 @@ from enum import IntEnum + class SpritePackingMode(IntEnum): kSPMTight = 0 - kSPMRectangle = 1 \ No newline at end of file + kSPMRectangle = 1 diff --git a/UnityPy/enums/SpritePackingRotation.py b/UnityPy/enums/SpritePackingRotation.py index 14d108a81..1a361de14 100644 --- a/UnityPy/enums/SpritePackingRotation.py +++ b/UnityPy/enums/SpritePackingRotation.py @@ -1,5 +1,6 @@ from enum import IntEnum + class SpritePackingRotation(IntEnum): kSPRNone = 0 kSPRFlipHorizontal = 1 diff --git a/UnityPy/enums/VertexFormat.py b/UnityPy/enums/VertexFormat.py index 88e1295c9..ea3350a1a 100644 --- a/UnityPy/enums/VertexFormat.py +++ b/UnityPy/enums/VertexFormat.py @@ -50,7 +50,7 @@ class VertexFormat(IntEnum): VERTEX_FORMAT_2017_STRUCT_TYPE_MAP = { VertexFormat2017.kVertexFormatFloat: "f", - VertexFormat2017.kVertexFormatFloat16: "h", + VertexFormat2017.kVertexFormatFloat16: "e", VertexFormat2017.kVertexFormatColor: "B", VertexFormat2017.kVertexFormatUNorm8: "B", VertexFormat2017.kVertexFormatSNorm8: "b", @@ -66,7 +66,7 @@ class VertexFormat(IntEnum): VERTEX_FORMAT_STRUCT_TYPE_MAP = { VertexFormat.kVertexFormatFloat: "f", - VertexFormat.kVertexFormatFloat16: "h", + VertexFormat.kVertexFormatFloat16: "e", VertexFormat.kVertexFormatUNorm8: "B", VertexFormat.kVertexFormatSNorm8: "b", VertexFormat.kVertexFormatUNorm16: "H", diff --git a/UnityPy/enums/__init__.py b/UnityPy/enums/__init__.py index de6e5190d..c9a99d83e 100644 --- a/UnityPy/enums/__init__.py +++ b/UnityPy/enums/__init__.py @@ -1,17 +1,39 @@ -from .Audio import AudioType, AudioCompressionFormat, AUDIO_TYPE_EXTEMSION +from .Audio import AUDIO_TYPE_EXTEMSION, AudioCompressionFormat, AudioType from .BuildTarget import BuildTarget from .BundleFile import ArchiveFlags, ArchiveFlagsOld, CompressionFlags from .ClassIDType import ClassIDType from .FileType import FileType -from .TextureFormat import TextureFormat -from .SpriteMeshType import SpriteMeshType from .GfxPrimitiveType import GfxPrimitiveType -from .CommonString import CommonString +from .GraphicsFormat import GraphicsFormat +from .PassType import PassType +from .SerializedPropertyType import SerializedPropertyType from .ShaderCompilerPlatform import ShaderCompilerPlatform from .ShaderGpuProgramType import ShaderGpuProgramType -from .SerializedPropertyType import SerializedPropertyType +from .SpriteMeshType import SpriteMeshType from .SpritePackingMode import SpritePackingMode from .SpritePackingRotation import SpritePackingRotation from .TextureDimension import TextureDimension -from .PassType import PassType -from .GraphicsFormat import GraphicsFormat +from .TextureFormat import TextureFormat + +__all__ = [ + "AUDIO_TYPE_EXTEMSION", + "AudioCompressionFormat", + "AudioType", + "BuildTarget", + "ArchiveFlags", + "ArchiveFlagsOld", + "CompressionFlags", + "ClassIDType", + "FileType", + "GfxPrimitiveType", + "GraphicsFormat", + "PassType", + "SerializedPropertyType", + "ShaderCompilerPlatform", + "ShaderGpuProgramType", + "SpriteMeshType", + "SpritePackingMode", + "SpritePackingRotation", + "TextureDimension", + "TextureFormat", +] diff --git a/UnityPy/environment.py b/UnityPy/environment.py index 6b210aca0..c4a60aea2 100644 --- a/UnityPy/environment.py +++ b/UnityPy/environment.py @@ -1,36 +1,55 @@ import io -import os import ntpath +import os import re -from typing import List, Callable, Dict, Union +from typing import TYPE_CHECKING, BinaryIO, Callable, Dict, List, Optional, Union, cast from zipfile import ZipFile from fsspec import AbstractFileSystem from fsspec.implementations.local import LocalFileSystem - -from .files import File, ObjectReader, SerializedFile from .enums import FileType -from .helpers import ImportHelper +from .files import BundleFile, File, ObjectReader, SerializedFile, WebFile +from .helpers.ContainerHelper import ContainerHelper +from .helpers.ImportHelper import ( + FileSourceType, + check_file_type, + find_sensitive_path, + parse_file, +) from .streams import EndianBinaryReader +if TYPE_CHECKING: + from UnityPy.helpers.TypeTreeGenerator import TypeTreeGenerator + reSplit = re.compile(r"(.*?([^\/\\]+?))\.split\d+") class Environment: - files: dict - cabs: dict + files: Dict[str, Union[SerializedFile, BundleFile, WebFile, EndianBinaryReader]] + cabs: Dict[str, Union[SerializedFile, EndianBinaryReader]] path: str local_files: List[str] local_files_simple: List[str] + typetree_generator: Optional["TypeTreeGenerator"] = None + _container_index_built: bool = False - def __init__(self, *args, fs: AbstractFileSystem = None): + def __init__(self, *args: FileSourceType, fs: Optional[AbstractFileSystem] = None, path: Optional[str] = None): self.files = {} self.cabs = {} - self.path = None self.fs = fs or LocalFileSystem() self.local_files = [] self.local_files_simple = [] + self._container_index_built = False + + if path is None: + # if no path is given, use the current working directory + if isinstance(self.fs, LocalFileSystem): + self.path = os.getcwd() + else: + self.path = "" + else: + self.path = path if args: for arg in args: @@ -39,7 +58,7 @@ def __init__(self, *args, fs: AbstractFileSystem = None): if ntpath.splitext(arg)[-1] in [".apk", ".zip"]: self.load_zip_file(arg) else: - self.path = ntpath.dirname(arg) + self.path = ntpath.dirname(arg) or ntpath.curdir if reSplit.match(arg): self.load_files([arg]) else: @@ -48,55 +67,41 @@ def __init__(self, *args, fs: AbstractFileSystem = None): self.path = arg self.load_folder(arg) else: - self.path = None self.load_file(file=arg) if len(self.files) == 1: self.file = list(self.files.values())[0] - if self.path == "": - self.path = os.getcwd() - def load_files(self, files: List[str]): """Loads all files (list) into the Environment and merges .split files for common usage.""" self.load_assets(files, lambda x: open(x, "rb")) def load_folder(self, path: str): """Loads all files in the given path and its subdirs into the Environment.""" - self.load_files( - [ - self.fs.sep.join([root, f]) - for root, dirs, files in self.fs.walk(path) - for f in files - ] - ) + self.load_files([self.fs.sep.join([root, f]) for root, dirs, files in self.fs.walk(path) for f in files]) - def load(self, files: list): + def load(self, files: List[str]): """Loads all files into the Environment.""" self.files.update( - { - ntpath.basename(f): self.load_file(self.fs.open(f, "rb"), self, f) - for f in files - if self.fs.exists(f) - } + {ntpath.basename(f): self.load_file(self.fs.open(f, "rb"), self, f) for f in files if self.fs.exists(f)} ) - def _load_split_file(self, basename): - file = [] + def _load_split_file(self, basename: str) -> bytes: + file: List[bytes] = [] for i in range(0, 999): item = f"{basename}.split{i}" if self.fs.exists(item): with self.fs.open(item, "rb") as f: - file.append(f.read()) + file.append(f.read()) # type: ignore elif i: break return b"".join(file) def load_file( self, - file: Union[io.IOBase, str], - parent: Union["Environment", File] = None, - name: str = None, + file: FileSourceType, + parent: Optional[Union["Environment", File]] = None, + name: Optional[str] = None, is_dependency: bool = False, ): if not parent: @@ -105,9 +110,10 @@ def load_file( if isinstance(file, str): split_match = reSplit.match(file) if split_match: - basepath, basename = split_match.groups() + basepath, _basename = split_match.groups() + assert isinstance(basepath, str) name = basepath - file = self._load_split_file(name) + file = self._load_split_file(basepath) else: name = file if not os.path.exists(file): @@ -117,16 +123,20 @@ def load_file( # for dependency loading of split files if os.path.exists(f"{file}.split0"): file = self._load_split_file(file) - # Unity paths are case insensitive, so we need to find "Resources/Foo.asset" when the record says "resources/foo.asset" + # Unity paths are case insensitive, + # so we need to find "Resources/Foo.asset" when the record says "resources/foo.asset" elif not os.path.exists(file): - file = ImportHelper.find_sensitive_path(self.path, file) - # nonexistent files might be packaging errors or references to Unity's global Library/ - if file is None: - return - if type(file) == str: + file_path = find_sensitive_path(self.path, file) + if file_path: + file = file_path + else: + return None + # raise FileNotFoundError(f"File {file} not found in {self.path}") + + if isinstance(file, str): file = self.fs.open(file, "rb") - typ, reader = ImportHelper.check_file_type(file) + typ, reader = check_file_type(file) stream_name = ( name @@ -134,34 +144,33 @@ def load_file( else getattr( file, "name", - str(file.__hash__()) if hasattr(file, "__hash__") else "", + str(file.__hash__()) if hasattr(file, "__hash__") else "", # type: ignore ) ) if typ == FileType.ZIP: f = self.load_zip_file(file) else: - f = ImportHelper.parse_file( - reader, self, name=stream_name, typ=typ, is_dependency=is_dependency - ) - + f = parse_file(reader, self, name=stream_name, typ=typ, is_dependency=is_dependency) + if isinstance(f, (SerializedFile, EndianBinaryReader)): self.register_cab(stream_name, f) self.files[stream_name] = f - + return f def load_zip_file(self, value): - buffer = None if isinstance(value, str) and self.fs.exists(value): - buffer = open(value, "rb") - elif isinstance(value, (bytes, bytearray)): + buffer = cast(io.BufferedReader, self.fs.open(value, "rb")) + elif isinstance(value, (bytes, bytearray, memoryview)): buffer = io.BytesIO(value) elif isinstance(value, (io.BufferedReader, io.BufferedIOBase)): buffer = value + else: + raise TypeError("Unsupported type for loading zip file") z = ZipFile(buffer) - self.load_assets(z.namelist(), lambda x: z.open(x, "r")) + self.load_assets(z.namelist(), lambda x: z.open(x, "r")) # type: ignore z.close() def save(self, pack="none", out_path="output"): @@ -171,9 +180,7 @@ def save(self, pack="none", out_path="output"): """ for fname, fitem in self.files.items(): if getattr(fitem, "is_changed", False): - with open( - self.fs.sep.join([out_path, ntpath.basename(fname)]), "wb" - ) as out: + with open(self.fs.sep.join([out_path, ntpath.basename(fname)]), "wb") as out: out.write(fitem.save(packer=pack)) @property @@ -190,23 +197,33 @@ def search(item): elif getattr(item, "files", None): # WebBundle and BundleFile # bundle - for item in item.files.values(): - ret.extend(search(item)) + for sub_item in item.files.values(): + ret.extend(search(sub_item)) return ret return ret return search(self) + def _build_container_index(self) -> None: + if self._container_index_built: + return + + self._container_index_built = True + for f in self.cabs.values(): + if isinstance(f, SerializedFile): + f.container.parse_preload_table() + @property - def container(self) -> Dict[str, ObjectReader]: + def container(self) -> ContainerHelper: """Returns a dictionary of all objects in the Environment.""" - return { - path: obj - for f in self.files.values() - if isinstance(f, File) and not f.is_dependency - for path, obj in f.container.items() - } + self._build_container_index() + container = [] + for f in self.cabs.values(): + if isinstance(f, SerializedFile) and not f.is_dependency: + container.extend(f.container.container) + + return ContainerHelper(container) @property def assets(self) -> list: @@ -214,7 +231,10 @@ def assets(self) -> list: Lists all assets / SerializedFiles within this environment. """ - def gen_all_asset_files(file, ret=[]): + def gen_all_asset_files(file, ret: Optional[list] = None): + if ret is None: + ret = [] + for f in getattr(file, "files", {}).values(): if getattr(f, "is_dependency", False): continue @@ -229,7 +249,7 @@ def gen_all_asset_files(file, ret=[]): def get(self, key: str, default=None): return getattr(self, key, default) - def register_cab(self, name: str, item: File) -> None: + def register_cab(self, name: str, item: Union[SerializedFile, EndianBinaryReader]) -> None: """ Registers a cab file. @@ -241,8 +261,9 @@ def register_cab(self, name: str, item: File) -> None: The file to register. """ self.cabs[simplify_name(name)] = item + self._container_index_built = False - def get_cab(self, name: str) -> File: + def get_cab(self, name: str) -> Union[SerializedFile, EndianBinaryReader, None]: """ Returns the cab file with the given name. @@ -258,7 +279,7 @@ def get_cab(self, name: str) -> File: """ return self.cabs.get(simplify_name(name), None) - def load_assets(self, assets: List[str], open_f: Callable[[str], io.IOBase]): + def load_assets(self, assets: List[str], open_f: Callable[[str], BinaryIO]): """ Load all assets from a list of files via the given open_f function. @@ -274,7 +295,7 @@ def load_assets(self, assets: List[str], open_f: Callable[[str], io.IOBase]): for path in assets: splitMatch = reSplit.match(path) if splitMatch: - basepath, basename = splitMatch.groups() + basepath, _basename = splitMatch.groups() if basepath in split_files: continue @@ -283,7 +304,7 @@ def load_assets(self, assets: List[str], open_f: Callable[[str], io.IOBase]): data = self._load_split_file(basepath) path = basepath else: - data = open_f(path).read() + data = open_f(path) self.load_file(data, name=path) def find_file(self, name: str, is_dependency: bool = True) -> Union[File, None]: @@ -306,21 +327,31 @@ def find_file(self, name: str, is_dependency: bool = True) -> Union[File, None]: cab = self.get_cab(simple_name) if cab: return cab + fp = self.fs.sep.join([self.path, name]) + if self.fs.exists(fp): + return self.load_file(fp, name=name, is_dependency=is_dependency) if len(self.local_files) == 0 and self.path: for root, _, files in self.fs.walk(self.path): - for name in files: - self.local_files.append(self.fs.sep.join([root, name])) + for f in files: + self.local_files.append(self.fs.sep.join([root, f])) + self.local_files_simple.append(self.fs.sep.join([root, simplify_name(f)])) if name in self.local_files: fp = name elif simple_name in self.local_files_simple: fp = self.local_files[self.local_files_simple.index(simple_name)] else: - raise FileNotFoundError(f"File {name} not found in {self.path}") - - f = self.load_file(fp, name=name, is_dependency=is_dependency) - return f + fp = next((f for f in self.local_files if f.endswith(name)), None) + if not fp: + fp = next( + (f for f in self.local_files_simple if f.endswith(simple_name)), + None, + ) + if not fp: + raise FileNotFoundError(f"File {name} not found in {self.path}") + + return self.load_file(fp, name=name, is_dependency=is_dependency) def simplify_name(name: str) -> str: diff --git a/UnityPy/exceptions.py b/UnityPy/exceptions.py index 1eda4850e..86bd144d0 100644 --- a/UnityPy/exceptions.py +++ b/UnityPy/exceptions.py @@ -1,5 +1,14 @@ class TypeTreeError(Exception): - def __init__(self, message, nodes): - # Call the base class constructor with the parameters it needs + def __init__(self, message, nodes): + super().__init__(message) + self.nodes = nodes + + +class UnityVersionFallbackError(Exception): + def __init__(self, message): + super().__init__(message) + + +class UnityVersionFallbackWarning(UserWarning): + def __init__(self, message): super().__init__(message) - self.nodes = nodes \ No newline at end of file diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 7b417a4b9..c381d9943 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -1,98 +1,27 @@ from __future__ import annotations -import ctypes -import os -import platform -from threading import Lock from typing import TYPE_CHECKING, Dict -from UnityPy.streams import EndianBinaryWriter +import fmod_toolkit from ..helpers.ResourceReader import get_resource_data -try: - import numpy as np -except ImportError: - np = None - import struct - if TYPE_CHECKING: from ..classes import AudioClip -# pyfmodex loads the dll/so/dylib on import -# so we have to adjust the environment vars -# before importing it -# This is done in import_pyfmodex() -# which will replace the global pyfmodex var -pyfmodex = None - - -def get_fmod_path( - system: str, # "Windows", "Linux", "Darwin" - arch: str, # "x64", "x86", "arm", "arm64" -) -> str: - if system == "Darwin": - # universal dylib - return "lib/FMOD/Darwin/libfmod.dylib" - if system == "Windows": - return f"lib/FMOD/Windows/{arch}/fmod.dll" - if system == "Linux": - if arch == "x64": - arch = "x86_64" - return f"lib/FMOD/Linux/{arch}/libfmod.so" - - raise NotImplementedError(f"Unsupported system: {system}") - - -def import_pyfmodex(): - global pyfmodex - if pyfmodex is not None: - return - - # determine system - Windows, Darwin, Linux, Android - system = platform.system() - arch = platform.architecture()[0] - machine = platform.machine() - - if "arm" in machine: - arch = "arm" - elif "aarch64" in machine: - if system == "Linux": - arch = "arm64" - else: - arch = "arm" - elif arch == "32bit": - arch = "x86" - elif arch == "64bit": - arch = "x64" - - fmod_rel_path = get_fmod_path(system, arch) - fmod_path = os.path.join( - os.path.dirname(os.path.dirname(os.path.realpath(__file__))), fmod_rel_path - ) - os.environ["PYFMODEX_DLL_PATH"] = fmod_path - - # build path and load library - # prepare the environment for pyfmodex - if system != "Windows": - # hotfix ctypes for pyfmodex for non windows systems - ctypes.windll = None - - import pyfmodex - -def extract_audioclip_samples( - audio: AudioClip, convert_pcm_float: bool = True -) -> Dict[str, bytes]: +def extract_audioclip_samples(audio: AudioClip, convert_pcm_float: bool = True) -> Dict[str, bytes]: """extracts all the samples from an AudioClip :param audio: AudioClip :type audio: AudioClip :return: {filename : sample(bytes)} :rtype: dict """ + audio_data: bytes if audio.m_AudioData: - audio_data = audio.m_AudioData - else: + audio_data = bytes(audio.m_AudioData) + elif audio.m_Resource: + assert audio.object_reader is not None, "AudioClip uses an external resource but object_reader is not set" resource = audio.m_Resource audio_data = get_resource_data( resource.m_Source, @@ -100,6 +29,8 @@ def extract_audioclip_samples( resource.m_Offset, resource.m_Size, ) + else: + raise ValueError("AudioClip with neither m_AudioData nor m_Resource") magic = memoryview(audio_data)[:8] if magic[:4] == b"OggS": @@ -108,129 +39,11 @@ def extract_audioclip_samples( return {f"{audio.m_Name}.wav": audio_data} elif magic[4:8] == b"ftyp": return {f"{audio.m_Name}.m4a": audio_data} - return dump_samples(audio, audio_data, convert_pcm_float) - - -SYSTEM_INSTANCES = {} # (channels, flags) -> (pyfmodex_system_instance, lock) -SYSTEM_GLOBAL_LOCK = Lock() - -def get_pyfmodex_system_instance(channels: int, flags: int): - global pyfmodex, SYSTEM_INSTANCES, SYSTEM_GLOBAL_LOCK - with SYSTEM_GLOBAL_LOCK: - instance_key = (channels, flags) - if instance_key in SYSTEM_INSTANCES: - return SYSTEM_INSTANCES[instance_key] - system = pyfmodex.System() - system.init(channels, flags, None) - lock = Lock() - SYSTEM_INSTANCES[instance_key] = (system, lock) - return system, lock - - -def dump_samples( - clip: AudioClip, audio_data: bytes, convert_pcm_float: bool = True -) -> Dict[str, bytes]: - global pyfmodex - if pyfmodex is None: - import_pyfmodex() - if not pyfmodex: - return {} - - system, lock = get_pyfmodex_system_instance(clip.m_Channels, pyfmodex.flags.INIT_FLAGS.NORMAL) - with lock: - sound = system.create_sound( - bytes(audio_data), - pyfmodex.flags.MODE.OPENMEMORY, - exinfo=pyfmodex.structure_declarations.CREATESOUNDEXINFO( - length=len(audio_data), - numchannels=clip.m_Channels, - defaultfrequency=clip.m_Frequency, - ), - ) - - # iterate over subsounds - samples = {} - for i in range(sound.num_subsounds): - if i > 0: - filename = "%s-%i.wav" % (clip.m_Name, i) - else: - filename = "%s.wav" % clip.m_Name - subsound = sound.get_subsound(i) - samples[filename] = subsound_to_wav(subsound, convert_pcm_float) - subsound.release() - - sound.release() - return samples - - -def subsound_to_wav(subsound, convert_pcm_float: bool = True) -> bytes: - # get sound settings - sound_format = subsound.format.format - sound_data_length = subsound.get_length(pyfmodex.enums.TIMEUNIT.PCMBYTES) - channels = subsound.format.channels - bits = subsound.format.bits - sample_rate = int(subsound.default_frequency) - - if sound_format in [ - pyfmodex.enums.SOUND_FORMAT.PCM8, - pyfmodex.enums.SOUND_FORMAT.PCM16, - pyfmodex.enums.SOUND_FORMAT.PCM24, - pyfmodex.enums.SOUND_FORMAT.PCM32, - ]: - # format is PCM integer - audio_format = 1 - wav_data_length = sound_data_length - convert_pcm_float = False - elif sound_format == pyfmodex.enums.SOUND_FORMAT.PCMFLOAT: - # format is IEEE 754 float - if convert_pcm_float: - audio_format = 1 - bits = 16 - wav_data_length = sound_data_length // 2 - else: - audio_format = 3 - wav_data_length = sound_data_length - else: - raise NotImplementedError("Sound format " + sound_format + " is not supported.") - - w = EndianBinaryWriter(endian="<") - - # RIFF header - w.write(b"RIFF") # chunk id - w.write_int( - wav_data_length + 36 - ) # chunk size - 4 + (8 + 16 (sub chunk 1 size)) + (8 + length (sub chunk 2 size)) - w.write(b"WAVE") # format - - # fmt chunk - sub chunk 1 - w.write(b"fmt ") # sub chunk 1 id - w.write_int(16) # sub chunk 1 size, 16 for PCM - w.write_short(audio_format) # audio format, 1: PCM integer, 3: IEEE 754 float - w.write_short(channels) # number of channels - w.write_int(sample_rate) # sample rate - w.write_int(sample_rate * channels * bits // 8) # byte rate - w.write_short(channels * bits // 8) # block align - w.write_short(bits) # bits per sample - - # data chunk - sub chunk 2 - w.write(b"data") # sub chunk 2 id - w.write_int(wav_data_length) # sub chunk 2 size - # sub chunk 2 data - lock = subsound.lock(0, sound_data_length) - for ptr, sound_data_length in lock: - ptr_data = ctypes.string_at(ptr, sound_data_length.value) - if convert_pcm_float: - if np is not None: - ptr_data = np.frombuffer(ptr_data, dtype=np.float32) - ptr_data = (ptr_data * (1 << 15)).astype(np.int16).tobytes() - else: - ptr_data = struct.unpack("<%df" % (len(ptr_data) // 4), ptr_data) - ptr_data = struct.pack( - "<%dh" % len(ptr_data), *[int(f * (1 << 15)) for f in ptr_data] - ) - - w.write(ptr_data) - subsound.unlock(*lock) - - return w.bytes + return fmod_toolkit.raw_to_wav( + audio_data, + audio.m_Name, + audio.m_Channels or 2, + audio.m_Frequency or 44100, + convert_pcm_float=convert_pcm_float, + ) diff --git a/UnityPy/export/MeshExporter.py b/UnityPy/export/MeshExporter.py index 2aba0f7dc..f61e3e729 100644 --- a/UnityPy/export/MeshExporter.py +++ b/UnityPy/export/MeshExporter.py @@ -30,26 +30,19 @@ def export_mesh_obj(mesh: Mesh, material_names: Optional[List[str]] = None) -> s return False sb.extend( - "v {0:.9G} {1:.9G} {2:.9G}\n".format(-pos[0], pos[1], pos[2]).replace( - "nan", "0" - ) - for pos in m_Mesh.m_Vertices + "v {0:.9G} {1:.9G} {2:.9G}\n".format(-pos[0], pos[1], pos[2]).replace("nan", "0") for pos in m_Mesh.m_Vertices ) # endregion # region UV if m_Mesh.m_UV0: - sb.extend( - "vt {0:.9G} {1:.9G}\n".format(uv[0], uv[1]).replace("nan", "0") - for uv in m_Mesh.m_UV0 - ) + sb.extend("vt {0:.9G} {1:.9G}\n".format(uv[0], uv[1]).replace("nan", "0") for uv in m_Mesh.m_UV0) # endregion # region Normals if m_Mesh.m_Normals: sb.extend( - "vn {0:.9G} {1:.9G} {2:.9G}\n".format(-n[0], n[1], n[2]).replace("nan", "0") - for n in m_Mesh.m_Normals + "vn {0:.9G} {1:.9G} {2:.9G}\n".format(-n[0], n[1], n[2]).replace("nan", "0") for n in m_Mesh.m_Normals ) # endregion @@ -58,9 +51,6 @@ def export_mesh_obj(mesh: Mesh, material_names: Optional[List[str]] = None) -> s sb.append(f"g {mesh.m_Name}_{i}\n") if material_names and i < len(material_names) and material_names[i]: sb.append(f"usemtl {material_names[i]}\n") - sb.extend( - "f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n".format(c + 1, b + 1, a + 1) - for a, b, c in triangles - ) + sb.extend("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n".format(c + 1, b + 1, a + 1) for a, b, c in triangles) # endregion return "".join(sb) diff --git a/UnityPy/export/MeshRendererExporter.py b/UnityPy/export/MeshRendererExporter.py index 99d57e057..138d9cf2e 100644 --- a/UnityPy/export/MeshRendererExporter.py +++ b/UnityPy/export/MeshRendererExporter.py @@ -25,9 +25,9 @@ class Renderer(Renderer): def get_mesh(meshR: Renderer) -> Optional[Mesh]: if isinstance(meshR, SkinnedMeshRenderer): if meshR.m_Mesh: - return meshR.m_Mesh.read() + return meshR.m_Mesh.deref_parse_as_object() else: - m_GameObject = meshR.m_GameObject.read() + m_GameObject = meshR.m_GameObject.deref_parse_as_object() for comp in m_GameObject.m_Component: if isinstance(comp, tuple): pptr = comp[1] @@ -39,9 +39,9 @@ def get_mesh(meshR: Renderer) -> Optional[Mesh]: if not obj: continue if obj.type.name == "MeshFilter": - filter: MeshFilter = pptr.read() + filter: MeshFilter = pptr.deref_parse_as_object() if filter.m_Mesh: - return filter.m_Mesh.read() + return filter.m_Mesh.deref_parse_as_object() return None @@ -53,23 +53,20 @@ def export_mesh_renderer(renderer: Renderer, export_dir: str) -> None: return firstSubMesh = 0 - if ( - hasattr(renderer, "m_StaticBatchInfo") - and renderer.m_StaticBatchInfo.subMeshCount > 0 - ): + if hasattr(renderer, "m_StaticBatchInfo") and renderer.m_StaticBatchInfo.subMeshCount > 0: firstSubMesh = renderer.m_StaticBatchInfo.firstSubMesh elif hasattr(renderer, "m_SubsetIndices"): firstSubMesh = min(renderer.m_SubsetIndices) materials = [] material_names = [] - for i, submesh in enumerate(mesh.m_SubMeshes): + for i in range(len(mesh.m_SubMeshes)): mat_index = i - firstSubMesh if mat_index < 0 or mat_index >= len(renderer.m_Materials): continue matPtr: Optional[PPtr[Material]] = renderer.m_Materials[i - firstSubMesh] if matPtr: - mat: Material = matPtr.read() + mat: Material = matPtr.deref_parse_as_object() else: material_names.append(None) continue @@ -82,10 +79,10 @@ def export_mesh_renderer(renderer: Renderer, export_dir: str) -> None: if not isinstance(key, str): # FastPropertyName key = key.name - tex: Texture2D = texEnv.m_Texture.read() + tex: Texture2D = texEnv.m_Texture.deref_parse_as_object() texName = f"{tex.m_Name if tex.m_Name else key}.png" with env.fs.open(env.fs.sep.join([export_dir, texName]), "wb") as f: - tex.read().image.save(f) + tex.image.save(f) # save .obj with env.fs.open( @@ -110,16 +107,10 @@ def export_material(mat: Material) -> str: """Creates a material file (.mtl) for the given material.""" def clt(color): # color to tuple - return ( - color if isinstance(color, tuple) else (color.R, color.G, color.B, color.A) - ) + return color if isinstance(color, tuple) else (color.R, color.G, color.B, color.A) def properties_to_dict(properties): - return { - k if isinstance(k, str) else k.name: v - for k, v in properties - if v is not None - } + return {k if isinstance(k, str) else k.name: v for k, v in properties if v is not None} colors = properties_to_dict(mat.m_SavedProperties.m_Colors) floats = properties_to_dict(mat.m_SavedProperties.m_Floats) @@ -135,25 +126,41 @@ def properties_to_dict(properties): sb: List[str] = [] sb.append(f"newmtl {mat.m_Name}") + # Ka r g b # defines the ambient color of the material to be (r,g,b). The default is (0.2,0.2,0.2); sb.append(f"Ka {ambient[0]:.4f} {ambient[1]:.4f} {ambient[2]:.4f}") + # Kd r g b # defines the diffuse color of the material to be (r,g,b). The default is (0.8,0.8,0.8); sb.append(f"Kd {diffuse[0]:.4f} {diffuse[1]:.4f} {diffuse[2]:.4f}") + # Ks r g b - # defines the specular color of the material to be (r,g,b). This color shows up in highlights. The default is (1.0,1.0,1.0); + # defines the specular color of the material to be (r,g,b). This color shows up in highlights. + # The default is (1.0,1.0,1.0); sb.append(f"Ks {specular[0]:.4f} {specular[1]:.4f} {specular[2]:.4f}") - # d alpha - # defines the non-transparency of the material to be alpha. The default is 1.0 (not transparent at all). The quantities d and Tr are the opposites of each other, and specifying transparency or nontransparency is simply a matter of user convenience. + + # d alpha + # defines the non-transparency of the material to be alpha. + # The default is 1.0 (not transparent at all). The quantities d and Tr are the opposites of each other, + # and specifying transparency or nontransparency is simply a matter of user convenience. + # Tr alpha - # defines the transparency of the material to be alpha. The default is 0.0 (not transparent at all). The quantities d and Tr are the opposites of each other, and specifying transparency or nontransparency is simply a matter of user convenience. + # defines the transparency of the material to be alpha. The default is 0.0 (not transparent at all). + # The quantities d and Tr are the opposites of each other, + # and specifying transparency or nontransparency is simply a matter of user convenience. sb.append(f"Tr {transparency:.4f}") + # Ns s # defines the shininess of the material to be s. The default is 0.0; sb.append(f"Ns {shininess:.4f}") + # illum n - # denotes the illumination model used by the material. illum = 1 indicates a flat material with no specular highlights, so the value of Ks is not used. illum = 2 denotes the presence of specular highlights, and so a specification for Ks is required. + # denotes the illumination model used by the material. + # illum = 1 indicates a flat material with no specular highlights, + # so the value of Ks is not used. illum = 2 denotes the presence of specular highlights, + # and so a specification for Ks is required. + # map_Ka filename # names a file containing a texture map, which should just be an ASCII dump of RGB values; texName = None @@ -165,7 +172,7 @@ def properties_to_dict(properties): # FastPropertyName key = key.name - tex: Texture2D = texEnv.m_Texture.read() + tex: Texture2D = texEnv.m_Texture.deref_parse_as_object() texName = f"{tex.m_Name if tex.m_Name else key}.png" if key == "_MainTex": sb.append(f"map_Kd {texName}") diff --git a/UnityPy/export/ShaderConverter.py b/UnityPy/export/ShaderConverter.py index 67d74685c..dd3ac1c55 100644 --- a/UnityPy/export/ShaderConverter.py +++ b/UnityPy/export/ShaderConverter.py @@ -68,9 +68,7 @@ def get_entry(array: Union[List[T], List[List[T]]], index: int) -> T: return item for i in range(platformNumber): - if i >= len(m_Shader.compressedLengths) or i >= len( - m_Shader.decompressedLengths - ): + if i >= len(m_Shader.compressedLengths) or i >= len(m_Shader.decompressedLengths): # m_Shader.platforms shouldn't be longer than m_shader.[de]compressedLengths, but it is break @@ -79,9 +77,7 @@ def get_entry(array: Union[List[T], List[List[T]]], index: int) -> T: offset = get_entry(m_Shader.offsets, i) compressedBytes = compressed_blob[offset : offset + compressedSize] - decompressedBytes = CompressionHelper.decompress_lz4( - compressedBytes, decompressedSize - ) + decompressedBytes = CompressionHelper.decompress_lz4(compressedBytes, decompressedSize) shaderPrograms.append( ShaderProgram( @@ -90,9 +86,7 @@ def get_entry(array: Union[List[T], List[List[T]]], index: int) -> T: ) ) - return ConvertSerializedShaderParsedForm( - m_Shader.m_ParsedForm, m_Shader.platforms, shaderPrograms - ) + return ConvertSerializedShaderParsedForm(m_Shader.m_ParsedForm, m_Shader.platforms, shaderPrograms) def ConvertSerializedShaderParsedForm( @@ -131,17 +125,12 @@ def ConvertSerializedSubShader( sb.append(ConvertSerializedTagMap(m_SubShader.m_Tags, 1)) - sb.extend( - ConvertSerializedPass(m_Passe, platforms, shaderPrograms) - for m_Passe in m_SubShader.m_Passes - ) + sb.extend(ConvertSerializedPass(m_Passe, platforms, shaderPrograms) for m_Passe in m_SubShader.m_Passes) sb.append("}\n") return "".join(sb) -def ConvertSerializedPass( - m_Passe: SerializedPass, platforms: List[int], shaderPrograms: List[ShaderProgram] -) -> str: +def ConvertSerializedPass(m_Passe: SerializedPass, platforms: List[int], shaderPrograms: List[ShaderProgram]) -> str: sb = [] if m_Passe.m_Type == PassType.kPassTypeNormal: sb.append(" Pass ") @@ -164,47 +153,27 @@ def ConvertSerializedPass( if len(m_Passe.progVertex.m_SubPrograms) > 0: sb.append('Program "vp" {\n') - sb.append( - ConvertSerializedSubPrograms( - m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms - ) - ) + sb.append(ConvertSerializedSubPrograms(m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms)) sb.append("}\n") if len(m_Passe.progFragment.m_SubPrograms) > 0: sb.append('Program "fp" {\n') - sb.append( - ConvertSerializedSubPrograms( - m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms - ) - ) + sb.append(ConvertSerializedSubPrograms(m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms)) sb.append("}\n") if len(m_Passe.progGeometry.m_SubPrograms) > 0: sb.append('Program "gp" {\n') - sb.append( - ConvertSerializedSubPrograms( - m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms - ) - ) + sb.append(ConvertSerializedSubPrograms(m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms)) sb.append("}\n") if len(m_Passe.progHull.m_SubPrograms) > 0: sb.append('Program "hp" {\n') - sb.append( - ConvertSerializedSubPrograms( - m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms - ) - ) + sb.append(ConvertSerializedSubPrograms(m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms)) sb.append("}\n") if len(m_Passe.progDomain.m_SubPrograms) > 0: sb.append('Program "dp" {\n') - sb.append( - ConvertSerializedSubPrograms( - m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms - ) - ) + sb.append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms)) sb.append("}\n") sb.append("}\n") @@ -243,21 +212,13 @@ def typeFunc(x: SerializedSubProgram): if CheckGpuProgramUsable(platform, programKey): for subProgram in subPrograms: - sb.append( - 'SubProgram "{0} '.format(GetPlatformString(platform)) - ) + sb.append('SubProgram "{0} '.format(GetPlatformString(platform))) if isTier: - sb.append( - "hw_tier{0:02} ".format(subProgram.m_ShaderHardwareTier) - ) + sb.append("hw_tier{0:02} ".format(subProgram.m_ShaderHardwareTier)) sb.append('" {\n') - sb.append( - shaderPrograms[i] - .m_SubPrograms[subProgram.m_BlobIndex] - .Export() - ) + sb.append(shaderPrograms[i].m_SubPrograms[subProgram.m_BlobIndex].Export()) sb.append("\n}\n") @@ -318,11 +279,7 @@ def ConvertSerializedShaderState(m_State: SerializedShaderState) -> str: sb.append("\n") if m_State.offsetFactor.val != 0 or m_State.offsetUnits.val != 0: - sb.append( - " Offset {0}, {1}\n".format( - m_State.offsetFactor.val, m_State.offsetUnits.val - ) - ) + sb.append(" Offset {0}, {1}\n".format(m_State.offsetFactor.val, m_State.offsetUnits.val)) # TODO Stencil @@ -375,9 +332,7 @@ def ConvertSerializedProperty(m_Prop: SerializedProperty) -> str: elif m_Prop.m_Type == SerializedPropertyType.kFloat: sb.append("Float") elif m_Prop.m_Type == SerializedPropertyType.kRange: - sb.append( - "Range({0:g}, {1:g})".format(m_Prop.m_DefValue_1_, m_Prop.m_DefValue_2_) - ) + sb.append("Range({0:g}, {1:g})".format(m_Prop.m_DefValue_1_, m_Prop.m_DefValue_2_)) elif m_Prop.m_Type == SerializedPropertyType.kTexture: if m_Prop.m_DefTexture.m_TexDim == TextureDimension.kTexDimAny: sb.append("any") @@ -615,9 +570,8 @@ def Export(self, shader: str) -> str: class ShaderSubProgram: m_Version: int - m_ProgramCode: ShaderGpuProgramType m_Keywords: List[str] - m_ProgramCode: List[bytes] + m_ProgramCode: bytes m_LocalKeywords: Optional[List[str]] def __init__(self, reader: EndianBinaryReader): @@ -643,9 +597,7 @@ def __init__(self, reader: EndianBinaryReader): if 201806140 <= self.m_Version < 202012090: m_LocalKeywordsSize = reader.read_int() - self.m_LocalKeywords = [ - reader.read_aligned_string() for _ in range(m_LocalKeywordsSize) - ] + self.m_LocalKeywords = [reader.read_aligned_string() for _ in range(m_LocalKeywordsSize)] else: self.m_LocalKeywords = None @@ -663,11 +615,11 @@ def Export(self) -> str: sb.append("}\n") if ( - getattr(self, "m_LocalKeywords") is not None - and len(self.m_LocalKeywords) > 0 + getattr(self, "m_LocalKeywords") is not None # noqa: B009 + and len(self.m_LocalKeywords) > 0 # type: ignore ): sb.append("Local Keywords { ") - for keyword in self.m_LocalKeywords: + for keyword in self.m_LocalKeywords: # type: ignore sb.append('"{0}" '.format(keyword)) sb.append("}\n") @@ -731,11 +683,7 @@ def Export(self) -> str: ]: sb.append(bytes(self.m_ProgramCode).decode("utf8")) else: - sb.append( - "//shader disassembly not supported on {0}".format( - self.m_ProgramType - ) - ) + sb.append("//shader disassembly not supported on {0}".format(self.m_ProgramType)) sb.append('"') return "".join(sb) diff --git a/UnityPy/export/SpriteHelper.py b/UnityPy/export/SpriteHelper.py index 8a9d5c848..9ab5c8e45 100644 --- a/UnityPy/export/SpriteHelper.py +++ b/UnityPy/export/SpriteHelper.py @@ -1,9 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Dict, Iterable, Union, cast from PIL import Image, ImageDraw +from PIL.Image import Transform, Transpose +from ..classes import SpriteAtlasData from ..enums import ( ClassIDType, SpriteMeshType, @@ -39,45 +41,42 @@ def __init__(self, settings_raw): # rest of the bits are reserved -def get_image( - sprite: Sprite, texture: PPtr[Texture2D], alpha_texture: Optional[PPtr[Texture2D]] -) -> Image.Image: +def get_image(sprite: Sprite, texture: PPtr[Texture2D], alpha_texture: Optional[PPtr[Texture2D]]) -> Image.Image: + assert sprite.assets_file, "Sprite assets file is not set!" + cache = cast(Dict[Any, Any], sprite.assets_file._cache) # TODO: edit in SerializibleFile if alpha_texture: cache_id = (texture.path_id, alpha_texture.path_id) - if cache_id not in sprite.assets_file._cache: - original_image = get_image_from_texture2d(texture.read(), False) - alpha_image = get_image_from_texture2d(alpha_texture.read(), False) - original_image = Image.merge( - "RGBA", (*original_image.split()[:3], alpha_image.split()[0]) - ) - sprite.assets_file._cache[cache_id] = original_image + if cache_id not in cache: + original_image = get_image_from_texture2d(texture.deref_parse_as_object(), False) + alpha_image = get_image_from_texture2d(alpha_texture.deref_parse_as_object(), False) + original_image = Image.merge("RGBA", (*original_image.split()[:3], alpha_image.split()[0])) + cache[cache_id] = original_image else: cache_id = texture.path_id - if cache_id not in sprite.assets_file._cache: - original_image = get_image_from_texture2d(texture.read(), False) - sprite.assets_file._cache[cache_id] = original_image - return sprite.assets_file._cache[cache_id] + if cache_id not in cache: + original_image = get_image_from_texture2d(texture.deref_parse_as_object(), False) + cache[cache_id] = original_image + return cache[cache_id] def get_image_from_sprite(m_Sprite: Sprite) -> Image.Image: atlas = None if m_Sprite.m_SpriteAtlas: - atlas = m_Sprite.m_SpriteAtlas.read() + atlas = m_Sprite.m_SpriteAtlas.deref_parse_as_object() elif m_Sprite.m_AtlasTags: # looks like the direct pointer is empty, let's try to find the Atlas via its name + assert m_Sprite.assets_file, "Sprite assets file is not set!" for obj in m_Sprite.assets_file.objects.values(): if obj.type == ClassIDType.SpriteAtlas: - atlas = obj.read() - if atlas.m_Name == m_Sprite.m_AtlasTags[0]: + name = obj.peek_name() + if name == m_Sprite.m_AtlasTags[0]: + atlas = obj.parse_as_object() break atlas = None if atlas: - sprite_atlas_data = next( - value - for key, value in atlas.m_RenderDataMap - if key == m_Sprite.m_RenderDataKey - ) + sprite_atlas_data = next(value for key, value in atlas.m_RenderDataMap if key == m_Sprite.m_RenderDataKey) + assert isinstance(sprite_atlas_data, SpriteAtlasData), "SpriteAtlasData not found!" else: sprite_atlas_data = m_Sprite.m_RD @@ -101,35 +100,34 @@ def get_image_from_sprite(m_Sprite: Sprite) -> Image.Image: if settings_raw.packed == 1: rotation = settings_raw.packingRotation if rotation == SpritePackingRotation.kSPRFlipHorizontal: - sprite_image = sprite_image.transpose(Image.FLIP_LEFT_RIGHT) + sprite_image = sprite_image.transpose(Transpose.FLIP_LEFT_RIGHT) # spriteImage = RotateFlip(RotateFlipType.RotateNoneFlipX) elif rotation == SpritePackingRotation.kSPRFlipVertical: - sprite_image = sprite_image.transpose(Image.FLIP_TOP_BOTTOM) + sprite_image = sprite_image.transpose(Transpose.FLIP_TOP_BOTTOM) # spriteImage.RotateFlip(RotateFlipType.RotateNoneFlipY) elif rotation == SpritePackingRotation.kSPRRotate180: - sprite_image = sprite_image.transpose(Image.ROTATE_180) + sprite_image = sprite_image.transpose(Transpose.ROTATE_180) # spriteImage.RotateFlip(RotateFlipType.Rotate180FlipNone) elif rotation == SpritePackingRotation.kSPRRotate90: - sprite_image = sprite_image.transpose(Image.ROTATE_270) + sprite_image = sprite_image.transpose(Transpose.ROTATE_270) # spriteImage.RotateFlip(RotateFlipType.Rotate270FlipNone) if settings_raw.packingMode == SpritePackingMode.kSPMTight: + assert m_Sprite.object_reader, "Sprite object reader is not set!" mesh = MeshHandler(m_Sprite.m_RD, m_Sprite.object_reader.version) mesh.process() - if any(u or v for u, v in mesh.m_UV0): + if mesh.m_UV0 and any(u or v for u, v in mesh.m_UV0): # copy triangles from mesh sprite_image = render_sprite_mesh(m_Sprite, mesh, original_image) else: # create mask to keep only the polygon sprite_image = mask_sprite(m_Sprite, mesh, sprite_image) - return sprite_image.transpose(Image.FLIP_TOP_BOTTOM) + return sprite_image.transpose(Transpose.FLIP_TOP_BOTTOM) -def mask_sprite( - m_Sprite: Sprite, mesh: MeshHandler, sprite_image: Image.Image -) -> Image.Image: +def mask_sprite(m_Sprite: Sprite, mesh: MeshHandler, sprite_image: Image.Image) -> Image.Image: mask_img = Image.new("1", sprite_image.size, color=0) draw = ImageDraw.ImageDraw(mask_img) @@ -137,12 +135,13 @@ def mask_sprite( # shift the whole point matrix into the positive space # multiply them with a factor to scale them to the image positions = mesh.m_Vertices + assert positions, "No vertices found in sprite mesh!" + # find the axis that has only one value - can be removed + # usually the z axis min_x = min(x for x, _y, _z in positions) min_y = min(y for _x, y, _z in positions) factor = m_Sprite.m_PixelsToUnits - positions_2d = [ - ((x - min_x) * factor, (y - min_y) * factor) for x, y, _z in positions - ] + positions_2d = [((x - min_x) * factor, (y - min_y) * factor) for x, y, _z in positions] # generate triangles from the given points triangles = [ @@ -171,12 +170,14 @@ def mask_sprite( return sprite_image -def render_sprite_mesh( - m_Sprite: Sprite, mesh: MeshHandler, texture: Image.Image -) -> Image.Image: +def render_sprite_mesh(m_Sprite: Sprite, mesh: MeshHandler, texture: Image.Image) -> Image.Image: for triangles in mesh.get_triangles(): positions = mesh.m_Vertices + if not positions: + continue uv = mesh.m_UV0 + if not uv: + raise ValueError("No UV coordinates found in sprite mesh!") # 2. patch position data # 2.1 make positions 2d @@ -198,8 +199,7 @@ def render_sprite_mesh( # 2.3 convert relative positions to absolute pixels_to_units = m_Sprite.m_PixelsToUnits positions_abs = [ - (round((x - x_min) * pixels_to_units), round((y - y_min) * pixels_to_units)) - for x, y in zip(*axis_values) + (round((x - x_min) * pixels_to_units), round((y - y_min) * pixels_to_units)) for x, y in zip(*axis_values) ] width, height = texture.size uv_abs = [(round(u * width), round(v * height)) for u, v in uv] @@ -214,19 +214,21 @@ def render_sprite_mesh( for tri in triangles: copy_triangle( texture, - [uv_abs[i] for i in tri], + tuple(uv_abs[i] for i in tri), # type: ignore sprite, - [positions_abs[i] for i in tri], + tuple(positions_abs[i] for i in tri), # type: ignore ) return sprite + else: + raise ValueError("No triangles found in mesh!") def copy_triangle( src_img: Image.Image, - src_tri: Tuple[float, float], + src_tri: Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, int]], dst_img: Image.Image, - dst_tri: Tuple[float, float], + dst_tri: Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, int]], ) -> None: src_off = ( (src_tri[1][0] - src_tri[0][0], src_tri[1][1] - src_tri[0][1]), @@ -242,7 +244,15 @@ def copy_triangle( # no transform necessary, just copy the triangle # make rectangle that contains the triangle - upper_left, _, lower_right = sorted(src_tri) + # upper_left, _, lower_right = sorted(src_tri) + upper_left = ( + min(src_tri[0][0], src_tri[1][0], src_tri[2][0]), + min(src_tri[0][1], src_tri[1][1], src_tri[2][1]), + ) + lower_right = ( + max(src_tri[0][0], src_tri[1][0], src_tri[2][0]), + max(src_tri[0][1], src_tri[1][1], src_tri[2][1]), + ) src_part = src_img.crop((*upper_left, *lower_right)) # create mask for triangle @@ -252,7 +262,11 @@ def copy_triangle( maskdraw.polygon(mask_box, fill=255) # paste triangle into destination image - dst_img.paste(src_part, min(dst_tri), mask=mask) + dst = ( + int(min(dst_tri[0][0], dst_tri[1][0], dst_tri[2][0])), + int(min(dst_tri[0][1], dst_tri[1][1], dst_tri[2][1])), + ) + dst_img.paste(src_part, dst, mask=mask) else: # transform is necessary, use affine transformation # https://stackoverflow.com/a/6959111 @@ -276,9 +290,9 @@ def copy_triangle( A = np.linalg.solve(M, y) else: # np.lingal.solve - obviously way faster, but numpy will only come with 2.0 - A = linalg_solve(M, y) + A = linalg_solve(M, y) # type: ignore - transformed = src_img.transform(dst_img.size, Image.AFFINE, A) + transformed = src_img.transform(dst_img.size, Transform.AFFINE, A) mask = Image.new("1", dst_img.size) maskdraw = ImageDraw.Draw(mask) @@ -287,18 +301,18 @@ def copy_triangle( dst_img.paste(transformed, mask=mask) -def linalg_solve(M: List[List[float]], y: List[float]) -> List[float]: +def linalg_solve(M: List[List[Union[float, int]]], y: List[Union[float, int]]) -> List[float]: # M^-1 * y M_i = get_matrix_inverse(M) return [sum(M_i[i][j] * y[j] for j in range(len(y))) for i in range(len(M_i))] -def transpose_matrix(m: List[List[float]]) -> List[List[float]]: +def transpose_matrix(m: List[List[float]]) -> Iterable[List[float]]: # https://stackoverflow.com/a/39881366 return map(list, zip(*m)) -def get_matrix_minor(m: List[List[float]], i: int, j: int) -> List[float]: +def get_matrix_minor(m: List[List[float]], i: int, j: int) -> List[List[float]]: # https://stackoverflow.com/a/39881366 return [row[:j] + row[j + 1 :] for row in (m[:i] + m[i + 1 :])] @@ -309,10 +323,7 @@ def get_matrix_determinant(m: List[List[float]]) -> float: if len(m) == 2: return m[0][0] * m[1][1] - m[0][1] * m[1][0] - return sum( - ((-1) ** c) * m[0][c] * get_matrix_determinant(get_matrix_minor(m, 0, c)) - for c in range(len(m)) - ) + return sum(((-1) ** c) * m[0][c] * get_matrix_determinant(get_matrix_minor(m, 0, c)) for c in range(len(m))) def get_matrix_inverse(m: List[List[float]]) -> List[List[float]]: @@ -327,10 +338,7 @@ def get_matrix_inverse(m: List[List[float]]) -> List[List[float]]: # find matrix of cofactors cofactors = [ - [ - ((-1) ** (r + c)) * get_matrix_determinant(get_matrix_minor(m, r, c)) - for c in range(len(m)) - ] + [((-1) ** (r + c)) * get_matrix_determinant(get_matrix_minor(m, r, c)) for c in range(len(m))] for r in range(len(m)) ] cofactors = list(transpose_matrix(cofactors)) diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index 23d752939..cdb743eee 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -1,10 +1,10 @@ -from __future__ import annotations +from __future__ import annotations import struct -from copy import copy +from functools import lru_cache from io import BytesIO -from threading import Lock -from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union +from threading import get_ident +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union import astc_encoder import texture2ddecoder @@ -19,81 +19,161 @@ TF = TextureFormat +TEXTURE_FORMAT_BLOCK_SIZE_TABLE: Dict[TF, Optional[Tuple[int, int]]] = {} +for tf in TF: + if tf.name.startswith("ASTC"): + split = tf.name.rsplit("_", 1)[1].split("x") + block_size = (int(split[0]), int(split[1])) + elif tf.name.startswith(("DXT", "BC", "ETC", "EAC")): + block_size = (4, 4) + elif tf.name.startswith("PVRTC"): + block_size = (8 if tf.name.endswith("2") else 4, 4) + else: + block_size = None + TEXTURE_FORMAT_BLOCK_SIZE_TABLE[tf] = block_size + + +def get_compressed_image_size(width: int, height: int, texture_format: TextureFormat): + block_size = TEXTURE_FORMAT_BLOCK_SIZE_TABLE[texture_format] + if block_size is None: + return (width, height) + block_width, block_height = block_size + + def pad(value: int, pad_by: int) -> int: + to_pad = value % pad_by + if to_pad: + value += pad_by - to_pad + return value + + width = pad(width, block_width) + height = pad(height, block_height) + return width, height + + +def pad_image(img: Image.Image, pad_width: int, pad_height: int) -> Image.Image: + ori_width, ori_height = img.size + if pad_width == ori_width and pad_height == ori_height: + return img + + # Paste the original image at the top-left corner + pad_img = Image.new(img.mode, (pad_width, pad_height)) + pad_img.paste(img, (0, 0)) + + # Fill the right border: duplicate the last column + if pad_width != ori_width: + right_strip = img.crop((ori_width - 1, 0, ori_width, ori_height)) + right_strip = right_strip.resize((pad_width - ori_width, ori_height), resample=Image.Resampling.NEAREST) + pad_img.paste(right_strip, (ori_width, 0)) + + # Fill the bottom border: duplicate the last row + if pad_height != ori_height: + bottom_strip = img.crop((0, ori_height - 1, ori_width, ori_height)) + bottom_strip = bottom_strip.resize((ori_width, pad_height - ori_height), resample=Image.Resampling.NEAREST) + pad_img.paste(bottom_strip, (0, ori_height)) + + # Fill the bottom-right corner with the bottom-right pixel + if pad_width != ori_width and pad_height != ori_height: + corner = img.getpixel((ori_width - 1, ori_height - 1)) + corner_img = Image.new(img.mode, (pad_width - ori_width, pad_height - ori_height), color=corner) + pad_img.paste(corner_img, (ori_width, ori_height)) + + return pad_img + + +def compress_etcpak(data: bytes, width: int, height: int, target_texture_format: TextureFormat) -> bytes: + import etcpak + + if target_texture_format in [TF.DXT1, TF.DXT1Crunched]: + return etcpak.compress_bc1(data, width, height) + elif target_texture_format in [TF.DXT5, TF.DXT5Crunched]: + return etcpak.compress_bc3(data, width, height) + elif target_texture_format == TF.BC4: + return etcpak.compress_bc4(data, width, height) + elif target_texture_format == TF.BC5: + return etcpak.compress_bc5(data, width, height) + elif target_texture_format == TF.BC7: + return etcpak.compress_bc7(data, width, height, None) + elif target_texture_format in [TF.ETC_RGB4, TF.ETC_RGB4Crunched, TF.ETC_RGB4_3DS]: + return etcpak.compress_etc1_rgb(data, width, height) + elif target_texture_format == TF.ETC2_RGB: + return etcpak.compress_etc2_rgb(data, width, height) + elif target_texture_format in [TF.ETC2_RGBA8, TF.ETC2_RGBA8Crunched, TF.ETC2_RGBA1]: + return etcpak.compress_etc2_rgba(data, width, height) + else: + raise NotImplementedError(f"etcpak has no compress function for {target_texture_format.name}") + + +def compress_astc(data: bytes, width: int, height: int, target_texture_format: TextureFormat) -> bytes: + astc_image = astc_encoder.ASTCImage(astc_encoder.ASTCType.U8, width, height, 1, data) + block_size = TEXTURE_FORMAT_BLOCK_SIZE_TABLE[target_texture_format] + assert block_size is not None, f"failed to get block size for {target_texture_format.name}" + swizzle = astc_encoder.ASTCSwizzle.from_str("RGBA") + + context = get_astc_context(block_size) + enc_img = context.compress(astc_image, swizzle) + + return enc_img + def image_to_texture2d( - img: Image.Image, target_texture_format: Union[TF, int], flip: bool = True + img: Image.Image, + target_texture_format: Union[TextureFormat, int], + platform: Union[BuildTarget, int] = 0, + platform_blob: Optional[List[int]] = None, + flip: bool = True, ) -> Tuple[bytes, TextureFormat]: - if isinstance(target_texture_format, int): + """Converts a PIL Image to Texture2D bytes.""" + if not isinstance(target_texture_format, TextureFormat): target_texture_format = TextureFormat(target_texture_format) - import etcpak - if flip: - img = img.transpose(Image.FLIP_TOP_BOTTOM) + img = img.transpose(Image.Transpose.FLIP_TOP_BOTTOM) + + # defaults + compress_func = None + tex_format = TF.RGBA32 + pil_mode = "RGBA" - # DXT + # DXT / BC if target_texture_format in [TF.DXT1, TF.DXT1Crunched]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_bc1(raw_img, img.width, img.height) tex_format = TF.DXT1 + compress_func = compress_etcpak elif target_texture_format in [TF.DXT5, TF.DXT5Crunched]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_bc3(raw_img, img.width, img.height) tex_format = TF.DXT5 - elif target_texture_format in [TF.BC4]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_bc4(raw_img, img.width, img.height) - tex_format = TF.BC4 - elif target_texture_format in [TF.BC5]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_bc5(raw_img, img.width, img.height) - tex_format = TF.BC5 - elif target_texture_format in [TF.BC7]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_bc7(raw_img, img.width, img.height) - tex_format = TF.BC7 + compress_func = compress_etcpak + elif target_texture_format in [TF.BC4, TF.BC5, TF.BC7]: + tex_format = target_texture_format + compress_func = compress_etcpak + # ASTC + elif target_texture_format.name.startswith("ASTC"): + if "_HDR_" in target_texture_format.name: + block_size = TEXTURE_FORMAT_BLOCK_SIZE_TABLE[target_texture_format] + assert block_size is not None + if img.mode == "RGB": + tex_format = getattr(TF, f"ASTC_RGB_{block_size[0]}x{block_size[1]}") + else: + tex_format = getattr(TF, f"ASTC_RGBA_{block_size[0]}x{block_size[1]}") + else: + tex_format = target_texture_format + compress_func = compress_astc # ETC elif target_texture_format in [TF.ETC_RGB4, TF.ETC_RGB4Crunched, TF.ETC_RGB4_3DS]: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_etc1_rgb(raw_img, img.width, img.height) - tex_format = TF.ETC_RGB4 + if target_texture_format == TF.ETC_RGB4_3DS: + tex_format = TF.ETC_RGB4_3DS + else: + tex_format = target_texture_format + compress_func = compress_etcpak elif target_texture_format == TF.ETC2_RGB: - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_etc2_rgb(raw_img, img.width, img.height) tex_format = TF.ETC2_RGB - elif ( - target_texture_format in [TF.ETC2_RGBA8, TF.ETC2_RGBA8Crunched, TF.ETC2_RGBA1] - or "_RGB_" in target_texture_format.name - ): - raw_img = img.tobytes("raw", "RGBA") - enc_img = etcpak.compress_etc2_rgba(raw_img, img.width, img.height) + compress_func = compress_etcpak + elif target_texture_format in [TF.ETC2_RGBA8, TF.ETC2_RGBA8Crunched, TF.ETC2_RGBA1]: tex_format = TF.ETC2_RGBA8 - # ASTC - elif target_texture_format.name.startswith("ASTC"): - raw_img = img.tobytes("raw", "RGBA") - raw_img = astc_encoder.ASTCImage( - astc_encoder.ASTCType.U8, img.width, img.height, 1, raw_img - ) - block_size = tuple( - map(int, target_texture_format.name.rsplit("_", 1)[1].split("x")) - ) - if img.mode == "RGB": - tex_format = getattr(TF, f"ASTC_RGB_{block_size[0]}x{block_size[1]}") - else: - tex_format = getattr(TF, f"ASTC_RGBA_{block_size[0]}x{block_size[1]}") - - swizzle = astc_encoder.ASTCSwizzle.from_str("RGBA") - - context, lock = get_astc_context(block_size) - with lock: - enc_img = context.compress(raw_img, swizzle) - - tex_format = target_texture_format + compress_func = compress_etcpak # A elif target_texture_format == TF.Alpha8: - enc_img = img.tobytes("raw", "A") tex_format = TF.Alpha8 - # R - should probably be moerged into #A, as pure R is used as Alpha + pil_mode = "A" + # R - should probably be merged into #A, as pure R is used as Alpha # but need test data for this first elif target_texture_format in [ TF.R8, @@ -103,98 +183,118 @@ def image_to_texture2d( TF.EAC_R, TF.EAC_R_SIGNED, ]: - enc_img = img.tobytes("raw", "R") tex_format = TF.R8 + pil_mode = "R" # RGBA elif target_texture_format in [ TF.RGB565, TF.RGB24, + TF.BGR24, TF.RGB9e5Float, TF.PVRTC_RGB2, TF.PVRTC_RGB4, TF.ATC_RGB4, ]: - enc_img = img.tobytes("raw", "RGB") tex_format = TF.RGB24 + pil_mode = "RGB" # everything else defaulted to RGBA + + width, height = img.width, img.height + switch_info = None + + if TextureSwizzler.is_switch_swizzled(platform, platform_blob): + s_tex_format = tex_format + if tex_format == TF.RGB24: + s_tex_format = TF.RGBA32 + pil_mode = "RGBA" + elif tex_format == TF.BGR24: + s_tex_format = TF.BGRA32 + pil_mode = "BGRA" + + assert platform_blob is not None + gobs_per_block = TextureSwizzler.get_switch_gobs_per_block(platform_blob) + block_size = TextureSwizzler.TEXTURE_FORMAT_BLOCK_SIZE_MAP[s_tex_format] + width, height = TextureSwizzler.get_padded_texture_size(img.width, img.height, *block_size, gobs_per_block) + switch_info = (block_size, gobs_per_block) + + if compress_func: + width, height = get_compressed_image_size(width, height, tex_format) + img = pad_image(img, width, height) + enc_img = compress_func(img.tobytes("raw", "RGBA"), width, height, tex_format) else: - enc_img = img.tobytes("raw", "RGBA") - tex_format = TF.RGBA32 + if switch_info: + img = pad_image(img, width, height) - return enc_img, tex_format + enc_img = img.tobytes("raw", pil_mode) + if switch_info: + block_size, gobs_per_block = switch_info + enc_img = bytes(TextureSwizzler.swizzle(enc_img, width, height, *block_size, gobs_per_block)) -def assert_rgba(img: Image.Image, target_texture_format: TextureFormat) -> Image.Image: - if img.mode == "RGB": - img = img.convert("RGBA") - assert ( - img.mode == "RGBA" - ), f"{target_texture_format} compression only supports RGB & RGBA images" # noqa: E501 - return img + return enc_img, tex_format def get_image_from_texture2d( texture_2d: Texture2D, flip: bool = True, ) -> Image.Image: - """converts the given texture into PIL.Image - - :param texture_2d: texture to be converterd - :type texture_2d: Texture2D - :param flip: flips the image back to the original (all Unity textures are flipped by default) - :type flip: bool - :return: PIL.Image object - :rtype: Image - """ + """Converts the given Texture2D object to PIL Image.""" return parse_image_data( texture_2d.get_image_data(), texture_2d.m_Width, texture_2d.m_Height, texture_2d.m_TextureFormat, - texture_2d.object_reader.version, - texture_2d.object_reader.platform, + getattr(texture_2d.object_reader, "version", (0, 0, 0, 0)), + getattr(texture_2d.object_reader, "platform", BuildTarget.UnknownPlatform), getattr(texture_2d, "m_PlatformBlob", None), flip, ) def parse_image_data( - image_data: bytes, + image_data: Union[bytes, bytearray, memoryview], width: int, height: int, - texture_format: Union[int, TextureFormat], - version: tuple, - platform: int, - platform_blob: Optional[bytes] = None, + texture_format: Union[TextureFormat, int], + version: Tuple[int, int, int, int], + platform: Union[BuildTarget, int], + platform_blob: Optional[List[int]] = None, flip: bool = True, ) -> Image.Image: - image_data = copy(bytes(image_data)) + """Converts the given image data bytes to PIL Image.""" + if not width or not height: + return Image.new("RGBA", (0, 0)) + if not image_data: raise ValueError("Texture2D has no image data") - selection = CONV_TABLE[texture_format] - - if len(selection) == 0: - raise NotImplementedError( - f"Not implemented texture format: {texture_format}" - ) + if not isinstance(texture_format, TextureFormat): + texture_format = TextureFormat(texture_format) if platform == BuildTarget.XBOX360 and texture_format in XBOX_SWAP_FORMATS: image_data = swap_bytes_for_xbox(image_data) - elif platform == BuildTarget.Switch and platform_blob is not None: - gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block(platform_blob) - block_size = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[texture_format] - padded_size = TextureSwizzler.get_padded_texture_size( - width, height, *block_size, gobsPerBlock - ) - image_data = TextureSwizzler.deswizzle( - image_data, *padded_size, *block_size, gobsPerBlock - ) - if not isinstance(texture_format, TextureFormat): - texture_format = TextureFormat(texture_format) + original_width, original_height = (width, height) + + if TextureSwizzler.is_switch_swizzled(platform, platform_blob): + if texture_format == TF.RGB24: + texture_format = TF.RGBA32 + elif texture_format == TF.BGR24: + texture_format = TF.BGRA32 + + assert platform_blob is not None + gobs_per_block = TextureSwizzler.get_switch_gobs_per_block(platform_blob) + block_size = TextureSwizzler.TEXTURE_FORMAT_BLOCK_SIZE_MAP[texture_format] + width, height = TextureSwizzler.get_padded_texture_size(width, height, *block_size, gobs_per_block) + image_data = TextureSwizzler.deswizzle(image_data, width, height, *block_size, gobs_per_block) + else: + width, height = get_compressed_image_size(width, height, texture_format) + + if not isinstance(image_data, bytes): + # bytes(bytes item) would cause an unnecessary copy + image_data = bytes(image_data) + if "Crunched" in texture_format.name: - version = version if ( version[0] > 2017 or (version[0] == 2017 and version[1] >= 3) # 2017.3 and up @@ -205,18 +305,24 @@ def parse_image_data( else: image_data = texture2ddecoder.unpack_crunch(image_data) - img = selection[0](image_data, width, height, *selection[1:]) + if texture_format not in CONV_TABLE: + raise NotImplementedError(f"Not implemented texture format: {texture_format.name}") + conv_func, conv_args = CONV_TABLE[texture_format] + + img = conv_func(image_data, width, height, *conv_args) + + if original_width != width or original_height != height: + img = img.crop((0, 0, original_width, original_height)) if img and flip: - return img.transpose(Image.FLIP_TOP_BOTTOM) + return img.transpose(Image.Transpose.FLIP_TOP_BOTTOM) return img -def swap_bytes_for_xbox(image_data: bytes) -> bytes: - """swaps the texture bytes - This is required for textures deployed on XBOX360. - """ +def swap_bytes_for_xbox(image_data: Union[bytes, bytearray, memoryview]) -> bytearray: + """Swaps the texture bytes for textures deployed on XBOX360.""" + image_data = bytearray(image_data) for i in range(0, len(image_data), 2): image_data[i : i + 2] = image_data[i : i + 2][::-1] return image_data @@ -229,13 +335,9 @@ def pillow( mode: str, codec: str, args, - swap: Optional[tuple] = None, + swap: Optional[Tuple[int, ...]] = None, ) -> Image.Image: - img = ( - Image.frombytes(mode, (width, height), image_data, codec, args) - if width - else Image.new(mode, (width, height)) - ) + img = Image.frombytes(mode, (width, height), image_data, codec, args) if width else Image.new(mode, (width, height)) if swap: channels = img.split() img = Image.merge(mode, [channels[x] for x in swap]) @@ -257,32 +359,32 @@ def astc(image_data: bytes, width: int, height: int, block_size: tuple) -> Image if len(image_data) < texture_size: raise ValueError(f"Invalid ASTC data size: {len(image_data)} < {texture_size}") - context, lock = get_astc_context(block_size) - with lock: - context.decompress( - image_data[:texture_size], image, astc_encoder.ASTCSwizzle.from_str("RGBA") - ) + context = get_astc_context(block_size) + context.decompress(image_data[:texture_size], image, astc_encoder.ASTCSwizzle.from_str("RGBA")) + assert image.data is not None, "Decompression failed, image data is None" return Image.frombytes("RGBA", (width, height), image.data, "raw", "RGBA") -ASTC_CONTEXTS: Dict[Tuple[int, int], Tuple[astc_encoder.ASTCContext, Lock]] = {} +@lru_cache(maxsize=128) +def _get_astc_context(ident: int, block_size: tuple): + config = astc_encoder.ASTCConfig( + astc_encoder.ASTCProfile.LDR, + *block_size, + block_z=1, + quality=100, + flags=astc_encoder.ASTCConfigFlags.USE_DECODE_UNORM8, + ) + context = astc_encoder.ASTCContext(config) + return context def get_astc_context(block_size: tuple): - """Get the ASTC context and its lock using the given `block_size`.""" - if block_size not in ASTC_CONTEXTS: - config = astc_encoder.ASTCConfig( - astc_encoder.ASTCProfile.LDR, - *block_size, - block_z=1, - quality=100, - flags=astc_encoder.ASTCConfigFlags.USE_DECODE_UNORM8, - ) - context = astc_encoder.ASTCContext(config) - lock = Lock() - ASTC_CONTEXTS[block_size] = (context, lock) - return ASTC_CONTEXTS[block_size] + """Get the ASTC context for the current thread using the given `block_size`. + Created contexts belong to and only to the calling thread, and may be cached. + This function is thread safe. + """ + return _get_astc_context(get_ident(), block_size) def calculate_astc_compressed_size(width: int, height: int, block_size: tuple) -> int: @@ -300,22 +402,22 @@ def pvrtc(image_data: bytes, width: int, height: int, fmt: bool) -> Image.Image: return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") -def etc(image_data: bytes, width: int, height: int, fmt: list) -> Image.Image: - if fmt[0] == 1: +def etc(image_data: bytes, width: int, height: int, fmt: str) -> Image.Image: + if fmt == "ETC1": image_data = texture2ddecoder.decode_etc1(image_data, width, height) - elif fmt[0] == 2: - if fmt[1] == "RGB": - image_data = texture2ddecoder.decode_etc2(image_data, width, height) - elif fmt[1] == "A1": - image_data = texture2ddecoder.decode_etc2a1(image_data, width, height) - elif fmt[1] == "A8": - image_data = texture2ddecoder.decode_etc2a8(image_data, width, height) + elif fmt == "ETC2_RGB": + image_data = texture2ddecoder.decode_etc2(image_data, width, height) + elif fmt == "ETC2_A1": + image_data = texture2ddecoder.decode_etc2a1(image_data, width, height) + elif fmt == "ETC2_A8": + image_data = texture2ddecoder.decode_etc2a8(image_data, width, height) else: - raise NotImplementedError("unknown etc mode") + raise NotImplementedError(f"Unknown ETC mode: {fmt}") + return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") -def eac(image_data: bytes, width: int, height: int, fmt: list) -> Image.Image: +def eac(image_data: bytes, width: int, height: int, fmt: str) -> Image.Image: if fmt == "EAC_R": image_data = texture2ddecoder.decode_eacr(image_data, width, height) elif fmt == "EAC_R_SIGNED": @@ -324,6 +426,9 @@ def eac(image_data: bytes, width: int, height: int, fmt: list) -> Image.Image: image_data = texture2ddecoder.decode_eacrg(image_data, width, height) elif fmt == "EAC_RG_SIGNED": image_data = texture2ddecoder.decode_eacrg_signed(image_data, width, height) + else: + raise NotImplementedError(f"Unknown EAC mode: {fmt}") + return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") @@ -338,10 +443,7 @@ def half( ) -> Image.Image: # convert half-float to int8 stream = BytesIO(image_data) - image_data = bytes( - int(struct.unpack("e", stream.read(2))[0] * 256) - for _ in range(width * height * len(codec)) - ) + image_data = bytes(int(struct.unpack("e", stream.read(2))[0] * 256) for _ in range(width * height * len(codec))) return pillow(image_data, width, height, mode, codec, args, swap) @@ -354,17 +456,12 @@ def half( } -def rg( - image_data: bytes, width: int, height: int, mode: str, codec: str, args -) -> Image.Image: +def rg(image_data: bytes, width: int, height: int, mode: str, codec: str, args) -> Image.Image: # convert rg to rgb by adding in zeroes padding_size = RG_PADDING_MAP[codec] stream = BytesIO(image_data) padding = bytes(padding_size) - rgb_data = b"".join( - stream.read(padding_size * 2) + padding - for _ in range(len(image_data) // (2 * padding_size)) - ) + rgb_data = b"".join(stream.read(padding_size * 2) + padding for _ in range(len(image_data) // (2 * padding_size))) if codec == "RGE": return half(rgb_data, width, height, mode, "RGB", args) else: @@ -387,90 +484,86 @@ def rgb9e5float(image_data: bytes, width: int, height: int) -> Image.Image: return Image.frombytes("RGB", (width, height), rgb, "raw", "RGB") -CONV_TABLE = { - # FORMAT FUNC #ARGS..... - # ----------------------- -------- -------- ------------ ----------------- ------------ ---------- - (TF.Alpha8, pillow, "RGBA", "raw", "A"), - (TF.ARGB4444, pillow, "RGBA", "raw", "RGBA;4B", (2, 1, 0, 3)), - (TF.RGB24, pillow, "RGB", "raw", "RGB"), - (TF.RGBA32, pillow, "RGBA", "raw", "RGBA"), - (TF.ARGB32, pillow, "RGBA", "raw", "ARGB"), - (TF.ARGBFloat, pillow, "RGBA", "raw", "RGBAF", (2, 1, 0, 3)), - (TF.RGB565, pillow, "RGB", "raw", "BGR;16"), - (TF.BGR24, pillow, "RGB", "raw", "BGR"), - (TF.R8, pillow, "RGB", "raw", "R"), - (TF.R16, pillow, "RGB", "raw", "R;16"), - (TF.RG16, rg, "RGB", "raw", "RG"), - (TF.DXT1, pillow, "RGBA", "bcn", 1), - (TF.DXT3, pillow, "RGBA", "bcn", 2), - (TF.DXT5, pillow, "RGBA", "bcn", 3), - (TF.RGBA4444, pillow, "RGBA", "raw", "RGBA;4B", (3, 2, 1, 0)), - (TF.BGRA32, pillow, "RGBA", "raw", "BGRA"), - (TF.RHalf, half, "R", "raw", "R"), - (TF.RGHalf, rg, "RGB", "raw", "RGE"), - (TF.RGBAHalf, half, "RGB", "raw", "RGB"), - (TF.RFloat, pillow, "RGB", "raw", "RF"), - (TF.RGFloat, rg, "RGB", "raw", "RGF"), - (TF.RGBAFloat, pillow, "RGBA", "raw", "RGBAF"), - (TF.YUY2,), - (TF.RGB9e5Float, rgb9e5float), - (TF.BC4, pillow, "L", "bcn", 4), - (TF.BC5, pillow, "RGB", "bcn", 5), - (TF.BC6H, pillow, "RGBA", "bcn", 6), - (TF.BC7, pillow, "RGBA", "bcn", 7), - (TF.DXT1Crunched, pillow, "RGBA", "bcn", 1), - (TF.DXT5Crunched, pillow, "RGBA", "bcn", 3), - (TF.PVRTC_RGB2, pvrtc, True), - (TF.PVRTC_RGBA2, pvrtc, True), - (TF.PVRTC_RGB4, pvrtc, False), - (TF.PVRTC_RGBA4, pvrtc, False), - (TF.ETC_RGB4, etc, (1,)), - (TF.ATC_RGB4, atc, False), - (TF.ATC_RGBA8, atc, True), - (TF.EAC_R, eac, "EAC_R"), - (TF.EAC_R_SIGNED, eac, "EAC_R:SIGNED"), - (TF.EAC_RG, eac, "EAC_RG"), - (TF.EAC_RG_SIGNED, eac, "EAC_RG_SIGNED"), - (TF.ETC2_RGB, etc, (2, "RGB")), - (TF.ETC2_RGBA1, etc, (2, "A1")), - (TF.ETC2_RGBA8, etc, (2, "A8")), - (TF.ASTC_RGB_4x4, astc, (4, 4)), - (TF.ASTC_RGB_5x5, astc, (5, 5)), - (TF.ASTC_RGB_6x6, astc, (6, 6)), - (TF.ASTC_RGB_8x8, astc, (8, 8)), - (TF.ASTC_RGB_10x10, astc, (10, 10)), - (TF.ASTC_RGB_12x12, astc, (12, 12)), - (TF.ASTC_RGBA_4x4, astc, (4, 4)), - (TF.ASTC_RGBA_5x5, astc, (5, 5)), - (TF.ASTC_RGBA_6x6, astc, (6, 6)), - (TF.ASTC_RGBA_8x8, astc, (8, 8)), - (TF.ASTC_RGBA_10x10, astc, (10, 10)), - (TF.ASTC_RGBA_12x12, astc, (12, 12)), - (TF.ETC_RGB4_3DS, etc, (1,)), - (TF.ETC_RGBA8_3DS, etc, (1,)), - (TF.ETC_RGB4Crunched, etc, (1,)), - (TF.ETC2_RGBA8Crunched, etc, (2, "A8")), - (TF.ASTC_HDR_4x4, astc, (4, 4)), - (TF.ASTC_HDR_5x5, astc, (5, 5)), - (TF.ASTC_HDR_6x6, astc, (6, 6)), - (TF.ASTC_HDR_8x8, astc, (8, 8)), - (TF.ASTC_HDR_10x10, astc, (10, 10)), - (TF.ASTC_HDR_12x12, astc, (12, 12)), - (TF.RG32, rg, "RGB", "raw", "RG;16"), - (TF.RGB48, pillow, "RGB", "raw", "RGB;16"), - (TF.RGBA64, pillow, "RGBA", "raw", "RGBA;16"), - (TF.R8_SIGNED, pillow, "R", "raw", "R;8s"), - (TF.RG16_SIGNED, rg, "RGB", "raw", "RG;8s"), - (TF.RGB24_SIGNED, pillow, "RGB", "raw", "RGB;8s"), - (TF.RGBA32_SIGNED, pillow, "RGBA", "raw", "RGBA;8s"), - (TF.R16_SIGNED, pillow, "R", "raw", "R;16s"), - (TF.RG32_SIGNED, rg, "RGB", "raw", "RG;16s"), - (TF.RGB48_SIGNED, pillow, "RGB", "raw", "RGB;16s"), - (TF.RGBA64_SIGNED, pillow, "RGBA", "raw", "RGBA;16s"), +# Mapping TextureFormat -> (converter function, (additional args, ...)) +CONV_TABLE: Dict[TF, Tuple[Callable[..., Image.Image], Tuple[Any, ...]]] = { + TF.Alpha8: (pillow, ("RGBA", "raw", "A")), + TF.ARGB4444: (pillow, ("RGBA", "raw", "RGBA;4B", (2, 1, 0, 3))), + TF.RGB24: (pillow, ("RGB", "raw", "RGB")), + TF.RGBA32: (pillow, ("RGBA", "raw", "RGBA")), + TF.ARGB32: (pillow, ("RGBA", "raw", "ARGB")), + TF.ARGBFloat: (pillow, ("RGBA", "raw", "RGBAF", (2, 1, 0, 3))), + TF.RGB565: (pillow, ("RGB", "raw", "BGR;16")), + TF.BGR24: (pillow, ("RGB", "raw", "BGR")), + TF.R8: (pillow, ("RGB", "raw", "R")), + TF.R16: (pillow, ("RGB", "raw", "R;16")), + TF.RG16: (rg, ("RGB", "raw", "RG")), + TF.DXT1: (pillow, ("RGBA", "bcn", 1)), + TF.DXT3: (pillow, ("RGBA", "bcn", 2)), + TF.DXT5: (pillow, ("RGBA", "bcn", 3)), + TF.RGBA4444: (pillow, ("RGBA", "raw", "RGBA;4B", (3, 2, 1, 0))), + TF.BGRA32: (pillow, ("RGBA", "raw", "BGRA")), + TF.RHalf: (half, ("R", "raw", "R")), + TF.RGHalf: (rg, ("RGB", "raw", "RGE")), + TF.RGBAHalf: (half, ("RGB", "raw", "RGB")), + TF.RFloat: (pillow, ("RGB", "raw", "RF")), + TF.RGFloat: (rg, ("RGB", "raw", "RGF")), + TF.RGBAFloat: (pillow, ("RGBA", "raw", "RGBAF")), + # TF.YUY2: NotImplementedError("YUY2 not implemented"), + TF.RGB9e5Float: (rgb9e5float, ()), + TF.BC4: (pillow, ("L", "bcn", 4)), + TF.BC5: (pillow, ("RGB", "bcn", 5)), + TF.BC6H: (pillow, ("RGB", "bcn", 6)), + TF.BC7: (pillow, ("RGBA", "bcn", 7)), + TF.DXT1Crunched: (pillow, ("RGBA", "bcn", 1)), + TF.DXT5Crunched: (pillow, ("RGBA", "bcn", 3)), + TF.PVRTC_RGB2: (pvrtc, (True,)), + TF.PVRTC_RGBA2: (pvrtc, (True,)), + TF.PVRTC_RGB4: (pvrtc, (False,)), + TF.PVRTC_RGBA4: (pvrtc, (False,)), + TF.ETC_RGB4: (etc, ("ETC1",)), + TF.ATC_RGB4: (atc, (False,)), + TF.ATC_RGBA8: (atc, (True,)), + TF.EAC_R: (eac, ("EAC_R",)), + TF.EAC_R_SIGNED: (eac, ("EAC_R_SIGNED",)), + TF.EAC_RG: (eac, ("EAC_RG",)), + TF.EAC_RG_SIGNED: (eac, ("EAC_RG_SIGNED",)), + TF.ETC2_RGB: (etc, ("ETC2_RGB",)), + TF.ETC2_RGBA1: (etc, ("ETC2_A1",)), + TF.ETC2_RGBA8: (etc, ("ETC2_A8",)), + TF.ASTC_RGB_4x4: (astc, ((4, 4),)), + TF.ASTC_RGB_5x5: (astc, ((5, 5),)), + TF.ASTC_RGB_6x6: (astc, ((6, 6),)), + TF.ASTC_RGB_8x8: (astc, ((8, 8),)), + TF.ASTC_RGB_10x10: (astc, ((10, 10),)), + TF.ASTC_RGB_12x12: (astc, ((12, 12),)), + TF.ASTC_RGBA_4x4: (astc, ((4, 4),)), + TF.ASTC_RGBA_5x5: (astc, ((5, 5),)), + TF.ASTC_RGBA_6x6: (astc, ((6, 6),)), + TF.ASTC_RGBA_8x8: (astc, ((8, 8),)), + TF.ASTC_RGBA_10x10: (astc, ((10, 10),)), + TF.ASTC_RGBA_12x12: (astc, ((12, 12),)), + TF.ETC_RGB4_3DS: (etc, ("ETC1",)), + TF.ETC_RGBA8_3DS: (etc, ("ETC1",)), + TF.ETC_RGB4Crunched: (etc, ("ETC1",)), + TF.ETC2_RGBA8Crunched: (etc, ("ETC2_A8",)), + TF.ASTC_HDR_4x4: (astc, ((4, 4),)), + TF.ASTC_HDR_5x5: (astc, ((5, 5),)), + TF.ASTC_HDR_6x6: (astc, ((6, 6),)), + TF.ASTC_HDR_8x8: (astc, ((8, 8),)), + TF.ASTC_HDR_10x10: (astc, ((10, 10),)), + TF.ASTC_HDR_12x12: (astc, ((12, 12),)), + TF.RG32: (rg, ("RGB", "raw", "RG;16")), + TF.RGB48: (pillow, ("RGB", "raw", "RGB;16")), + TF.RGBA64: (pillow, ("RGBA", "raw", "RGBA;16")), + TF.R8_SIGNED: (pillow, ("R", "raw", "R;8s")), + TF.RG16_SIGNED: (rg, ("RGB", "raw", "RG;8s")), + TF.RGB24_SIGNED: (pillow, ("RGB", "raw", "RGB;8s")), + TF.RGBA32_SIGNED: (pillow, ("RGBA", "raw", "RGBA;8s")), + TF.R16_SIGNED: (pillow, ("R", "raw", "R;16s")), + TF.RG32_SIGNED: (rg, ("RGB", "raw", "RG;16s")), + TF.RGB48_SIGNED: (pillow, ("RGB", "raw", "RGB;16s")), + TF.RGBA64_SIGNED: (pillow, ("RGBA", "raw", "RGBA;16s")), } -# format conv_table to a dict -CONV_TABLE = {line[0]: line[1:] for line in CONV_TABLE} - # XBOX Swap Formats XBOX_SWAP_FORMATS = [TF.RGB565, TF.DXT1, TF.DXT1Crunched, TF.DXT5, TF.DXT5Crunched] diff --git a/UnityPy/export/__init__.py b/UnityPy/export/__init__.py index 995eb7741..0381efb02 100644 --- a/UnityPy/export/__init__.py +++ b/UnityPy/export/__init__.py @@ -1 +1,15 @@ -from . import MeshRendererExporter, SpriteHelper, Texture2DConverter, AudioClipConverter, MeshExporter +from . import ( + AudioClipConverter, + MeshExporter, + MeshRendererExporter, + SpriteHelper, + Texture2DConverter, +) + +__all__ = [ + "AudioClipConverter", + "MeshExporter", + "MeshRendererExporter", + "SpriteHelper", + "Texture2DConverter", +] diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index c35a04836..3e17d7dea 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -1,14 +1,14 @@ # TODO: implement encryption for saving files -from collections import namedtuple import re -from typing import Tuple, Union +from collections import namedtuple +from typing import Optional, Union, cast -from . import File +from .. import config from ..enums import ArchiveFlags, ArchiveFlagsOld, CompressionFlags from ..helpers import ArchiveStorageManager, CompressionHelper +from ..helpers.UnityVersion import UnityVersion from ..streams import EndianBinaryReader, EndianBinaryWriter - -from .. import config +from . import File BlockInfo = namedtuple("BlockInfo", "uncompressedSize compressedSize flags") DirectoryInfoFS = namedtuple("DirectoryInfoFS", "offset size flags path") @@ -21,12 +21,16 @@ class BundleFile(File.File): signature: str version_engine: str version_player: str - dataflags: Tuple[ArchiveFlags, ArchiveFlagsOld] - decryptor: ArchiveStorageManager.ArchiveStorageDecryptor = None + dataflags: Union[ArchiveFlags, ArchiveFlagsOld] + decryptor: Optional[ArchiveStorageManager.ArchiveStorageDecryptor] = None _uses_block_alignment: bool = False def __init__( - self, reader: EndianBinaryReader, parent: File, name: str = None, **kwargs + self, + reader: EndianBinaryReader, + parent: File, + name: Optional[str] = None, + **kwargs, ): super().__init__(parent=parent, name=name, **kwargs) signature = self.signature = reader.read_string_to_null() @@ -37,7 +41,10 @@ def __init__( if signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif signature in ["UnityWeb", "UnityRaw"]: - m_DirectoryInfo, blocksReader = self.read_web_raw(reader) + if self.version == 6: + m_DirectoryInfo, blocksReader = self.read_fs(reader) + else: + m_DirectoryInfo, blocksReader = self.read_web_raw(reader) elif signature == "UnityFS": m_DirectoryInfo, blocksReader = self.read_fs(reader) else: @@ -52,20 +59,20 @@ def read_web_raw(self, reader: EndianBinaryReader): self._hash = reader.read_bytes(16) self.crc = reader.read_u_int() - minimumStreamedBytes = reader.read_u_int() + minimumStreamedBytes = reader.read_u_int() # noqa: F841 headerSize = reader.read_u_int() - numberOfLevelsToDownloadBeforeStreaming = reader.read_u_int() + numberOfLevelsToDownloadBeforeStreaming = reader.read_u_int() # noqa: F841 levelCount = reader.read_int() reader.Position += 4 * 2 * (levelCount - 1) compressedSize = reader.read_u_int() - uncompressedSize = reader.read_u_int() + uncompressedSize = reader.read_u_int() # noqa: F841 if version >= 2: - completeFileSize = reader.read_u_int() + completeFileSize = reader.read_u_int() # noqa: F841 if version >= 3: - fileInfoHeaderSize = reader.read_u_int() + fileInfoHeaderSize = reader.read_u_int() # noqa: F841 reader.Position = headerSize @@ -87,14 +94,18 @@ def read_web_raw(self, reader: EndianBinaryReader): return m_DirectoryInfo, blocksReader def read_fs(self, reader: EndianBinaryReader): - size = reader.read_long() + size = reader.read_long() # noqa: F841 # header compressedSize = reader.read_u_int() uncompressedSize = reader.read_u_int() - self.dataflags = reader.read_u_int() + dataflagsValue = reader.read_u_int() + + # UnityWeb version 6 + if self.signature != "UnityFS": + reader.read_byte() - version = self.get_version_tuple() + version = self.parse_version() # https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch # Unity CN introduced encryption before the alignment fix was introduced. # Unity CN used the same flag for the encryption as later on the alignment fix, @@ -105,43 +116,32 @@ def read_fs(self, reader: EndianBinaryReader): or (version[0] == 2021 and version < (2021, 3, 2)) or (version[0] == 2022 and version < (2022, 1, 1)) ): - self.dataflags = ArchiveFlagsOld(self.dataflags) + self.dataflags = ArchiveFlagsOld(dataflagsValue) else: - self.dataflags = ArchiveFlags(self.dataflags) + self.dataflags = ArchiveFlags(dataflagsValue) if self.dataflags & self.dataflags.UsesAssetBundleEncryption: self.decryptor = ArchiveStorageManager.ArchiveStorageDecryptor(reader) - # check if we need to align the reader - # - align to 16 bytes and check if all are 0 - # - if not, reset the reader to the previous position - if self.version >= 7: + # if header version is 7 or later we need to align the reader + # for 2019.4.15 and later, version should be 7 and aligned + # but some games in these versions somehow has version 6 while aligned + if self.version >= 7 or (version[0] == 2019 and version >= (2019, 4, 15)): reader.align_stream(16) self._uses_block_alignment = True - elif version >= (2019, 4): - pre_align = reader.Position - align_data = reader.read((16 - pre_align % 16) % 16) - if any(align_data): - reader.Position = pre_align - else: - self._uses_block_alignment = True start = reader.Position - if ( - self.dataflags & ArchiveFlags.BlocksInfoAtTheEnd - ): # kArchiveBlocksInfoAtTheEnd + if self.dataflags & ArchiveFlags.BlocksInfoAtTheEnd: # kArchiveBlocksInfoAtTheEnd reader.Position = reader.Length - compressedSize blocksInfoBytes = reader.read_bytes(compressedSize) reader.Position = start else: # 0x40 kArchiveBlocksAndDirectoryInfoCombined blocksInfoBytes = reader.read_bytes(compressedSize) - blocksInfoBytes = self.decompress_data( - blocksInfoBytes, uncompressedSize, self.dataflags - ) + blocksInfoBytes = self.decompress_data(blocksInfoBytes, uncompressedSize, self.dataflags) blocksInfoReader = EndianBinaryReader(blocksInfoBytes, offset=start) - uncompressedDataHash = blocksInfoReader.read_bytes(16) + uncompressedDataHash = blocksInfoReader.read_bytes(16) # noqa: F841 blocksInfoCount = blocksInfoReader.read_int() m_BlocksInfo = [ @@ -167,10 +167,7 @@ def read_fs(self, reader: EndianBinaryReader): if m_BlocksInfo: self._block_info_flags = m_BlocksInfo[0].flags - if ( - isinstance(self.dataflags, ArchiveFlags) - and self.dataflags & ArchiveFlags.BlockInfoNeedPaddingAtStart - ): + if isinstance(self.dataflags, ArchiveFlags) and self.dataflags & ArchiveFlags.BlockInfoNeedPaddingAtStart: reader.align_stream(16) blocksReader = EndianBinaryReader( @@ -201,8 +198,8 @@ def save(self, packer=None): original - uses the original flags """ # file_header - # signature (string_to_null) - # format (int) + # signature (string_to_null) + # format (int) # version_player (string_to_null) # version_engine (string_to_null) writer = EndianBinaryWriter() @@ -215,7 +212,10 @@ def save(self, packer=None): if self.signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif self.signature in ["UnityWeb", "UnityRaw"]: - self.save_web_raw(writer) + if self.version == 6: + self.save_fs(writer, 64, 64) + else: + self.save_web_raw(writer) elif self.signature == "UnityFS": if not packer or packer == "none": self.save_fs(writer, 64, 64) @@ -252,11 +252,11 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i # data_flag # header: - # bundle_size (long) - # compressed_size (int) - # uncompressed_size (int) - # flag (int) - # ?padding? (bool) + # bundle_size (long) + # compressed_size (int) + # uncompressed_size (int) + # flag (int) + # ?padding? (bool) # This will be written at the end, # because the size can only be calculated after the data compression, @@ -266,21 +266,21 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i # *read compressed_size -> uncompressed_size # 0x10 offset # *read blocks infos of the data stream - # count (int) + # count (int) # ( - # uncompressed_size(uint) - # compressed_size (uint) - # flag(short) + # uncompressed_size (uint) + # compressed_size (uint) + # flag (short) # ) # *decompression via info.flag & 0x3F # *afterwards the file positions - # file_count (int) + # file_count (int) # ( # offset (long) - # size (long) - # flag (int) - # name (string_to_null) + # size (long) + # flag (int) + # name (string_to_null) # ) # file list & file data @@ -291,9 +291,7 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i name, f.flags, data_writer.write_bytes( - f.bytes - if isinstance(f, (EndianBinaryReader, EndianBinaryWriter)) - else f.save() + f.bytes if isinstance(f, (EndianBinaryReader, EndianBinaryWriter)) else f.save() ), ) for name, f in self.files.items() @@ -302,9 +300,13 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i file_data = data_writer.bytes data_writer.dispose() - file_data, block_info = CompressionHelper.chunk_based_compress( - file_data, block_info_flag - ) + # remove encryption flag, as encryption isn't done + if block_info_flag & self.dataflags.UsesAssetBundleEncryption: + block_info_flag ^= self.dataflags.UsesAssetBundleEncryption + if data_flag & self.dataflags.UsesAssetBundleEncryption: + data_flag ^= self.dataflags.UsesAssetBundleEncryption + + file_data, block_info = CompressionHelper.chunk_based_compress(file_data, block_info_flag) # write the block_info # uncompressedDataHash @@ -321,9 +323,7 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i # file block info if not data_flag & 0x40: - raise NotImplementedError( - "UnityPy always writes DirectoryInfo, so data_flag must include 0x40" - ) + raise NotImplementedError("UnityPy always writes DirectoryInfo, so data_flag must include 0x40") # file count block_writer.write_int(len(files)) offset = 0 @@ -345,12 +345,10 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i uncompressed_block_data_size = len(block_data) switch = data_flag & 0x3F - if switch == 1: # LZMA - block_data = CompressionHelper.compress_lzma(block_data) - elif switch in [2, 3]: # LZ4, LZ4HC - block_data = CompressionHelper.compress_lz4(block_data) - elif switch == 4: # LZHAM - raise NotImplementedError + if switch in CompressionHelper.COMPRESSION_MAP: + block_data = CompressionHelper.COMPRESSION_MAP[switch](block_data) + else: + raise NotImplementedError(f"No compression function in the CompressionHelper.COMPRESSION_MAP for {switch}") compressed_block_data_size = len(block_data) @@ -365,6 +363,10 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i # compression and file layout flag writer.write_u_int(data_flag) + # UnityWeb version 6 + if self.signature != "UnityFS": + writer.write_byte(0) + if self._uses_block_alignment: # UnityFS\x00 - 8 # size 8 @@ -390,7 +392,6 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i writer.write_long(writer_end_pos) writer.Position = writer_end_pos - def save_web_raw(self, writer: EndianBinaryWriter): # (version >= 4) hash # (version >= 4) crc @@ -440,7 +441,7 @@ def save_web_raw(self, writer: EndianBinaryWriter): file_content_writer.write_bytes(file_data) current_offset += file_size - directory_info_writer.write(b'\x00' * file_info_header_padding_size) + directory_info_writer.write(b"\x00" * file_info_header_padding_size) uncompressed_directory_info = directory_info_writer.bytes uncompressed_file_content = file_content_writer.bytes @@ -451,7 +452,7 @@ def save_web_raw(self, writer: EndianBinaryWriter): compressed_content = CompressionHelper.compress_lzma(uncompressed_content, True) # Write header - header_size = writer.Position + 24 # assuming levelCount = 1 + header_size = writer.Position + 24 # assuming levelCount = 1 if self.version >= 2: header_size += 4 if self.version >= 3: @@ -485,7 +486,6 @@ def save_web_raw(self, writer: EndianBinaryWriter): # Write compressed content writer.write(compressed_content) - def decompress_data( self, compressed_data: bytes, @@ -509,20 +509,28 @@ def decompress_data( The decompressed data.""" comp_flag = CompressionFlags(flags & ArchiveFlags.CompressionTypeMask) - if comp_flag == CompressionFlags.LZMA: # LZMA - return CompressionHelper.decompress_lzma(compressed_data) - elif comp_flag in [CompressionFlags.LZ4, CompressionFlags.LZ4HC]: # LZ4, LZ4HC - if self.decryptor is not None and flags & 0x100: - compressed_data = self.decryptor.decrypt_block(compressed_data, index) - return CompressionHelper.decompress_lz4(compressed_data, uncompressed_size) - elif comp_flag == CompressionFlags.LZHAM: # LZHAM - raise NotImplementedError("LZHAM decompression not implemented") + if self.decryptor is not None and flags & 0x100 and comp_flag != CompressionFlags.NONE: + compressed_data = self.decryptor.decrypt_block(compressed_data, index) + + if comp_flag in CompressionHelper.DECOMPRESSION_MAP: + return cast( + bytes, + CompressionHelper.DECOMPRESSION_MAP[comp_flag](compressed_data, uncompressed_size), + ) else: - return compressed_data + raise ValueError(f"Unknown compression! flag: {flags}, compression flag: {comp_flag.value}") - def get_version_tuple(self) -> Tuple[int, int, int]: + def parse_version(self) -> UnityVersion: """Returns the version as a tuple.""" - version = self.version_engine - if not version or version == "0.0.0": - version = config.get_fallback_version() - return tuple(map(int, reVersion.match(version).groups())) + version = None + version_str = self.version_engine + try: + version = UnityVersion.from_str(version_str) + except ValueError: + pass + + if version is None or version.major == 0: + version_str = config.get_fallback_version() + version = UnityVersion.from_str(version_str) + + return version diff --git a/UnityPy/files/File.py b/UnityPy/files/File.py index 34cd3f0d4..e672f197c 100644 --- a/UnityPy/files/File.py +++ b/UnityPy/files/File.py @@ -13,7 +13,7 @@ DirectoryInfo = namedtuple("DirectoryInfo", "path offset size") -class File(object): +class File: name: str files: Dict[str, File] environment: Environment @@ -34,9 +34,7 @@ def __init__( self.is_changed = False self.cab_file = "CAB-UnityPy_Mod.resS" self.parent = parent - self.environment = self.environment = ( - getattr(parent, "environment", parent) if parent else None - ) + self.environment = getattr(parent, "environment", parent) if parent else None self.name = basename(name) if isinstance(name, str) else "" self.is_dependency = is_dependency @@ -51,8 +49,8 @@ def get_assets(self): elif isinstance(f, SerializedFile.SerializedFile): yield f - def get_filtered_objects(self, obj_types=[]): - if len(obj_types) == 0: + def get_filtered_objects(self, obj_types: Optional[list] = None): + if obj_types is None or len(obj_types) == 0: return self.get_objects() for f in self.files.values(): if isinstance(f, (BundleFile.BundleFile, WebFile.WebFile)): @@ -80,12 +78,8 @@ def read_files(self, reader: EndianBinaryReader, files: list): for node in files: reader.Position = node.offset name = node.path - node_reader = EndianBinaryReader( - reader.read(node.size), offset=(reader.BaseOffset + node.offset) - ) - f = ImportHelper.parse_file( - node_reader, self, name, is_dependency=self.is_dependency - ) + node_reader = EndianBinaryReader(reader.read(node.size), offset=(reader.BaseOffset + node.offset)) + f = ImportHelper.parse_file(node_reader, self, name, is_dependency=self.is_dependency) if isinstance(f, (EndianBinaryReader, SerializedFile.SerializedFile)): if self.environment: @@ -95,10 +89,10 @@ def read_files(self, reader: EndianBinaryReader, files: list): f.flags = getattr(node, "flags", 0) self.files[name] = f - def get_writeable_cab(self, name: str = None): + def get_writeable_cab(self, name: Optional[str] = None): """ Creates a new cab file in the bundle that contains the given data. - This is usefull for asset types that use resource files. + This is useful for asset types that use resource files. """ if not name: @@ -111,9 +105,7 @@ def get_writeable_cab(self, name: str = None): if isinstance(self.files[name], EndianBinaryWriter): return self.files[name] else: - raise ValueError( - "This cab already exists and isn't an EndianBinaryWriter" - ) + raise ValueError("This cab already exists and isn't an EndianBinaryWriter") writer = EndianBinaryWriter() # try to find another resource file to copy the flags from @@ -130,12 +122,7 @@ def get_writeable_cab(self, name: str = None): @property def container(self): - return { - path: obj - for f in self.files.values() - if isinstance(f, File) - for path, obj in f.container.items() - } + return {path: obj for f in self.files.values() if isinstance(f, File) for path, obj in f.container.items()} def get(self, key, default=None): return getattr(self, key, default) @@ -162,4 +149,4 @@ def mark_changed(self): # recursive import requires the import down here -from . import BundleFile, ObjectReader, SerializedFile, WebFile +from . import BundleFile, ObjectReader, SerializedFile, WebFile # noqa: E402 diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index 5d2c4853e..b5fe1dbd0 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -1,8 +1,21 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Generic, List, Optional, Tuple, Type, TypeVar, Union - -from ..classes import NamedObject +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Generic, + List, + Optional, + Type, + TypeVar, + Union, + cast, +) + +from attrs import define + +from ..classes import MonoBehaviour from ..classes.ClassIDTypeToClassMap import ClassIDTypeToClassMap from ..enums import ClassIDType from ..exceptions import TypeTreeError @@ -12,101 +25,111 @@ from ..streams import EndianBinaryReader, EndianBinaryWriter if TYPE_CHECKING: - from ..enums import BuildTarget - from ..files.SerializedFile import BuildType, SerializedFile, SerializedType + from ..files.SerializedFile import SerializedFile, SerializedType T = TypeVar("T") +NodeInput = Union[TypeTreeNode, List[Dict[str, Union[str, int]]]] +@define( + slots=True, +) class ObjectReader(Generic[T]): assets_file: SerializedFile reader: EndianBinaryReader - data: bytes - version: Tuple[int, int, int, int] - version2: int - platform: BuildTarget - build_type: BuildType path_id: int - byte_start_offset: Tuple[int, int] - byte_start: int - byte_size_offset: Tuple[int, int] - byte_size: int type_id: int serialized_type: Optional[SerializedType] class_id: int type: ClassIDType + byte_start: int + byte_size: int is_destroyed: Optional[int] is_stripped: Optional[int] + data: Optional[bytes] = None + _read_until: Optional[int] = None + + @property + def version(self): + return self.assets_file.version + + @property + def version2(self): + return self.assets_file.header.version + + @property + def platform(self): + return self.assets_file.target_platform # saves where the parser stopped # in case that not all data is read # and the obj.data is changed, the unknown data can be added again - - def __init__(self, assets_file: SerializedFile, reader: EndianBinaryReader): - self.assets_file = assets_file - self.reader = reader - self.data = b"" - self.version = assets_file.version - self.version2 = assets_file.header.version - self.platform = assets_file.target_platform - self.build_type = assets_file.build_type - + @classmethod + def from_reader(cls, assets_file: SerializedFile, reader: EndianBinaryReader) -> ObjectReader[Any]: header = assets_file.header types = assets_file.types # AssetStudio ObjectInfo init if assets_file.big_id_enabled: - self.path_id = reader.read_long() + path_id = reader.read_long() elif header.version < 14: - self.path_id = reader.read_int() + path_id = reader.read_int() else: reader.align_stream() - self.path_id = reader.read_long() + path_id = reader.read_long() if header.version >= 22: - self.byte_start_offset = (self.reader.real_offset(), 8) - self.byte_start = reader.read_long() + byte_start = reader.read_long() else: - self.byte_start_offset = (self.reader.real_offset(), 4) - self.byte_start = reader.read_u_int() - - self.byte_start += header.data_offset - self.byte_header_offset = header.data_offset - self.byte_base_offset = self.reader.BaseOffset + byte_start = reader.read_u_int() - self.byte_size_offset = (self.reader.real_offset(), 4) - self.byte_size = reader.read_u_int() + byte_start += header.data_offset + byte_size = reader.read_u_int() - self.type_id = reader.read_int() + type_id = reader.read_int() + serialized_type = None if header.version < 16: - self.class_id = reader.read_u_short() - self.serialized_type = None + class_id = reader.read_u_short() for typ in types: - if typ.class_id == self.type_id: - self.serialized_type = typ + if typ.class_id == type_id: + serialized_type = typ break else: - typ = types[self.type_id] - self.serialized_type = typ - self.class_id = typ.class_id + typ = types[type_id] + serialized_type = typ + class_id = typ.class_id - self.type = ClassIDType(self.class_id) + clz_type = ClassIDType(class_id) + is_destroyed = None if header.version < 11: - self.is_destroyed = reader.read_u_short() + is_destroyed = reader.read_u_short() if 11 <= header.version < 17: script_type_index = reader.read_short() - if self.serialized_type: - self.serialized_type.script_type_index = script_type_index + if serialized_type: + serialized_type.script_type_index = script_type_index + is_stripped = None if header.version == 15 or header.version == 16: - self.stripped = reader.read_byte() + is_stripped = reader.read_byte() + + return cls( + assets_file, + reader, + path_id, + type_id, + serialized_type, + class_id, + clz_type, + byte_start, + byte_size, + is_destroyed, + is_stripped, + ) - def write( - self, header, writer: EndianBinaryWriter, data_writer: EndianBinaryWriter - ): + def write(self, header, writer: EndianBinaryWriter, data_writer: EndianBinaryWriter): if self.assets_file.big_id_enabled: writer.write_long(self.path_id) elif header.version < 14: @@ -115,7 +138,7 @@ def write( writer.align_stream() writer.write_long(self.path_id) - if self.data: + if self.data is not None: data = self.data # in some cases the parser doesn't read all of the object data # games might still require the missing data @@ -144,39 +167,40 @@ def write( writer.write_u_short(self.class_id) if header.version < 11: + assert self.is_destroyed is not None writer.write_u_short(self.is_destroyed) if 11 <= header.version < 17: + assert self.serialized_type is not None writer.write_short(self.serialized_type.script_type_index) if header.version == 15 or header.version == 16: - writer.write_byte(self.stripped) + assert self.is_stripped is not None + writer.write_byte(self.is_stripped) - def set_raw_data(self, data): + def set_raw_data(self, data: bytes): self.data = data if self.assets_file: self.assets_file.mark_changed() def get_class(self) -> Union[Type[T], None]: - return ClassIDTypeToClassMap.get(self.type) + return ClassIDTypeToClassMap.get(self.type) # type: ignore def peek_name(self) -> Union[str, None]: """Peeks the name of the object without reading/parsing the whole object.""" - # TODO: EditorExtension might be enough - clz = self.get_class() - if clz and issubclass(clz, NamedObject): - self.reset() - if self.platform == BuildTarget.NoTarget: - # 2x PPtr - raise NotImplementedError( - "Directly fetching the name for 'NoTarget' platform is not supported" - ) - return self.reader.read_aligned_string() + node = self._get_typetree_node() + peek_node = node.get_name_peek_node() + if peek_node: + node, key = peek_node + return self.parse_as_dict(node, check_read=False)[key] else: return None @property def container(self): + env = self.assets_file.environment + if env is not None: + env._build_container_index() return self.assets_file._container.path_dict.get(self.path_id) @property @@ -191,9 +215,7 @@ def reset(self): self.reader.Position = self.byte_start def read(self, check_read: bool = True) -> T: - obj = self.read_typetree(wrap=True, check_read=check_read) - self._read_until = self.reader.Position - return obj + return self.read_typetree(wrap=True, check_read=check_read) # type: ignore def get(self, key, default=None): return getattr(self, key, default) @@ -213,7 +235,7 @@ def __repr__(self): def dump_typetree_structure( self, - nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, + nodes: Optional[NodeInput] = None, indent: str = " ", ) -> str: node = self._get_typetree_node(nodes) @@ -221,12 +243,12 @@ def dump_typetree_structure( def read_typetree( self, - nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, + nodes: Optional[NodeInput] = None, wrap: bool = False, check_read: bool = True, ) -> Union[dict, T]: - self.reset() node = self._get_typetree_node(nodes) + self.reset() ret = TypeTreeHelper.read_typetree( node, self.reader, @@ -236,14 +258,14 @@ def read_typetree( check_read=check_read, ) if wrap: - ret.set_object_reader(self) - return ret + ret.set_object_reader(self) # type: ignore + return ret # type: ignore def save_typetree( self, - tree: dict, - nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, - writer: EndianBinaryWriter = None, + tree: Union[dict, T], + nodes: Optional[NodeInput] = None, + writer: Optional[EndianBinaryWriter] = None, ): node = self._get_typetree_node(nodes) if not writer: @@ -261,7 +283,8 @@ def get_raw_data(self) -> bytes: return ret def _get_typetree_node( - self, node: Optional[Union[TypeTreeNode, List[dict]]] = None + self, + node: Optional[NodeInput] = None, ) -> TypeTreeNode: if isinstance(node, TypeTreeNode): return node @@ -274,13 +297,59 @@ def _get_typetree_node( node = self.serialized_type.node if not node: node = get_typetree_node(self.class_id, self.version) + if node.m_Type == "MonoBehaviour": + try: + node = self.generate_monobehaviour_node(node) + except ValueError: + pass if not node: raise TypeTreeError("There are no TypeTree nodes for this object.") return node # UnityPy 2 syntax early implementation - def parse_as_object(self) -> T: - return self.read() + def parse_as_object(self, node: Optional[NodeInput] = None, check_read: bool = True) -> T: + return self.read_typetree(nodes=node, wrap=True, check_read=check_read) # type: ignore + + def parse_as_dict(self, node: Optional[NodeInput] = None, check_read: bool = True) -> dict[str, Any]: + return self.read_typetree(nodes=node, wrap=False, check_read=check_read) # type: ignore + + def patch( + self, + obj: Union[dict, T], + nodes: Optional[NodeInput] = None, + writer: Optional[EndianBinaryWriter] = None, + ): + return self.save_typetree(obj, nodes=nodes, writer=writer) + + # MonoBehaviour specific methods + def parse_monobehaviour_head(self, mb_node: Optional[TypeTreeNode] = None) -> MonoBehaviour: + if mb_node is None: + mb_node = get_typetree_node(ClassIDType.MonoBehaviour, self.version) + + mb = self.read_typetree(nodes=mb_node, wrap=True, check_read=False) + return cast(MonoBehaviour, mb) + + def generate_monobehaviour_node(self, mb_node: Optional[TypeTreeNode] = None) -> TypeTreeNode: + env = self.assets_file.environment + generator = env.typetree_generator + if generator is None: + raise ValueError("MonoBehaviour detected, but no typetree_generator set to the environment!") + + monobehaviour = self.parse_monobehaviour_head(mb_node) + script = monobehaviour.m_Script.deref_parse_as_object() + + if script.m_Namespace != "": + fullname = f"{script.m_Namespace}.{script.m_ClassName}" + else: + fullname = script.m_ClassName + + node = generator.get_nodes_up(script.m_AssemblyName, fullname) + if node: + return node + else: + raise ValueError(f"Failed to generate MonoBehaviour node for {fullname} of {script.m_AssemblyName}!") + - def parse_as_dict(self) -> dict: - return self.read_typetree() +__all__ = [ + "ObjectReader", +] diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 7ee9fc934..d8853378b 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -1,19 +1,22 @@ -from __future__ import annotations +from __future__ import annotations -import re from ntpath import basename -from typing import TYPE_CHECKING, Dict, Generator, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Dict, List, Optional, Tuple from attrs import define from .. import config -from ..enums import BuildTarget, ClassIDType, CommonString +from ..enums import BuildTarget, ClassIDType +from ..helpers.ContainerHelper import ContainerHelper +from ..helpers.Tpk import get_common_strings from ..helpers.TypeTreeHelper import TypeTreeNode +from ..helpers.UnityVersion import UnityVersion from ..streams import EndianBinaryWriter -from . import BundleFile, File, ObjectReader +from . import BundleFile, File +from .ObjectReader import ObjectReader if TYPE_CHECKING: - from ..classes import AssetBundle, AssetInfo, Object, PPtr + from ..classes import AssetBundle, Object from ..files import ObjectReader from ..streams.EndianBinaryReader import EndianBinaryReader @@ -24,7 +27,7 @@ class SerializedFileHeader: file_size: int version: int data_offset: int - endian: bytes + endian: str reserved: bytes def __init__(self, reader: EndianBinaryReader): @@ -83,34 +86,20 @@ def __init__(self, header: SerializedFileHeader, reader: EndianBinaryReader): def write(self, header: SerializedFileHeader, writer: EndianBinaryWriter): if header.version >= 6: + assert self.temp_empty is not None writer.write_string_to_null(self.temp_empty) if header.version >= 5: + assert self.guid is not None and self.type is not None writer.write_bytes(self.guid) writer.write_int(self.type) writer.write_string_to_null(self.path) -@define(slots=True) -class BuildType: - build_type: str - - def __init__(self, build_type): - self.build_type = build_type - - @property - def IsAlpha(self): - return self.build_type == "a" - - @property - def IsPatch(self): - return self.build_type == "p" - - @define(slots=True, init=False) class SerializedType: class_id: int is_stripped_type: Optional[bool] = None - script_type_index: Optional[int] = -1 + script_type_index: int = -1 script_id: Optional[bytes] = None # Hash128 old_type_hash: Optional[bytes] = None # Hash128 node: Optional[TypeTreeNode] = None @@ -119,7 +108,7 @@ class SerializedType: m_NameSpace: Optional[str] = None m_AssemblyName: Optional[str] = None # 21+ - type_dependencies: Optional[List[int]] = None + type_dependencies: Optional[Tuple[int, ...]] = None def __init__( self, @@ -170,9 +159,11 @@ def write( writer.write_int(self.class_id) if version >= 16: + assert self.is_stripped_type is not None writer.write_boolean(self.is_stripped_type) if version >= 17: + assert self.script_type_index is not None writer.write_short(self.script_type_index) if version >= 13: @@ -181,7 +172,9 @@ def write( or (version < 16 and self.class_id < 0) or (version >= 16 and self.class_id == 114) ): + assert self.script_id is not None writer.write_bytes(self.script_id) # Hash128 + assert self.old_type_hash is not None writer.write_bytes(self.old_type_hash) # Hash128 if serialized_file._enable_type_tree: @@ -193,22 +186,28 @@ def write( if version >= 21: if is_ref_type: + assert ( + self.m_ClassName is not None + and self.m_NameSpace is not None + and self.m_AssemblyName is not None + ) writer.write_string_to_null(self.m_ClassName) writer.write_string_to_null(self.m_NameSpace) writer.write_string_to_null(self.m_AssemblyName) else: + assert self.type_dependencies is not None writer.write_int_array(self.type_dependencies, True) @property - def nodes(self) -> Union[TypeTreeNode, None]: + def nodes(self) -> Optional[TypeTreeNode]: # for compatibility with old versions return self.node class SerializedFile(File.File): reader: EndianBinaryReader + version: UnityVersion unity_version: str - build_type: BuildType target_platform: BuildTarget _enable_type_tree: bool types: List[SerializedType] @@ -221,8 +220,7 @@ class SerializedFile(File.File): _m_target_platform: int big_id_enabled: int userInformation: Optional[str] - assetbundle: AssetBundle - container: ContainerHelper + assetbundle: Optional[AssetBundle] _cache: Dict[str, Object] @property @@ -240,8 +238,6 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs) self.reader = reader self.unity_version = "2.5.0f5" - self.version = (0, 0, 0, 0) - self.build_type = BuildType("") self.target_platform = BuildTarget.UnknownPlatform self._enable_type_tree = True self.types = [] @@ -296,28 +292,21 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs) object_count = reader.read_int() self.objects = {} for _ in range(object_count): - obj = ObjectReader.ObjectReader(self, reader) + obj = ObjectReader.from_reader(self, reader) self.objects[obj.path_id] = obj # Read Scripts if header.version >= 11: script_count = reader.read_int() - self.script_types = [ - LocalSerializedObjectIdentifier(header, reader) - for _ in range(script_count) - ] + self.script_types = [LocalSerializedObjectIdentifier(header, reader) for _ in range(script_count)] # Read Externals externals_count = reader.read_int() - self.externals = [ - FileIdentifier(header, reader) for _ in range(externals_count) - ] + self.externals = [FileIdentifier(header, reader) for _ in range(externals_count)] if header.version >= 20: ref_type_count = reader.read_int() - self.ref_types = [ - SerializedType(reader, self, True) for _ in range(ref_type_count) - ] + self.ref_types = [SerializedType(reader, self, True) for _ in range(ref_type_count)] if config.SERIALIZED_FILE_PARSE_TYPETREE is False: self._enable_type_tree = False @@ -328,18 +317,18 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs) # read the asset_bundles to get the containers for obj in self.objects.values(): if obj.type == ClassIDType.AssetBundle: - self.assetbundle = obj.read() + self.assetbundle = obj.parse_as_object() self._container = ContainerHelper(self.assetbundle) break else: self.assetbundle = None - self._container = ContainerHelper() + self._container = ContainerHelper([]) @property def container(self): return self._container - def load_dependencies(self, possible_dependencies: list = []): + def load_dependencies(self, possible_dependencies: Optional[list] = None): """Load all external dependencies. Parameters @@ -350,6 +339,10 @@ def load_dependencies(self, possible_dependencies: list = []): """ for file_id in self.externals: self.environment.load_file(file_id.path, True) + + if possible_dependencies is None: + return + for dependency in possible_dependencies: try: self.environment.load_file(dependency, True) @@ -365,19 +358,14 @@ def set_version(self, string_version: str): string_version = self.parent.version_engine if not string_version or string_version == "0.0.0": string_version = config.get_fallback_version() - build_type = re.findall(r"([^\d.])", string_version) - self.build_type = BuildType(build_type[0] if build_type else "") - version_split = re.split(r"\D", string_version) - self.version = tuple(int(x) for x in version_split[:4]) + self.version = UnityVersion.from_str(string_version) def get_writeable_cab(self, name: str = "CAB-UnityPy_Mod.resS"): """ Creates a new cab file in the bundle that contains the given data. This is usefull for asset types that use resource files. """ - if not isinstance( - self.parent, (File.BundleFile.BundleFile, File.WebFile.WebFile) - ): + if not isinstance(self.parent, (File.BundleFile.BundleFile, File.WebFile.WebFile)): return None cab = self.parent.get_writeable_cab(name) @@ -399,7 +387,7 @@ class FileIdentifierFake: return cab - def save(self, packer: str = None) -> bytes: + def save(self, packer: Optional[str] = None) -> bytes: # 1. header -> has to be delayed until the very end # 2. data -> types, objects, scripts, ... @@ -427,7 +415,7 @@ def save(self, packer: str = None) -> bytes: # ReadObjects meta_writer.write_int(len(self.objects)) - for obj in self.objects.values(): + for obj in sorted(self.objects.values(), key=lambda x: x.path_id): obj.write(header, meta_writer, data_writer) data_writer.align_stream(8) @@ -443,11 +431,13 @@ def save(self, packer: str = None) -> bytes: external.write(header, meta_writer) if header.version >= 20: + assert self.ref_types is not None meta_writer.write_int(len(self.ref_types)) for ref_type in self.ref_types: ref_type.write(self, meta_writer, True) if header.version >= 5: + assert self.userInformation is not None meta_writer.write_string_to_null(self.userInformation) # prepare header @@ -511,59 +501,4 @@ def read_string(string_buffer_reader: EndianBinaryReader, value: int) -> str: return string_buffer_reader.read_string_to_null() offset = value & 0x7FFFFFFF - return CommonString.get(offset, str(offset)) - - -@define(slots=True) -class ContainerHelper: - """Helper class to allow multidict containers - without breaking compatibility with old versions""" - - container: List[Tuple[str, AssetInfo]] - container_dict: Dict[str, PPtr[Object]] - path_dict: Dict[int, str] - - def __init__(self, assetbundle: Optional[AssetBundle] = None) -> None: - if assetbundle is None: - self.container = [] - else: - self.container = assetbundle.m_Container - # support for getitem - self.container_dict = {key: value.asset for key, value in self.container} - self.path_dict = {value.asset.m_PathID: key for key, value in self.container} - - def items(self) -> Generator[Tuple[str, PPtr[Object]], None, None]: - return ((key, value.asset) for key, value in self.container) - - def keys(self) -> list[str]: - return list({key for key, value in self.container}) - - def values(self) -> list[PPtr[Object]]: - return list({value.asset for key, value in self.container}) - - def __getitem__(self, key) -> PPtr[Object]: - return self.container_dict[key] - - def __setitem__(self, key, value) -> None: - raise NotImplementedError("Assigning to container is not allowed!") - - def __delitem__(self, key) -> None: - raise NotImplementedError("Deleting from the container is not allowed!") - - def __iter__(self) -> Generator[str, None, None]: - return iter(self.keys()) - - def __len__(self) -> int: - return len(self.container) - - def __getattr__(self, name: str) -> PPtr[Object]: - return self.container_dict[name] - - def __or__(self, other: ContainerHelper): - return ContainerHelper(list(set(self.container + other.container))) - - def __str__(self) -> str: - return f'{{{", ".join(f"{key}: {value}" for key, value in self.items())}}}' - - def __dict__(self) -> Dict[str, PPtr[Object]]: - return self.container_dict + return get_common_strings().get(offset, str(offset)) diff --git a/UnityPy/files/WebFile.py b/UnityPy/files/WebFile.py index da7946aaa..5521fbd7c 100644 --- a/UnityPy/files/WebFile.py +++ b/UnityPy/files/WebFile.py @@ -1,6 +1,8 @@ -from . import File +from typing import Optional + from ..helpers import CompressionHelper from ..streams import EndianBinaryReader, EndianBinaryWriter +from . import File class WebFile(File.File): @@ -36,8 +38,8 @@ def __init__(self, reader: EndianBinaryReader, parent: File, name=None, **kwargs # signature check signature = reader.read_string_to_null() - if signature != "UnityWebData1.0": - return + if not signature.startswith(("UnityWebData", "TuanjieWebData")): + raise ValueError(f"Invalid WebFile signature: {signature!r}. Expected 'UnityWebData' or 'TuanjieWebData'.") self.signature = signature # read header -> contains file headers @@ -55,7 +57,7 @@ def __init__(self, reader: EndianBinaryReader, parent: File, name=None, **kwargs def save( self, - files: dict = None, + files: Optional[dict] = None, packer: str = "none", signature: str = "UnityWebData1.0", ) -> bytes: @@ -66,10 +68,7 @@ def save( packer = self.packer # get raw data - files = { - name: f.bytes if isinstance(f, EndianBinaryReader) else f.save() - for name, f in files.items() - } + files = {name: f.bytes if isinstance(f, EndianBinaryReader) else f.save() for name, f in files.items()} # create writer writer = EndianBinaryWriter(endian="<") @@ -80,9 +79,7 @@ def save( offset = sum( [ writer.Position, # signature - sum( - len(path.encode("utf-8")) for path in files.keys() - ), # path of each file + sum(len(path.encode("utf-8")) for path in files.keys()), # path of each file 4 * 3 * len(files), # 3 ints per file 4, # offset int ] diff --git a/UnityPy/files/__init__.py b/UnityPy/files/__init__.py index bdaecc90a..076605d16 100644 --- a/UnityPy/files/__init__.py +++ b/UnityPy/files/__init__.py @@ -1,5 +1,14 @@ -from .File import File, DirectoryInfo -from .SerializedFile import SerializedFile from .BundleFile import BundleFile -from .WebFile import WebFile +from .File import DirectoryInfo, File from .ObjectReader import ObjectReader +from .SerializedFile import SerializedFile +from .WebFile import WebFile + +__all__ = [ + "BundleFile", + "DirectoryInfo", + "File", + "ObjectReader", + "SerializedFile", + "WebFile", +] diff --git a/UnityPy/helpers/ArchiveStorageManager.py b/UnityPy/helpers/ArchiveStorageManager.py index 797aa0186..13c59c842 100644 --- a/UnityPy/helpers/ArchiveStorageManager.py +++ b/UnityPy/helpers/ArchiveStorageManager.py @@ -1,6 +1,6 @@ # based on: https://github.com/Razmoth/PGRStudio/blob/master/AssetStudio/PGR/PGR.cs import re -from typing import Tuple, Union +from typing import Optional, Tuple, Union from ..streams import EndianBinaryReader @@ -10,16 +10,14 @@ UnityPyBoost = None UNITY3D_SIGNATURE = b"#$unity3dchina!@" -DECRYPT_KEY: bytes = None +DECRYPT_KEY: Optional[bytes] = None def set_assetbundle_decrypt_key(key: Union[bytes, str]): if isinstance(key, str): key = key.encode("utf-8", "surrogateescape") if len(key) != 16: - raise ValueError( - f"AssetBundle Key length is wrong. It should be 16 bytes and now is {len(key)} bytes." - ) + raise ValueError(f"AssetBundle Key length is wrong. It should be 16 bytes and now is {len(key)} bytes.") global DECRYPT_KEY DECRYPT_KEY = key @@ -61,20 +59,12 @@ def brute_force_key( return None -def to_uint4_array(source: bytes, offset: int = 0): - buffer = bytearray(len(source) * 2) - for j in range(len(source)): - buffer[j * 2] = source[offset + j] >> 4 - buffer[j * 2 + 1] = source[offset + j] & 15 - return buffer - - class ArchiveStorageDecryptor: unknown_1: int index: bytes substitute: bytes = bytes(0x10) - def __init__(self, reader: EndianBinaryReader) -> None: + def __init__(self, reader: EndianBinaryReader): self.unknown_1 = reader.read_u_int() # read vector data/key vectors @@ -87,7 +77,7 @@ def __init__(self, reader: EndianBinaryReader) -> None: [ "The BundleFile is encrypted, but no key was provided!", "You can set the key via UnityPy.set_assetbundle_decrypt_key(key).", - "To try brute-forcing the key, use UnityPy.helpers.ArchiveStorageManager.brute_force_key(fp, key_sig, data_sig)", + "To try brute-forcing the key, use UnityPy.helpers.ArchiveStorageManager.brute_force_key(fp, key_sig, data_sig)", # noqa: E501 f"with key_sig = {self.key_sig}, data_sig = {self.data_sig}," "and fp being the path to global-metadata.dat or a memory dump.", ] @@ -99,14 +89,11 @@ def __init__(self, reader: EndianBinaryReader) -> None: raise Exception(f"Invalid signature {signature} != {UNITY3D_SIGNATURE}") data = decrypt_key(self.key, self.data, DECRYPT_KEY) - data = to_uint4_array(data) + data = bytes(nibble for byte in data for nibble in (byte >> 4, byte & 0xF)) self.index = data[:0x10] - self.substitute = bytes( - data[0x10 + i * 4 + j] for j in range(4) for i in range(4) - ) + self.substitute = bytes(data[0x10 + i * 4 + j] for j in range(4) for i in range(4)) def decrypt_block(self, data: bytes, index: int): - if UnityPyBoost: return UnityPyBoost.decrypt_block(self.index, self.substitute, data, index) @@ -119,21 +106,18 @@ def decrypt_block(self, data: bytes, index: int): index += 1 return data - def decrypt_byte(self, view: bytearray, offset: int, index: int): + def decrypt_byte(self, view: Union[bytearray, memoryview], offset: int, index: int): b = ( self.substitute[((index >> 2) & 3) + 4] + self.substitute[index & 3] + self.substitute[((index >> 4) & 3) + 8] + self.substitute[(index % 256 >> 6) + 12] ) - view[offset] = ( - (self.index[view[offset] & 0xF] - b) & 0xF - | 0x10 * (self.index[view[offset] >> 4] - b) - ) % 256 + view[offset] = ((self.index[view[offset] & 0xF] - b) & 0xF | 0x10 * (self.index[view[offset] >> 4] - b)) % 256 b = view[offset] return b, offset + 1, index + 1 - def decrypt(self, data: bytearray, index: int, remaining: int): + def decrypt(self, data: Union[bytearray, memoryview], index: int, remaining: int): offset = 0 curByte, offset, index = self.decrypt_byte(data, offset, index) @@ -157,3 +141,6 @@ def decrypt(self, data: bytearray, index: int, remaining: int): b, offset, index = self.decrypt_byte(data, offset, index) return offset + + # def encrypt(self, data: bytes): + # # TODO: patch BundleFile encryption flag to keep either 0x1000 or 0x400 diff --git a/UnityPy/helpers/CompressionHelper.py b/UnityPy/helpers/CompressionHelper.py index 9572d40a4..a318959e7 100644 --- a/UnityPy/helpers/CompressionHelper.py +++ b/UnityPy/helpers/CompressionHelper.py @@ -1,21 +1,24 @@ import gzip import lzma import struct -from typing import Tuple +from typing import Callable, Dict, Tuple, Union import brotli import lz4.block +from ..enums.BundleFile import CompressionFlags + +ByteString = Union[bytes, bytearray, memoryview] GZIP_MAGIC: bytes = b"\x1f\x8b" BROTLI_MAGIC: bytes = b"brotli" # LZMA -def decompress_lzma(data: bytes, read_decompressed_size: bool = False) -> bytes: +def decompress_lzma(data: ByteString, read_decompressed_size: bool = False) -> bytes: """decompresses lzma-compressed data :param data: compressed data - :type data: bytes + :type data: ByteString :raises _lzma.LZMAError: Compressed data ended before the end-of-stream marker was reached :return: uncompressed data :rtype: bytes @@ -41,13 +44,13 @@ def decompress_lzma(data: bytes, read_decompressed_size: bool = False) -> bytes: return dec.decompress(data[data_offset:]) -def compress_lzma(data: bytes, write_decompressed_size: bool = False) -> bytes: +def compress_lzma(data: ByteString, write_decompressed_size: bool = False) -> bytes: """compresses data via lzma (unity specific) The current static settings may not be the best solution, but they are the most commonly used values and should therefore be enough for the time being. :param data: uncompressed data - :type data: bytes + :type data: ByteString :return: compressed data :rtype: bytes """ @@ -77,11 +80,11 @@ def compress_lzma(data: bytes, write_decompressed_size: bool = False) -> bytes: # LZ4 -def decompress_lz4(data: bytes, uncompressed_size: int) -> bytes: # LZ4M/LZ4HC +def decompress_lz4(data: ByteString, uncompressed_size: int) -> bytes: # LZ4M/LZ4HC """decompresses lz4-compressed data :param data: compressed data - :type data: bytes + :type data: ByteString :param uncompressed_size: size of the uncompressed data :type uncompressed_size: int :raises _block.LZ4BlockError: Decompression failed: corrupt input or insufficient space in destination buffer. @@ -91,25 +94,23 @@ def decompress_lz4(data: bytes, uncompressed_size: int) -> bytes: # LZ4M/LZ4HC return lz4.block.decompress(data, uncompressed_size) -def compress_lz4(data: bytes) -> bytes: # LZ4M/LZ4HC +def compress_lz4(data: ByteString) -> bytes: # LZ4M/LZ4HC """compresses data via lz4.block :param data: uncompressed data - :type data: bytes + :type data: ByteString :return: compressed data :rtype: bytes """ - return lz4.block.compress( - data, mode="high_compression", compression=9, store_size=False - ) + return lz4.block.compress(data, mode="high_compression", compression=9, store_size=False) # Brotli -def decompress_brotli(data: bytes) -> bytes: +def decompress_brotli(data: ByteString) -> bytes: """decompresses brotli-compressed data :param data: compressed data - :type data: bytes + :type data: ByteString :raises brotli.error: BrotliDecompress failed :return: uncompressed data :rtype: bytes @@ -117,11 +118,11 @@ def decompress_brotli(data: bytes) -> bytes: return brotli.decompress(data) -def compress_brotli(data: bytes) -> bytes: +def compress_brotli(data: ByteString) -> bytes: """compresses data via brotli :param data: uncompressed data - :type data: bytes + :type data: ByteString :return: compressed data :rtype: bytes """ @@ -129,11 +130,11 @@ def compress_brotli(data: bytes) -> bytes: # GZIP -def decompress_gzip(data: bytes) -> bytes: +def decompress_gzip(data: ByteString) -> bytes: """decompresses gzip-compressed data :param data: compressed data - :type data: bytes + :type data: ByteString :raises OSError: Not a gzipped file :return: uncompressed data :rtype: bytes @@ -141,41 +142,46 @@ def decompress_gzip(data: bytes) -> bytes: return gzip.decompress(data) -def compress_gzip(data: bytes) -> bytes: +def compress_gzip(data: ByteString) -> bytes: """compresses data via gzip The current static settings may not be the best solution, but they are the most commonly used values and should therefore be enough for the time being. :param data: uncompressed data - :type data: bytes + :type data: ByteString :return: compressed data :rtype: bytes """ return gzip.compress(data) -def chunk_based_compress(data: bytes, block_info_flag: int) -> Tuple[bytes, list]: +def chunk_based_compress(data: ByteString, block_info_flag: int) -> Tuple[ByteString, list]: """compresses AssetBundle data based on the block_info_flag LZ4/LZ4HC will be chunk-based compression :param data: uncompressed data - :type data: bytes + :type data: ByteString :param block_info_flag: block info flag :type block_info_flag: int :return: compressed data and block info :rtype: tuple """ switch = block_info_flag & 0x3F + chunk_size = None + compress_func = None if switch == 0: # NONE return data, [(len(data), len(data), block_info_flag)] - elif switch == 1: # LZMA - chunk_size = 0xFFFFFFFF - compress_func = compress_lzma - elif switch in [2, 3]: # LZ4 - chunk_size = 0x00020000 - compress_func = compress_lz4 - elif switch == 4: # LZHAM - raise NotImplementedError + + if switch in COMPRESSION_MAP: + compress_func = COMPRESSION_MAP[switch] + else: + raise NotImplementedError(f"No compression function in the CompressionHelper.COMPRESSION_MAP for {switch}") + + if switch in COMPRESSION_CHUNK_SIZE_MAP: + chunk_size = COMPRESSION_CHUNK_SIZE_MAP[switch] + else: + raise NotImplementedError(f"No chunk size in the CompressionHelper.COMPRESSION_CHUNK_SIZE_MAP for {switch}") + block_info = [] uncompressed_data_size = len(data) compressed_file_data = bytearray() @@ -223,3 +229,47 @@ def chunk_based_compress(data: bytes, block_info_flag: int) -> Tuple[bytes, list ) ) return bytes(compressed_file_data), block_info + + +def decompress_lzham(data: ByteString, uncompressed_size: int) -> bytes: + raise NotImplementedError("Custom compression or unimplemented LZHAM (removed by Unity) encountered!") + + +DECOMPRESSION_MAP: Dict[Union[int, CompressionFlags], Callable[[ByteString, int], ByteString]] = { + CompressionFlags.NONE: lambda cd, _ucs: cd, + CompressionFlags.LZMA: lambda cd, _ucs: decompress_lzma(cd), + CompressionFlags.LZ4: decompress_lz4, + CompressionFlags.LZ4HC: decompress_lz4, + CompressionFlags.LZHAM: decompress_lzham, +} + +COMPRESSION_MAP: Dict[Union[int, CompressionFlags], Callable[[ByteString], ByteString]] = { + CompressionFlags.NONE: lambda cd: cd, + CompressionFlags.LZMA: compress_lzma, + CompressionFlags.LZ4: compress_lz4, + CompressionFlags.LZ4HC: compress_lz4, +} + +COMPRESSION_CHUNK_SIZE_MAP: Dict[Union[int, CompressionFlags], int] = { + CompressionFlags.NONE: 0xFFFFFFFF, + CompressionFlags.LZMA: 0xFFFFFFFF, + CompressionFlags.LZ4: 0x00020000, + CompressionFlags.LZ4HC: 0x00020000, +} + + +__all__ = ( + "compress_brotli", + "compress_gzip", + "compress_lz4", + "compress_lzma", + "decompress_brotli", + "decompress_gzip", + "decompress_lz4", + "decompress_lzma", + "decompress_lzham", + "chunk_based_compress", + "COMPRESSION_MAP", + "DECOMPRESSION_MAP", + "COMPRESSION_CHUNK_SIZE_MAP", +) diff --git a/UnityPy/helpers/ContainerHelper.py b/UnityPy/helpers/ContainerHelper.py new file mode 100644 index 000000000..f2ad977ca --- /dev/null +++ b/UnityPy/helpers/ContainerHelper.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Dict, Generator, Iterator, List, Optional, Tuple, Union + +from attrs import define + +if TYPE_CHECKING: + from ..classes import AssetBundle, AssetInfo, Object, PPtr + + +@define(slots=True) +class ContainerHelper: + """Helper class to allow multidict containers + without breaking compatibility with old versions""" + + container: List[Tuple[str, AssetInfo]] + container_dict: Dict[str, PPtr[Object]] + path_dict: Dict[int, str] + _preload_table: Optional[List[PPtr[Object]]] = None + + def __init__(self, container: Union[List[Tuple[str, AssetInfo]], AssetBundle]) -> None: + preload_table: Optional[List[PPtr[Object]]] = None + if not isinstance(container, (list)): + preload_table = container.m_PreloadTable + container = container.m_Container + self.container = container + self.container_dict = {key: value.asset for key, value in container} + self.path_dict = {value.asset.path_id: key for key, value in container} + self._preload_table = preload_table + + def parse_preload_table(self) -> None: + if self._preload_table is None: + return + + for path, info in self.container: + start = info.preloadIndex + size = info.preloadSize + if start < 0 or size <= 0 or start + size > len(self._preload_table): + continue + for pptr in self._preload_table[start : start + size]: + if not pptr: + continue + try: + target = pptr.deref() + except (FileNotFoundError, KeyError): + continue + target.assets_file._container.path_dict.setdefault(pptr.path_id, path) + + self._preload_table = None + + def items(self) -> Generator[Tuple[str, PPtr[Object]], None, None]: + return ((key, value.asset) for key, value in self.container) + + def keys(self) -> list[str]: + return list({key for key, value in self.container}) + + def values(self) -> list[PPtr[Object]]: + return list({value.asset for key, value in self.container}) + + def __getitem__(self, key) -> PPtr[Object]: + return self.container_dict[key] + + def __setitem__(self, key, value) -> None: + raise NotImplementedError("Assigning to container is not allowed!") + + def __delitem__(self, key) -> None: + raise NotImplementedError("Deleting from the container is not allowed!") + + def __iter__(self) -> Iterator[str]: + return iter(self.keys()) + + def __len__(self) -> int: + return len(self.container) + + def __getattr__(self, name: str) -> PPtr[Object]: + return self.container_dict[name] + + def __str__(self) -> str: + return f"{{{', '.join(f'{key}: {value}' for key, value in self.items())}}}" + + def __dict__(self) -> Dict[str, PPtr[Object]]: + return self.container_dict + + def __contains__(self, key: str) -> bool: + return key in self.container_dict diff --git a/UnityPy/helpers/ImportHelper.py b/UnityPy/helpers/ImportHelper.py index 7e7e2a4b2..2717c6f68 100644 --- a/UnityPy/helpers/ImportHelper.py +++ b/UnityPy/helpers/ImportHelper.py @@ -1,16 +1,20 @@ from __future__ import annotations + +import io import os -from typing import Union, List -from .CompressionHelper import BROTLI_MAGIC, GZIP_MAGIC +from gzip import GzipFile +from typing import BinaryIO, List, Optional, Tuple, Union + +from .. import files from ..enums import FileType from ..streams import EndianBinaryReader -from .. import files +from .CompressionHelper import BROTLI_MAGIC, GZIP_MAGIC + +FileSourceType = Union[str, bytes, bytearray, io.IOBase, EndianBinaryReader, BinaryIO] def file_name_without_extension(file_name: str) -> str: - return os.path.join( - os.path.dirname(file_name), os.path.splitext(os.path.basename(file_name))[0] - ) + return os.path.join(os.path.dirname(file_name), os.path.splitext(os.path.basename(file_name))[0]) def list_all_files(directory: str) -> List[str]: @@ -18,7 +22,7 @@ def list_all_files(directory: str) -> List[str]: val for sublist in [ [os.path.join(dir_path, filename) for filename in filenames] - for (dir_path, dirn_ames, filenames) in os.walk(directory) + for (dir_path, dirnames, filenames) in os.walk(directory) if ".git" not in dir_path ] for val in sublist @@ -29,28 +33,23 @@ def find_all_files(directory: str, search_str: str) -> List[str]: return [ val for sublist in [ - [ - os.path.join(dir_path, filename) - for filename in filenames - if search_str in filename - ] - for (dir_path, dirn_ames, filenames) in os.walk(directory) + [os.path.join(dir_path, filename) for filename in filenames if search_str in filename] + for (dir_path, dirnames, filenames) in os.walk(directory) if ".git" not in dir_path ] for val in sublist ] -def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: +def check_file_type( + input_: FileSourceType, +) -> Tuple[FileType, EndianBinaryReader]: if isinstance(input_, str) and os.path.isfile(input_): reader = EndianBinaryReader(open(input_, "rb")) elif isinstance(input_, EndianBinaryReader): reader = input_ else: - try: - reader = EndianBinaryReader(input_) - except: - return None, None + reader = EndianBinaryReader(input_) if reader.Length < 20: return FileType.ResourceFile, reader @@ -61,11 +60,11 @@ def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: if signature in [ "UnityWeb", "UnityRaw", - "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA", + "\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfa", "UnityFS", ]: return FileType.BundleFile, reader - elif signature == "UnityWebData1.0": + elif signature.startswith(("UnityWebData", "TuanjieWebData")): return FileType.WebFile, reader elif signature == "PK\x03\x04": return FileType.ZIP, reader @@ -76,7 +75,12 @@ def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: magic = bytes(reader.read_bytes(2)) reader.Position = 0 if GZIP_MAGIC == magic: - return FileType.WebFile, reader + g_stream = GzipFile(fileobj=reader) + g_reader = EndianBinaryReader(g_stream, endian="<") + signature = g_reader.read_string_to_null(20) + g_stream.close() + if signature.startswith(("UnityWebData", "TuanjieWebData")): + return FileType.WebFile, reader reader.Position = 0x20 magic = bytes(reader.read_bytes(6)) reader.Position = 0 @@ -94,12 +98,13 @@ def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: data_offset = reader.read_u_int() if version >= 22: - endian = ">" if reader.read_boolean() else "<" - reserved = reader.read_bytes(3) + raw_endian = reader.read_u_byte() + _endian = ">" if raw_endian else "<" + _reserved = reader.read_bytes(3) metadata_size = reader.read_u_int() file_size = reader.read_long() data_offset = reader.read_long() - unknown = reader.read_long() # unknown + _unknown = reader.read_long() # unknown # reset reader.endian = old_endian @@ -109,10 +114,7 @@ def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: ( version < 0, version > 100, - *[ - x < 0 or x > reader.Length - for x in [file_size, metadata_size, version, data_offset] - ], + *[x < 0 or x > reader.Length for x in [file_size, metadata_size, version, data_offset]], file_size < metadata_size, file_size < data_offset, ) @@ -124,23 +126,33 @@ def check_file_type(input_) -> Union[FileType, EndianBinaryReader]: def parse_file( reader: EndianBinaryReader, - parent, + parent: files.File, name: str, - typ: FileType = None, - is_dependency=False, + typ: Optional[FileType] = None, + is_dependency: bool = False, ) -> Union[files.File, EndianBinaryReader]: if typ is None: typ, _ = check_file_type(reader) - if typ == FileType.AssetsFile and not name.endswith( - (".resS", ".resource", ".config", ".xml", ".dat") - ): - f = files.SerializedFile(reader, parent, name=name, is_dependency=is_dependency) - elif typ == FileType.BundleFile: - f = files.BundleFile(reader, parent, name=name, is_dependency=is_dependency) - elif typ == FileType.WebFile: - f = files.WebFile(reader, parent, name=name, is_dependency=is_dependency) - else: - f = reader + f = reader + try: + if typ == FileType.AssetsFile and not name.endswith( + ( + ".resS", + ".resource", + ".config", + ".xml", + ".dat", + ) + ): + f = files.SerializedFile(reader, parent, name=name, is_dependency=is_dependency) + elif typ == FileType.BundleFile: + f = files.BundleFile(reader, parent, name=name, is_dependency=is_dependency) + elif typ == FileType.WebFile: + f = files.WebFile(reader, parent, name=name, is_dependency=is_dependency) + except Exception as e: + reader.seek(0) + print(f"Error parsing file {name!r} as {typ}: {e}") + raise e return f diff --git a/UnityPy/helpers/MeshHelper.py b/UnityPy/helpers/MeshHelper.py index e32f25840..371e8baf9 100644 --- a/UnityPy/helpers/MeshHelper.py +++ b/UnityPy/helpers/MeshHelper.py @@ -1,28 +1,28 @@ from __future__ import annotations + import math import struct -from typing import Optional, List, Tuple, Union, TypeVar +from typing import TYPE_CHECKING, List, Optional, Tuple, Union, cast -from ..enums.MeshTopology import MeshTopology from ..classes.generated import ( ChannelInfo, - StreamInfo, Mesh, SpriteRenderData, + StreamInfo, Vector2f, Vector3f, Vector4f, ) -from .PackedBitVector import unpack_floats, unpack_ints - +from ..enums.MeshTopology import MeshTopology from ..enums.VertexFormat import ( - VertexChannelFormat, - VertexFormat2017, - VertexFormat, VERTEX_CHANNEL_FORMAT_STRUCT_TYPE_MAP, VERTEX_FORMAT_2017_STRUCT_TYPE_MAP, VERTEX_FORMAT_STRUCT_TYPE_MAP, + VertexChannelFormat, + VertexFormat, + VertexFormat2017, ) +from .PackedBitVector import unpack_floats, unpack_ints from .ResourceReader import get_resource_data try: @@ -34,32 +34,30 @@ Tuple3f = Tuple[float, float, float] Tuple4f = Tuple[float, float, float, float] -T = TypeVar("T") - -def flat_list_to_tuples(data: List[T], item_size: int) -> List[tuple[T]]: - return [tuple(data[i : i + item_size]) for i in range(0, len(data), item_size)] - - -def vector_list_to_tuples(data: List[Vector2f, Vector3f, Vector4f]) -> List[tuple]: +def vector_list_to_tuples( + data: Union[List[Vector2f], List[Vector3f], List[Vector4f]], +) -> List[tuple]: if isinstance(data[0], Vector2f): return [(v.x, v.y) for v in data] elif isinstance(data[0], Vector3f): + if TYPE_CHECKING: + data = cast(List[Vector3f], data) return [(v.x, v.y, v.z) for v in data] elif isinstance(data[0], Vector4f): + if TYPE_CHECKING: + data = cast(List[Vector4f], data) return [(v.x, v.y, v.z, v.w) for v in data] else: raise ValueError("Unknown vector type") -def zeros(shape: Tuple[int, ...]) -> list: - if len(shape) == 1: - return [0] * shape[0] - elif len(shape) == 2: - m, n = shape - return [[0] * n for _ in range(m)] - else: - raise ValueError("Invalid shape") +def lists_to_tuples(data: List[list]) -> List[tuple]: + return [tuple(v) for v in data] + + +def zeros(m: int, n: int) -> List[list]: + return [[0] * n for _ in range(m)] def normalize(*vector: float) -> Tuple[float, ...]: @@ -76,7 +74,9 @@ class MeshHandler: version: Tuple[int, int, int, int] m_VertexCount: int = 0 m_Vertices: Optional[List[Tuple3f]] = None - m_Normals: Optional[List[Tuple3f]] = None + # normals can be stored as Tuple4f, + # in such cases the 4th dimension is always 0 and can be discarded + m_Normals: Optional[Union[List[Tuple3f], List[Tuple4f]]] = None m_Colors: Optional[List[Tuple4f]] = None m_UV0: Optional[List[Tuple2f]] = None m_UV1: Optional[List[Tuple2f]] = None @@ -86,9 +86,9 @@ class MeshHandler: m_UV5: Optional[List[Tuple2f]] = None m_UV6: Optional[List[Tuple2f]] = None m_UV7: Optional[List[Tuple2f]] = None - m_Tangents: Optional[List[float]] = None - m_BoneIndices: Optional[List[int]] = None - m_BoneWeights: Optional[List[float]] = None + m_Tangents: Optional[List[Tuple4f]] = None + m_BoneIndices: Optional[List[Tuple[int, int, int, int]]] = None + m_BoneWeights: Optional[List[Tuple4f]] = None m_IndexBuffer: Optional[List[int]] = None m_Use16BitIndices: bool = True @@ -97,12 +97,12 @@ def __init__( src: Union[Mesh, SpriteRenderData], version: Optional[Tuple[int, int, int, int]] = None, endianess: str = "<", - ) -> None: + ): self.src = src self.endianess = endianess if version is not None: self.version = version - elif getattr(src, "object_reader", None): + elif not isinstance(src, SpriteRenderData) and src.object_reader is not None: self.version = src.object_reader.version else: raise ValueError("No version provided and no object reader found") @@ -131,9 +131,7 @@ def process(self): assert all(stream is not None for stream in m_Streams) m_Channels = self.get_channels(m_Streams) elif self.version[0] == 4: - assert ( - vertex_data.m_Streams is not None and vertex_data.m_Channels is not None - ) + assert vertex_data.m_Streams is not None and vertex_data.m_Channels is not None m_Streams = vertex_data.m_Streams m_Channels = vertex_data.m_Channels else: @@ -141,22 +139,32 @@ def process(self): m_Channels = vertex_data.m_Channels m_Streams = self.get_streams(m_Channels, vertex_data.m_VertexCount) - stream_data = getattr(mesh, "m_StreamData", None) - if stream_data and stream_data.path: - vertex_data = self.src.m_VertexData - if vertex_data and vertex_data.m_VertexCount > 0: - data = get_resource_data( - stream_data.path, - self.src.object_reader.assets_file, - stream_data.offset, - stream_data.size, - ) - vertex_data.m_DataSize = data + if ( + isinstance(mesh, Mesh) and mesh.m_StreamData and mesh.m_StreamData.path + # and mesh.m_VertexData + # and mesh.m_VertexData.m_VertexCount + ): + stream_data = mesh.m_StreamData + assert mesh.object_reader, "No object reader assigned to the input Mesh!" + data = get_resource_data( + stream_data.path, + mesh.object_reader.assets_file, + stream_data.offset, + stream_data.size, + ) + vertex_data.m_DataSize = data # try to copy data directly from mesh if isinstance(mesh, Mesh): - if self.src.m_Use16BitIndices is False: - self.m_Use16BitIndices = False + if mesh.m_Use16BitIndices is not None: + self.m_Use16BitIndices = bool(mesh.m_Use16BitIndices) + elif ( + (self.version >= (2017, 4)) + or + # version == (2017, 3, 1) & patched - px string + (self.version[:2] == (2017, 3) and mesh.m_MeshCompression == 0) + ): + self.m_Use16BitIndices = mesh.m_IndexFormat == 0 self.copy_from_mesh() elif isinstance(mesh, SpriteRenderData): self.copy_from_spriterenderdata() @@ -172,8 +180,9 @@ def process(self): char = "I" index_size = 4 - self.m_IndexBuffer = struct.unpack( - f"<{len(raw_indices) // index_size}{char}", raw_indices + self.m_IndexBuffer = cast( + List[int], + struct.unpack(f"<{len(raw_indices) // index_size}{char}", raw_indices), ) if self.version >= (3, 5): @@ -188,6 +197,8 @@ def process(self): def copy_from_mesh(self): """Copy data from mesh to handler if it's not already set.""" mesh = self.src + if TYPE_CHECKING: + assert isinstance(mesh, Mesh) if self.m_IndexBuffer is None and mesh.m_IndexBuffer: self.m_IndexBuffer = mesh.m_IndexBuffer @@ -208,30 +219,23 @@ def copy_from_mesh(self): self.m_UV1 = vector_list_to_tuples(mesh.m_UV1) if self.m_Colors is None and mesh.m_Colors: - self.m_Colors = vector_list_to_tuples(mesh.m_Colors) + self.m_Colors = [ + (color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0) for color in mesh.m_Colors + ] if self.m_BoneWeights is None and mesh.m_Skin: # BoneInfluence == BoneWeight in terms of usage in UnityPy due to int simplification - self.m_BoneWeights = zeros((len(mesh.m_Skin), 4)) - self.m_BoneIndices = zeros((len(mesh.m_Skin), 4)) - for skin, indices, weights in zip( - mesh.m_Skin, self.m_BoneIndices, self.m_BoneWeights - ): - indices[:] = [ - skin.boneIndex_0_, - skin.boneIndex_1_, - skin.boneIndex_2_, - skin.boneIndex_3_, - ] - weights[:] = [ - skin.weight_0_, - skin.weight_1_, - skin.weight_2_, - skin.weight_3_, - ] + self.m_BoneIndices = [ + (skin.boneIndex_0_, skin.boneIndex_1_, skin.boneIndex_2_, skin.boneIndex_3_) for skin in mesh.m_Skin + ] + self.m_BoneWeights = [ + (skin.weight_0_, skin.weight_1_, skin.weight_2_, skin.weight_3_) for skin in mesh.m_Skin + ] def copy_from_spriterenderdata(self): rd = self.src + if TYPE_CHECKING: + assert isinstance(rd, SpriteRenderData) if self.m_IndexBuffer is None: if rd.m_IndexBuffer: @@ -240,22 +244,17 @@ def copy_from_spriterenderdata(self): self.m_IndexBuffer = rd.indices if self.m_Vertices is None and rd.vertices: - vertices = [rd.vertices] + vertices = rd.vertices self.m_Vertices = [(v.pos.x, v.pos.y, v.pos.z) for v in vertices] if vertices[0].uv is not None: - self.m_UV0 = [(v.uv.x, v.uv.y) for v in vertices] + self.m_UV0 = [(v.uv.x, v.uv.y) for v in vertices] # type: ignore # if self.m_BindPose is None and rd.m_BindPose: # self.m_BindPose = rd.m_BindPose - def get_streams( - self, m_Channels: list[ChannelInfo], m_VertexCount: int - ) -> list[StreamInfo]: - streamCount = 1 - if m_Channels: - streamCount += max(x.stream for x in m_Channels) - + def get_streams(self, m_Channels: list[ChannelInfo], m_VertexCount: int) -> list[StreamInfo]: + streamCount = 1 + max(x.stream for x in m_Channels) m_Streams: list[StreamInfo] = [] offset = 0 for s in range(streamCount): @@ -266,7 +265,7 @@ def get_streams( if m_Channel.dimension > 0: chnMask |= 1 << chn component_size = self.get_channel_component_size(m_Channel) - stride += m_Channel.dimension * component_size + stride += (m_Channel.dimension & 0xF) * component_size m_Streams.append( StreamInfo( @@ -292,10 +291,10 @@ def get_channels(self, m_Streams: list[StreamInfo]) -> list[ChannelInfo]: for _ in range(6) ] for s, m_Stream in enumerate(m_Streams): - channelMask = bytearray(m_Stream.channelMask) # BitArray + channelMask = m_Stream.channelMask # uint offset = 0 for i in range(6): - if channelMask[i]: + if channelMask & (1 << i): m_Channel = m_Channels[i] m_Channel.stream = s m_Channel.offset = offset @@ -321,13 +320,17 @@ def get_channels(self, m_Streams: list[StreamInfo]) -> list[ChannelInfo]: return m_Channels - def read_vertex_data( - self, m_Channels: list[ChannelInfo], m_Streams: list[StreamInfo] - ) -> None: + def read_vertex_data(self, m_Channels: list[ChannelInfo], m_Streams: list[StreamInfo]) -> None: m_VertexData = self.src.m_VertexData if m_VertexData is None: return + # could be empty for fully compressed meshes + # in that case data will be read from CompressedMesh via decompress_compressed_mesh + # also avoids a crash in UnityPyBoost.unpack_vertexdata with empty data + if m_VertexData.m_VertexCount == 0 or not m_VertexData.m_DataSize: + return + self.m_VertexCount = m_VertexCount = m_VertexData.m_VertexCount # m_VertexDataRaw = m_VertexData.m_DataSize @@ -358,6 +361,7 @@ def read_vertex_data( # channel_byte_size = m_Channel.dimension * component_byte_size swap = self.endianess == "<" and component_byte_size > 1 + channel_dimension = m_Channel.dimension & 0xF if UnityPyBoost: componentBytes = UnityPyBoost.unpack_vertexdata( @@ -367,41 +371,32 @@ def read_vertex_data( m_Stream.offset, m_Stream.stride, m_Channel.offset, - m_Channel.dimension, + channel_dimension, swap, ) else: - componentBytes = bytearray( - m_VertexCount * m_Channel.dimension * component_byte_size - ) + channelSize = channel_dimension * component_byte_size - vertexBaseOffset = m_Stream.offset + m_Channel.offset - for v in range(m_VertexCount): - vertexOffset = vertexBaseOffset + m_Stream.stride * v - for d in range(m_Channel.dimension): - componentOffset = vertexOffset + component_byte_size * d - vertexDataSrc = componentOffset - componentDataSrc = component_byte_size * ( - v * m_Channel.dimension + d - ) - buff = m_VertexData.m_DataSize[ - vertexDataSrc : vertexDataSrc + component_byte_size - ] - if swap: # swap bytes - buff = buff[::-1] - componentBytes[ - componentDataSrc : componentDataSrc - + component_byte_size - ] = buff - - count = len(componentBytes) // component_byte_size - component_data = struct.unpack( - f">{count}{component_dtype}", componentBytes - ) - component_data = flat_list_to_tuples( - component_data, m_Channel.dimension - ) + componentBytes = bytearray(m_VertexCount * channel_dimension * component_byte_size) + vertexData = m_VertexData.m_DataSize + + componentOffset = 0 + vertexOffset = m_Stream.offset + m_Channel.offset + for _ in range(m_VertexCount): + componentBytes[componentOffset : componentOffset + channelSize] = vertexData[ + vertexOffset : vertexOffset + channelSize + ] + componentOffset += channelSize + vertexOffset += m_Stream.stride + + if swap: + for offset in range(0, len(componentBytes), component_byte_size): + item = componentBytes[offset : offset + component_byte_size] + item.reverse() + componentBytes[offset : offset + component_byte_size] = item + + component_data = list(struct.iter_unpack(f">{channel_dimension}{component_dtype}", componentBytes)) self.assign_channel_vertex_data(chn, component_data) def assign_channel_vertex_data(self, channel: int, component_data: list): @@ -480,13 +475,12 @@ def get_channel_component_size(self, m_Channel: ChannelInfo): def decompress_compressed_mesh(self): # TODO: m_Triangles???? - # Vertex version = self.version + assert isinstance(self.src, Mesh) m_CompressedMesh = self.src.m_CompressedMesh - self.m_VertexCount = m_VertexCount = int( - m_CompressedMesh.m_Vertices.m_NumItems / 3 - ) + # Vertex + self.m_VertexCount = m_VertexCount = m_CompressedMesh.m_Vertices.m_NumItems // 3 if m_CompressedMesh.m_Vertices.m_NumItems > 0: self.m_Vertices = unpack_floats(m_CompressedMesh.m_Vertices, shape=(3,)) @@ -516,9 +510,7 @@ def decompress_compressed_mesh(self): setattr(self, f"m_UV{uv_channel}", m_UV) uvSrcOffset = uvDim * m_VertexCount else: - self.m_UV0 = unpack_floats( - m_CompressedMesh.m_UV, 0, m_VertexCount * 2, shape=(2,) - ) + self.m_UV0 = unpack_floats(m_CompressedMesh.m_UV, 0, m_VertexCount * 2, shape=(2,)) if m_CompressedMesh.m_UV.m_NumItems >= m_VertexCount * 4: self.m_UV1 = unpack_floats( m_CompressedMesh.m_UV, @@ -544,8 +536,8 @@ def decompress_compressed_mesh(self): normalData = unpack_floats(m_CompressedMesh.m_Normals, shape=(2,)) signs = unpack_ints(m_CompressedMesh.m_NormalSigns) - self.m_Normals = zeros((m_CompressedMesh.m_Normals.m_NumItems // 2, 3)) - for srcNrm, sign, dstNrm in zip(normalData, signs, self.m_Normals): + normals = zeros(self.m_VertexCount, 3) + for srcNrm, sign, dstNrm in zip(normalData, signs, normals): x, y = srcNrm zsqr = 1 - x * x - y * y if zsqr >= 0: @@ -556,15 +548,15 @@ def decompress_compressed_mesh(self): dstNrm[:] = normalize(x, y, z) if sign == 0: dstNrm[2] *= -1 + self.m_Normals = lists_to_tuples(normals) # Tangent if m_CompressedMesh.m_Tangents.m_NumItems > 0: tangentData = unpack_floats(m_CompressedMesh.m_Tangents, shape=(2,)) - signs = unpack_ints(m_CompressedMesh.m_TangentSigns) - self.m_Tangents = zeros((m_CompressedMesh.m_Tangents.m_NumItems // 2, 4)) - for srcTan, (sign_z, sign_w), dstTan in zip( - tangentData, signs, self.m_Tangents - ): + signs = unpack_ints(m_CompressedMesh.m_TangentSigns, shape=(2,)) + + tangents = zeros(self.m_VertexCount, 4) + for srcTan, (sign_z, sign_w), dstTan in zip(tangentData, signs, tangents): x, y = srcTan zsqr = 1 - x * x - y * y z = 0 @@ -577,6 +569,7 @@ def decompress_compressed_mesh(self): z = -z w = 1.0 if sign_w > 0 else -1.0 dstTan[:] = x, y, z, w + self.m_Tangents = lists_to_tuples(tangents) # FloatColor if version[0] >= 5: # 5.0 and up @@ -586,46 +579,45 @@ def decompress_compressed_mesh(self): # Skin if m_CompressedMesh.m_Weights.m_NumItems > 0: weightsData = unpack_ints(m_CompressedMesh.m_Weights) - weightsData = [weight / 31 for weight in weightsData] boneIndicesData = unpack_ints(m_CompressedMesh.m_BoneIndices) vertexIndex = 0 - boneIndecesIndex = 0 j = 0 sum = 0 - self.m_BoneWeights = zeros((m_CompressedMesh.m_Weights.m_NumItems // 4, 4)) - self.m_BoneIndices = zeros((m_CompressedMesh.m_Weights.m_NumItems // 4, 4)) + boneWeights = zeros(self.m_VertexCount, 4) + boneIndices = zeros(self.m_VertexCount, 4) - for weight in weightsData: + boneIndicesIterator = iter(boneIndicesData) + for weight, boneIndex in zip(weightsData, boneIndicesIterator): # read bone index and weight - self.m_BoneWeights[vertexIndex][j] = weight - self.m_BoneIndices[vertexIndex][j] = boneIndicesData[boneIndecesIndex] + boneWeights[vertexIndex][j] = weight / 31 + boneIndices[vertexIndex][j] = boneIndex - boneIndecesIndex += 1 j += 1 sum += weight # the weights add up to one, continue with the next vertex. - if sum >= 1.0: + if sum >= 31: j = 4 - + # set weights and boneIndices to 0, + # already done on init vertexIndex += 1 j = 0 sum = 0 # we read three weights, but they don't add up to one. calculate the fourth one, and read # missing bone index. continue with next vertex. elif j == 3: # - self.m_BoneWeights[vertexIndex][j] = 1 - sum - self.m_BoneIndices[vertexIndex][j] = boneIndicesData[ - boneIndecesIndex - ] + boneWeights[vertexIndex][j] = 1 - sum + boneIndices[vertexIndex][j] = next(boneIndicesIterator) - boneIndecesIndex += 1 vertexIndex += 1 j = 0 sum = 0 + self.m_BoneWeights = lists_to_tuples(boneWeights) + self.m_BoneIndices = lists_to_tuples(boneIndices) + # IndexBuffer if m_CompressedMesh.m_Triangles.m_NumItems > 0: # self.m_IndexBuffer = unpack_ints(m_CompressedMesh.m_Triangles) @@ -644,6 +636,7 @@ def decompress_compressed_mesh(self): def get_triangles(self) -> List[List[Tuple[int, ...]]]: assert self.m_IndexBuffer is not None + assert self.src.m_SubMeshes is not None submeshes: List[List[Tuple[int, ...]]] = [] @@ -655,49 +648,43 @@ def get_triangles(self) -> List[List[Tuple[int, ...]]]: indexCount = m_SubMesh.indexCount topology = m_SubMesh.topology - triangles: List[int] + triangles: List[Tuple[int, ...]] if topology == MeshTopology.Triangles: - triangles = self.m_IndexBuffer[firstIndex : firstIndex + indexCount] - elif ( - self.version[0] < 4 or topology == MeshTopology.TriangleStrip - ): # TriangleStrip - # todo: use as_strided, then fix winding, finally remove degenerates - triIndex = 0 - triangles = list((indexCount - 2) * 3) + triangles = [ + tuple(self.m_IndexBuffer[i : i + 3]) for i in range(firstIndex, firstIndex + indexCount, 3) + ] - for i in range(indexCount - 2): - a, b, c = self.m_IndexBuffer[firstIndex + i : firstIndex + i + 3] + elif self.version[0] < 4 or topology == MeshTopology.TriangleStrip: + triangles = [()] * (indexCount - 2) + triIndex = 0 + for i in range(firstIndex, firstIndex + indexCount - 2): + a, b, c = self.m_IndexBuffer[i : i + 3] # skip degenerates if a == b or a == c or b == c: continue - # do the winding flip-flop of strips - if i & 1: - triangles[triIndex] = b, a, c + if (i - firstIndex) & 1: + triangles[triIndex] = (b, a, c) else: - triangles[triIndex] = a, b, c + triangles[triIndex] = (a, b, c) triIndex += 1 - triangles = triangles[:triIndex] + m_SubMesh.indexCount = len(triangles) * 3 elif topology == MeshTopology.Quads: # one quad is two triangles, so // 4 * 2 = // 2 - # TODO: use as_strided - triangles = list(indexCount // 2, 3) + triangles = [()] * (indexCount // 2) triIndex = 0 - for a, b, c, d in self.m_IndexBuffer[ - firstIndex : firstIndex + indexCount : 4 - ]: - triangles[triIndex] = a, b, c - triangles[triIndex + 1] = a, c, d + for i in range(firstIndex, firstIndex + indexCount, 4): + a, b, c, d = self.m_IndexBuffer[i : i + 4] + triangles[triIndex] = (a, b, c) + triangles[triIndex + 1] = (a, c, d) triIndex += 2 + else: - raise ValueError( - "Failed getting triangles. Submesh topology is lines or points." - ) + raise ValueError("Failed getting triangles. Submesh topology is lines or points.") - triangles = [triangles[i : i + 3] for i in range(0, len(triangles), 3)] submeshes.append(triangles) return submeshes diff --git a/UnityPy/helpers/PackedBitVector.py b/UnityPy/helpers/PackedBitVector.py index 8ad9ac16d..57d53fe10 100644 --- a/UnityPy/helpers/PackedBitVector.py +++ b/UnityPy/helpers/PackedBitVector.py @@ -1,11 +1,10 @@ -from typing import Optional, List, TYPE_CHECKING, Tuple +from typing import TYPE_CHECKING, Any, List, Optional, Tuple -# from ..objects.math import Quaternionf if TYPE_CHECKING: from ..classes.generated import PackedBitVector -def reshape(data: list, shape: Optional[Tuple[int, ...]] = None) -> list: +def reshape(data: list, shape: Optional[Tuple[int, ...]] = None) -> List[Any]: if shape is None: return data if len(shape) == 1: @@ -13,10 +12,7 @@ def reshape(data: list, shape: Optional[Tuple[int, ...]] = None) -> list: return [data[i : i + m] for i in range(0, len(data), m)] elif len(shape) == 2: m, n = shape - return [ - [[data[i + j : i + j + n] for j in range(0, m * n, n)]] - for i in range(0, len(data), m * n) - ] + return [[data[i + j : i + j + n] for j in range(0, m * n, n)] for i in range(0, len(data), m * n)] else: raise ValueError("Invalid shape") @@ -26,7 +22,7 @@ def unpack_ints( start: int = 0, count: Optional[int] = None, shape: Optional[Tuple[int, ...]] = None, -) -> List[int]: +) -> List[Any]: assert packed.m_BitSize is not None m_BitSize = packed.m_BitSize @@ -51,9 +47,9 @@ def unpack_ints( # raise ValueError("Invalid bit size") # data = np.zeros(packed.m_NumItems, dtype=dtype) - data = [0] * packed.m_NumItems + data = [0] * count - for i in range(packed.m_NumItems): + for i in range(count): bits = 0 value = 0 while bits < m_BitSize: @@ -74,16 +70,18 @@ def unpack_floats( start: int = 0, count: Optional[int] = None, shape: Optional[Tuple[int, ...]] = None, -) -> List[float]: - assert ( - packed.m_BitSize is not None - and packed.m_Range is not None - and packed.m_Start is not None - ) - - # read as int and cast up to double to prevent loss of precision - quantized_f64 = unpack_ints(packed, start, count) - quantized = [x * packed.m_Range + packed.m_Start for x in quantized_f64] +) -> List[Any]: + assert packed.m_BitSize is not None and packed.m_Range is not None and packed.m_Start is not None + + # avoid zero division of scale + if packed.m_BitSize == 0: + quantized = [packed.m_Start] * (packed.m_NumItems if count is None else count) + else: + # read as int and cast up to double to prevent loss of precision + quantized_f64 = unpack_ints(packed, start, count) + scale = packed.m_Range / ((1 << packed.m_BitSize) - 1) + quantized = [x * scale + packed.m_Start for x in quantized_f64] + return reshape(quantized, shape) diff --git a/UnityPy/helpers/ResourceReader.py b/UnityPy/helpers/ResourceReader.py index e058b7ef3..62e9800a8 100644 --- a/UnityPy/helpers/ResourceReader.py +++ b/UnityPy/helpers/ResourceReader.py @@ -1,51 +1,38 @@ import ntpath +from typing import TYPE_CHECKING + from ..streams import EndianBinaryReader -from ..files import File +if TYPE_CHECKING: + from ..files.SerializedFile import SerializedFile -def get_resource_data(*args): - """ - Input: - Option 1: - 0 - path - file path - 1 - assets_file - SerializedFile - 2 - offset - - 3 - size - - Option 2: - 0 - reader - EndianBinaryReader - 1 - offset - - 2 - size - - -> -2 = offset, -1 = size - """ - if len(args) == 4: - res_path, assets_file, offset, size = args - basename = ntpath.basename(res_path) - name, ext = ntpath.splitext(basename) - possible_names = [ - basename, - f"{name}.resource", - f"{name}.assets.resS", - f"{name}.resS", - ] - environment = assets_file.environment - reader = None +def get_resource_data(res_path: str, assets_file: "SerializedFile", offset: int, size: int): + basename = ntpath.basename(res_path) + name, ext = ntpath.splitext(basename) + possible_names = [ + basename, + f"{name}.resource", + f"{name}.assets.resS", + f"{name}.resS", + ] + environment = assets_file.environment + reader = None + for possible_name in possible_names: + reader = environment.get_cab(possible_name) + if reader: + break + if not reader: + assets_file.load_dependencies(possible_names) for possible_name in possible_names: reader = environment.get_cab(possible_name) if reader: break if not reader: - assets_file.load_dependencies(possible_names) - for possible_name in possible_names: - reader = environment.get_cab(possible_name) - if reader: - break - if not reader: - raise FileNotFoundError(f"Resource file {basename} not found") - elif len(args) == 3: - reader, offset, size = args - else: - raise TypeError(f"3 or 4 arguments required, but only {len(args)} given") + raise FileNotFoundError(f"Resource file {basename} not found") + return _get_resource_data(reader, offset, size) + +def _get_resource_data(reader: EndianBinaryReader, offset: int, size: int): reader.Position = offset return reader.read_bytes(size) diff --git a/UnityPy/helpers/TextureSwizzler.py b/UnityPy/helpers/TextureSwizzler.py index 33f64c94a..fb3edd2b4 100644 --- a/UnityPy/helpers/TextureSwizzler.py +++ b/UnityPy/helpers/TextureSwizzler.py @@ -1,16 +1,13 @@ -# based on https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs -from typing import Dict, Tuple +# based on https://github.com/nesrak1/AssetsTools.NET/blob/dev/AssetsTools.NET.Texture/Swizzle/SwitchSwizzle.cs +from typing import Dict, List, Optional, Tuple, Union -from ..enums import TextureFormat +from ..enums import BuildTarget, TextureFormat GOB_X_TEXEL_COUNT = 4 GOB_Y_TEXEL_COUNT = 8 TEXEL_BYTE_SIZE = 16 TEXELS_IN_GOB = GOB_X_TEXEL_COUNT * GOB_Y_TEXEL_COUNT -GOB_MAP = [ - (((l >> 3) & 0b10) | ((l >> 1) & 0b1), ((l >> 1) & 0b110) | (l & 0b1)) - for l in range(TEXELS_IN_GOB) -] +GOB_MAP = [(((v >> 3) & 0b10) | ((v >> 1) & 0b1), ((v >> 1) & 0b110) | (v & 0b1)) for v in range(TEXELS_IN_GOB)] def ceil_divide(a: int, b: int) -> int: @@ -18,7 +15,7 @@ def ceil_divide(a: int, b: int) -> int: def deswizzle( - data: bytes, + data: Union[bytes, bytearray, memoryview], width: int, height: int, block_width: int, @@ -38,53 +35,42 @@ def deswizzle( for k in range(texels_per_block): base_gob_dst_y = (i * texels_per_block + k) * GOB_Y_TEXEL_COUNT for gob_x, gob_y in GOB_MAP: - dst_offset = ( - (base_gob_dst_y + gob_y) * block_count_x - + (base_gob_dst_x + gob_x) - ) * TEXEL_BYTE_SIZE - new_data[dst_offset : dst_offset + TEXEL_BYTE_SIZE] = data_view[ - :TEXEL_BYTE_SIZE - ] + dst_offset = ((base_gob_dst_y + gob_y) * block_count_x + (base_gob_dst_x + gob_x)) * TEXEL_BYTE_SIZE + new_data[dst_offset : dst_offset + TEXEL_BYTE_SIZE] = data_view[:TEXEL_BYTE_SIZE] data_view = data_view[TEXEL_BYTE_SIZE:] return new_data -# def switch_swizzle( -# src_image: Image.Image, block_size: Tuple[int, int], texels_per_block: int -# ) -> Image.Image: -# dstImage = Image.new(src_image.mode, src_image.size) - -# blockCountX, blockCountY = map(ceil_divide, zip(src_image.size, block_size)) - -# gob_count_x = blockCountX / GOB_X_BLOCK_COUNT -# gob_count_y = blockCountY / GOB_Y_BLOCK_COUNT - -# dstX = 0 -# dstY = 0 - -# for i in range(gob_count_y): -# for j in range(gob_count_x): -# for k in range(texels_per_block): -# for l in range(BLOCKS_IN_GOB): -# # todo: use table for speedy boi -# gobX = ((l >> 3) & 0b10) | ((l >> 1) & 0b1) -# gobY = ((l >> 1) & 0b110) | (l & 0b1) -# gobSrcX = j * GOB_X_BLOCK_COUNT + gobX -# gobSrcY = (i * texels_per_block + k) * GOB_Y_BLOCK_COUNT + gobY -# CopyBlock( -# src_image, dstImage, gobSrcX, gobSrcY, dstX, dstY, *block_size -# ) +def swizzle( + data: Union[bytes, bytearray, memoryview], + width: int, + height: int, + block_width: int, + block_height: int, + texels_per_block: int, +) -> bytearray: + block_count_x = ceil_divide(width, block_width) + block_count_y = ceil_divide(height, block_height) + gob_count_x = block_count_x // GOB_X_TEXEL_COUNT + gob_count_y = block_count_y // GOB_Y_TEXEL_COUNT + new_data = bytearray(len(data)) + data_view = memoryview(new_data) -# dstX += 1 -# if dstX >= blockCountX: -# dstX = 0 -# dstY += 1 + for i in range(gob_count_y // texels_per_block): + for j in range(gob_count_x): + base_gob_dst_x = j * 4 + for k in range(texels_per_block): + base_gob_dst_y = (i * texels_per_block + k) * GOB_Y_TEXEL_COUNT + for gob_x, gob_y in GOB_MAP: + src_offset = ((base_gob_dst_y + gob_y) * block_count_x + (base_gob_dst_x + gob_x)) * TEXEL_BYTE_SIZE + data_view[:TEXEL_BYTE_SIZE] = data[src_offset : src_offset + TEXEL_BYTE_SIZE] + data_view = data_view[TEXEL_BYTE_SIZE:] -# return dstImage + return new_data # this should be the amount of pixels that can fit 16 bytes -TEXTUREFORMAT_BLOCK_SIZE_MAP: Dict[TextureFormat, Tuple[int, int]] = { +TEXTURE_FORMAT_BLOCK_SIZE_MAP: Dict[TextureFormat, Tuple[int, int]] = { TextureFormat.Alpha8: (16, 1), # 1 byte per pixel TextureFormat.ARGB4444: (8, 1), # 2 bytes per pixel TextureFormat.RGBA32: (4, 1), # 4 bytes per pixel @@ -117,14 +103,8 @@ def deswizzle( } -def get_padded_texture_size( - width: int, height: int, block_width: int, block_height: int, texels_per_block: int -): - width = ( - ceil_divide(width, block_width * GOB_X_TEXEL_COUNT) - * block_width - * GOB_X_TEXEL_COUNT - ) +def get_padded_texture_size(width: int, height: int, block_width: int, block_height: int, texels_per_block: int): + width = ceil_divide(width, block_width * GOB_X_TEXEL_COUNT) * block_width * GOB_X_TEXEL_COUNT height = ( ceil_divide(height, block_height * GOB_Y_TEXEL_COUNT * texels_per_block) * block_height @@ -134,5 +114,14 @@ def get_padded_texture_size( return width, height -def get_switch_gobs_per_block(platform_blob: bytes) -> int: +def get_switch_gobs_per_block(platform_blob: List[int]) -> int: return 1 << int.from_bytes(platform_blob[8:12], "little") + + +def is_switch_swizzled(platform: Union[BuildTarget, int], platform_blob: Optional[List[int]]) -> bool: + if platform != BuildTarget.Switch: + return False + if not platform_blob or len(platform_blob) < 12: + return False + gobs_per_block = get_switch_gobs_per_block(platform_blob) + return gobs_per_block > 1 diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index a636d7d17..3ccdfbef9 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -1,53 +1,62 @@ from __future__ import annotations -from enum import IntEnum, IntFlag -from importlib.resources import open_binary +import sys +from functools import cache from io import BytesIO -from struct import Struct -from typing import Any, Dict, List, Tuple +from typing import TYPE_CHECKING, Dict, Optional, cast -from .TypeTreeHelper import TypeTreeNode +from tpk_ar import TpkFile, TpkTypeTreeBlob, TpkUnityClass, TpkUnityNode +from tpk_ar import UnityVersion as TpkUnityVersion -TPKTYPETREE: TpkTypeTreeBlob = None -CLASSES_CACHE: Dict[Tuple[int, tuple], TypeTreeNode] = {} -NODES_CACHE: Dict[TpkUnityClass, TypeTreeNode] = {} +from . import TypeTreeHelper +from .UnityVersion import UnityVersion +if TYPE_CHECKING: + from .TypeTreeHelper import TypeTreeNode -def init(): - with open_binary("UnityPy.resources", "uncompressed.tpk") as f: - data = f.read() - global TPKTYPETREE - with BytesIO(data) as stream: - TPKTYPETREE = TpkFile(stream).GetDataBlob() +@cache +def get_typetree() -> TpkTypeTreeBlob: + package = "UnityPy.resources" + resource = "lzma.tpk" + tpk_data: bytes + if sys.version_info >= (3, 9): + from importlib.resources import files -def get_typetree_node(class_id: int, version: tuple): - global CLASSES_CACHE - key = (class_id, version) - cached = CLASSES_CACHE.get(key) - if cached: - return cached + tpk_data = files(package).joinpath(resource).read_bytes() - class_info = TPKTYPETREE.ClassInformation[class_id].getVersionedClass( - UnityVersion.fromList(*version) - ) + else: + from importlib.resources import open_binary + + tpk_data = open_binary(package, resource).read() + + with BytesIO(tpk_data) as stream: + tree = TpkFile.parse(stream).GetDataBlob() + assert isinstance(tree, TpkTypeTreeBlob) + return tree + + +@cache +def get_typetree_node(class_id: int, version: UnityVersion): + tpk_version = cast(TpkUnityVersion, version) + class_info = get_typetree().ClassInformation[class_id].getVersionedClass(tpk_version) if class_info is None: raise ValueError("Could not find class info for class id {}".format(class_id)) node = generate_node(class_info) - CLASSES_CACHE[key] = node return node -def generate_node(class_info: TpkUnityClass) -> TypeTreeNode: - global NODES_CACHE - cached = NODES_CACHE.get(class_info) - if cached: - return cached +@cache +def generate_node(class_info: TpkUnityClass) -> "TypeTreeNode": + assert class_info.ReleaseRootNode is not None, "Class {} has no ReleaseRootNode".format(class_info) + + TypeTreeNode = TypeTreeHelper.TypeTreeNode nodes = [] - NODES = TPKTYPETREE.NodeBuffer.Nodes + NODES = get_typetree().NodeBuffer + STRINGBUFFER = get_typetree().StringBuffer stack = [(class_info.ReleaseRootNode, 0)] index = 0 while stack: @@ -60,481 +69,16 @@ def generate_node(class_info: TpkUnityClass) -> TypeTreeNode: m_Version=node.Version, m_MetaFlag=node.MetaFlag, m_Level=level, - m_Type=TPKTYPETREE.StringBuffer.Strings[node.TypeName], - m_Name=TPKTYPETREE.StringBuffer.Strings[node.Name], + m_Type=STRINGBUFFER[node.TypeName], + m_Name=STRINGBUFFER[node.Name], ) ) stack = [(node_id, level + 1) for node_id in node.SubNodes] + stack index += 1 - result = TypeTreeNode.from_list(nodes) - NODES_CACHE[class_info] = result - return result - - -###################################################################################### -# -# Enums -# -###################################################################################### - - -class TpkCompressionType(IntEnum): - NONE = 0 - Lz4 = 1 - Lzma = 2 - Brotli = 3 - - -class UnityVersionType(IntEnum): - Alpha = 0 - Beta = 1 - China = 2 - Final = 3 - Patch = 4 - Experimental = 5 - - -class TpkDataType(IntEnum): - TypeTreeInformation = 0 - Collection = 1 - FileSystem = 2 - Json = 3 - ReferenceAssemblies = 4 - EngineAssets = 5 - - def ToBlob(self, stream): - if self.value == TpkDataType.TypeTreeInformation: - return TpkTypeTreeBlob(stream) - elif self.value == TpkDataType.Collection: - return TpkCollectionBlob(stream) - elif self.value == TpkDataType.FileSystem: - return TpkFileSystemBlob(stream) - elif self.value == TpkDataType.Json: - return TpkJsonBlob(stream) - else: - raise Exception("Unimplemented TpkDataType -> Blob conversion") - - -class TpkUnityClassFlags(IntFlag): - NONE = 0 - IsAbstract = 1 - IsSealed = 2 - IsEditorOnly = 4 - IsReleaseOnly = 8 - IsStripped = 16 - Reserved = 32 - HasEditorRootNode = 64 - HasReleaseRootNode = 128 - - -###################################################################################### -# -# Main Class -# -###################################################################################### - - -class TpkFile: - Struct = Struct(" TpkDataBlob: - decompressed = None - if self.CompressionType == TpkCompressionType.NONE: - decompressed = self.CompressedBytes - - elif self.CompressionType == TpkCompressionType.Lz4: - import lz4.block - - decompressed = lz4.block.decompress( - self.CompressedBytes, self.UncompressedSize - ) - - elif self.CompressionType == TpkCompressionType.Lzma: - import lzma - - decompressed = lzma.decompress(self.CompressedBytes) - - elif self.CompressionType == TpkCompressionType.Brotli: - import brotli - - decompressed: bytes = brotli.decompress(self.CompressedBytes) - - else: - raise Exception("Invalid compression type") - - return self.DataType.ToBlob(BytesIO(decompressed)) - - -###################################################################################### -# -# Blobs -# -###################################################################################### - - -class TpkDataBlob: - __slots__ = ("DataType",) - DataType: TpkDataType - - def __init__(self, stream: BytesIO) -> None: - raise NotImplementedError("TpkDataBlob is an abstract class") - - -class TpkTypeTreeBlob(TpkDataBlob): - __slots__ = ( - "CreationTime", - "Versions", - "ClassInformation", - "CommonString", - "NodeBuffer", - "StringBuffer", - ) - CreationTime: int - Versions: List[UnityVersion] - ClassInformation: Dict[int, TpkClassInformation] # List[TpkClassInformation] - CommonString: TpkCommonString - NodeBuffer: TpkUnityNodeBuffer - StringBuffer: TpkStringBuffer - DataType: TpkDataType = TpkDataType.TypeTreeInformation - - def __init__(self, stream: BytesIO) -> None: - (self.CreationTime,) = INT64.unpack(stream.read(INT64.size)) - (versionCount,) = INT32.unpack(stream.read(INT32.size)) - self.Versions = [UnityVersion.fromStream(stream) for _ in range(versionCount)] - (classCount,) = INT32.unpack(stream.read(INT32.size)) - self.ClassInformation = { - x.ID: x for x in (TpkClassInformation(stream) for _ in range(classCount)) - } - self.CommonString = TpkCommonString(stream) - self.NodeBuffer = TpkUnityNodeBuffer(stream) - self.StringBuffer = TpkStringBuffer(stream) - - -class TpkCollectionBlob(TpkDataBlob): - __slots__ = "Blobs" - Blobs: List[Tuple[str, TpkDataBlob]] - - def __init__(self, stream: BytesIO) -> None: - (count,) = INT32.unpack(stream.read(INT32.size)) - self.Blobs = [ - # relativePath, data - ( - read_string(stream), - TpkDataType(BYTE.unpack(stream.read(1))[0]).ToBlob(stream), - ) - for _ in range(count) - ] - - -class TpkFileSystemBlob(TpkDataBlob): - __slots__ = ("Files",) - # TODO: check if dict might be better - Files: List[Tuple[str, bytes]] - - def __init__(self, stream: BytesIO) -> None: - (count,) = INT32.unpack(stream.read(INT32.size)) - self.Files = [ - # relativePath, data - (read_string(stream), read_data(stream)) - for _ in range(count) - ] - - -class TpkJsonBlob(TpkDataBlob): - __slots__ = "Text" - Text: str - DataType = TpkDataType.Json - - def __init__(self, stream: BytesIO) -> None: - self.Text = read_string(stream) - - -###################################################################################### -# -# Unity -# -###################################################################################### - - -class UnityVersion(int): - # https://github.com/AssetRipper/VersionUtilities/blob/master/VersionUtilities/UnityVersion.cs - """ - use following static methos instead of the constructor(__init__): - UnityVersion.fromStream(stream: BytesIO) - UnityVersion.fromString(version: str) - UnityVersion.fromList(major: int, minor: int, patch: int, build: int) - """ - - @staticmethod - def fromStream(stream: BytesIO) -> UnityVersion: - (m_data,) = UINT64.unpack(stream.read(UINT64.size)) - return UnityVersion(m_data) - - @staticmethod - def fromString(version: str) -> UnityVersion: - return UnityVersion(version.split(".")) - - @staticmethod - def fromList( - major: int = 0, minor: int = 0, patch: int = 0, build: int = 0 - ) -> UnityVersion: - return UnityVersion(major << 48 | minor << 32 | patch << 16 | build) - - @property - def major(self) -> int: - return (self >> 48) & 0xFFFF - - @property - def minor(self) -> int: - return (self >> 32) & 0xFFFF - - @property - def build(self) -> int: - return (self >> 16) & 0xFFFF - - @property - def type(self) -> int: - return UnityVersionType(self >> 8) & 0xFF - - @property - def type_number(self) -> int: - return self & 0xFF - - def __repr__(self) -> str: - return f"UnityVersion {self.major}.{self.minor}.{self.build}.{self.type_number}" - - -class TpkUnityClass: - __slots__ = ("Name", "Base", "Flags", "EditorRootNode", "ReleaseRootNode") - Struct = Struct(" None: - self.Name, self.Base, Flags = TpkUnityClass.Struct.unpack( - stream.read(TpkUnityClass.Struct.size) - ) - self.Flags = TpkUnityClassFlags(Flags) - self.EditorRootNode = self.ReleaseRootNode = None - if self.Flags & TpkUnityClassFlags.HasEditorRootNode: - (self.EditorRootNode,) = UINT16.unpack(stream.read(UINT16.size)) - if self.Flags & TpkUnityClassFlags.HasReleaseRootNode: - (self.ReleaseRootNode,) = UINT16.unpack(stream.read(UINT16.size)) - - def to_dict(self) -> Dict[str, Any]: - return { - "Name": self.Name, - "Base": self.Base, - "Flags": self.Flags, - "EditorRootNode": self.EditorRootNode, - "ReleaseRootNode": self.ReleaseRootNode, - } - - def __eq__(self, other: TpkUnityClass) -> bool: - return self.to_dict() == other.to_dict() - - def __hash__(self) -> int: - return hash( - ( - self.Name, - self.Base, - self.Flags, - self.EditorRootNode, - self.ReleaseRootNode, - ) - ) - - -class TpkClassInformation: - __slots__ = ("ID", "Classes") - ID: int - # TODO - might want to use dict - Classes: List[Tuple[UnityVersion, TpkUnityClass]] - - def __init__(self, stream: BytesIO) -> None: - (self.ID,) = INT32.unpack(stream.read(INT32.size)) - (count,) = INT32.unpack(stream.read(INT32.size)) - self.Classes = [ - ( - UnityVersion.fromStream(stream), - TpkUnityClass(stream) if stream.read(1)[0] else None, - ) - for _ in range(count) - ] - - def getVersionedClass(self, version: UnityVersion) -> TpkUnityClass: - return get_item_for_version(version, self.Classes) - - -class TpkUnityNodeBuffer: - Nodes: List[TpkUnityNode] - - def __init__(self, stream: BytesIO) -> None: - (count,) = INT32.unpack(stream.read(INT32.size)) - self.Nodes = [TpkUnityNode(stream) for _ in range(count)] - - def __getitem__(self, index: int) -> TpkUnityNode: - return self.Nodes[index] - - -class TpkUnityNode: - __slots__ = ( - "TypeName", - "Name", - "ByteSize", - "Version", - "TypeFlags", - "MetaFlag", - "SubNodes", - ) - Struct = Struct(" None: - ( - self.TypeName, - self.Name, - self.ByteSize, - self.Version, - self.TypeFlags, - self.MetaFlag, - count, - ) = TpkUnityNode.Struct.unpack(stream.read(TpkUnityNode.Struct.size)) - - SubNodeStruct = Struct(f"<{count}H") - self.SubNodes = list(SubNodeStruct.unpack(stream.read(SubNodeStruct.size))) - - def __eq__(self, other: TpkUnityNode) -> bool: - return self.__dict__ == other.__dict__ - - def __hash__(self) -> int: - # TODO - return hash(self.__dict__) - - -###################################################################################### -# -# Strings -# -###################################################################################### - - -class TpkStringBuffer: - __slots__ = "Strings" - Strings: List[str] - - def __init__(self, stream: BytesIO) -> None: - self.Strings = [ - read_string(stream) for _ in range(INT32.unpack(stream.read(INT32.size))[0]) - ] - - @property - def Count(self) -> int: - return len(self.Strings) - - -class TpkCommonString: - __slots__ = ("VersionInformation", "StringBufferIndices") - VersionInformation: List[Tuple[UnityVersion, int]] - StringBufferIndices: List[int] - - def __init__(self, stream: BytesIO) -> None: - (versionCount,) = INT32.unpack(stream.read(INT32.size)) - self.VersionInformation = [ - (UnityVersion.fromStream(stream), stream.read(1)[0]) - for _ in range(versionCount) - ] - (indicesCount,) = INT32.unpack(stream.read(INT32.size)) - indicesStruct = Struct(f"<{indicesCount}H") - self.StringBufferIndices = indicesStruct.unpack(stream.read(indicesStruct.size)) - - def GetStrings(self, buffer: TpkStringBuffer) -> List[str]: - return [buffer.Strings[i] for i in self.StringBufferIndices] - - def GetCount(self, exactVersion: UnityVersion) -> int: - return get_item_for_version(exactVersion, self.VersionInformation) - - -###################################################################################### -# -# helper functions -# -###################################################################################### - -BYTE = Struct("b") -UINT16 = Struct(" str: - # varint - shift = 0 - length = 0 - while True: - (i,) = stream.read(1) - length |= (i & 0x7F) << shift - shift += 7 - if not (i & 0x80): - break - # string - return stream.read(length).decode("utf-8") - - -def read_data(stream: BytesIO) -> bytes: - return stream.read(INT32.unpack(stream.read(INT32.size))[0]) - - -def get_item_for_version( - exactVersion: UnityVersion, items: List[Tuple[UnityVersion, Any]] -) -> Any: - ret = None - for version, item in items: - if exactVersion >= version: - ret = item - else: - break - if ret: - return ret - raise ValueError("Could not find exact version") + return TypeTreeNode.from_list(nodes) -init() +@cache +def get_common_strings(version: Optional[UnityVersion] = None) -> Dict[int, str]: + tpk_version: TpkUnityVersion | None = cast(TpkUnityVersion, version) if version is not None else None + return get_typetree().CommonString.BuildMap(get_typetree().StringBuffer, tpk_version) diff --git a/UnityPy/helpers/TypeTreeGenerator.py b/UnityPy/helpers/TypeTreeGenerator.py new file mode 100644 index 000000000..4f313784e --- /dev/null +++ b/UnityPy/helpers/TypeTreeGenerator.py @@ -0,0 +1,78 @@ +import os +from typing import Dict, List, Tuple + +from .TypeTreeNode import TypeTreeNode + +try: + from TypeTreeGeneratorAPI import TypeTreeGenerator as TypeTreeGeneratorBase # pyright: ignore[reportAssignmentType] +except ImportError: + + class TypeTreeGeneratorBase: + def __init__(self, unity_version: str): + raise ImportError("TypeTreeGeneratorAPI isn't installed!") + + def load_dll(self, dll: bytes): ... + def load_il2cpp(self, il2cpp: bytes, metadata: bytes): ... + def get_nodes_as_json(self, assembly: str, fullname: str) -> str: ... + def get_nodes(self, assembly: str, fullname: str) -> List[TypeTreeNode]: ... + + +class TypeTreeGenerator(TypeTreeGeneratorBase): + cache: Dict[Tuple[str, str], TypeTreeNode] + + def __init__(self, unity_version: str, *args, **kwargs): + super().__init__(unity_version, *args, **kwargs) + self.cache = {} + + def load_local_game(self, root_dir: str): + root_files = os.listdir(root_dir) + data_dir = os.path.join(root_dir, next(f for f in root_files if f.endswith("_Data"))) + if "GameAssembly.dll" in root_files: + ga_fp = os.path.join(root_dir, "GameAssembly.dll") + gm_fp = os.path.join(data_dir, "il2cpp_data", "Metadata", "global-metadata.dat") + with open(ga_fp, "rb") as f: + ga_raw = f.read() + with open(gm_fp, "rb") as f: + gm_raw = f.read() + self.load_il2cpp(ga_raw, gm_raw) + else: + self.load_local_dll_folder(os.path.join(data_dir, "Managed")) + + def load_local_dll_folder(self, dll_dir: str): + for f in os.listdir(dll_dir): + if not f.endswith(".dll"): + continue + fp = os.path.join(dll_dir, f) + with open(fp, "rb") as f: + data = f.read() + self.load_dll(data) + + def get_nodes_up(self, assembly: str, fullname: str) -> TypeTreeNode: + key = (assembly, fullname) + if key in self.cache: + return self.cache[key] + + if not assembly.endswith(".dll"): + assembly = f"{assembly}.dll" + + base_nodes = self.get_nodes(assembly, fullname) + + node = TypeTreeNode.from_list( + [ + TypeTreeNode( + base_node.m_Level, + base_node.m_Type, + base_node.m_Name, + 0, + 0, + m_MetaFlag=base_node.m_MetaFlag, + ) + for base_node in base_nodes + ] + ) + + self.cache[key] = node + return node + + +__all__ = ("TypeTreeGenerator",) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 8f6e3659f..7eb916eb6 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -1,6 +1,6 @@ -from __future__ import annotations +from __future__ import annotations -import re +from sys import version_info as py_version_info from typing import TYPE_CHECKING, Any, Optional, Union from attrs import define @@ -49,6 +49,7 @@ "string": EndianBinaryReader.read_aligned_string, "TypelessData": EndianBinaryReader.read_byte_array, } + FUNCTION_READ_MAP_ARRAY = { "SInt8": EndianBinaryReader.read_byte_array, "UInt8": EndianBinaryReader.read_u_byte_array, @@ -83,7 +84,7 @@ def copy(self) -> TypeTreeConfig: return TypeTreeConfig(self.as_dict, self.assetsfile, self.has_registry) -def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> TypeTreeNode: +def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> Optional[TypeTreeNode]: typ = ref_object["type"] if isinstance(typ, dict): cls = typ["class"] @@ -101,16 +102,23 @@ def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> TypeTreeNo return None for ref_type in assetfile.ref_types: - if ( - cls == ref_type.m_ClassName - and ns == ref_type.m_NameSpace - and asm == ref_type.m_AssemblyName - ): + if cls == ref_type.m_ClassName and ns == ref_type.m_NameSpace and asm == ref_type.m_AssemblyName: return ref_type.node else: raise ValueError(f"Referenced type not found: {cls} {ns} {asm}") +if py_version_info >= (3, 14): + from annotationlib import get_annotations as annotationlib_get_annotations + + def get_annotation_keys(clz) -> set[str]: + return set(annotationlib_get_annotations(clz).keys()) +else: + + def get_annotation_keys(clz) -> set[str]: + return set(clz.__annotations__) + + def read_typetree( root_node: TypeTreeNode, reader: EndianBinaryReader, @@ -136,9 +144,7 @@ def read_typetree( bytes_read: int if byte_size and read_typetree_boost: data = reader.read_bytes(byte_size) - obj, bytes_read = read_typetree_boost( - data, root_node, reader.endian, as_dict, assetsfile, classes - ) + obj, bytes_read = read_typetree_boost(data, root_node, reader.endian, as_dict, assetsfile, classes) else: pos = reader.Position config = TypeTreeConfig(as_dict, assetsfile, False) @@ -146,9 +152,7 @@ def read_typetree( bytes_read = reader.Position - pos if check_read and bytes_read != byte_size: - raise ValueError( - f"Expected to read {byte_size} bytes, but only read {bytes_read} bytes" - ) + raise ValueError(f"Expected to read {byte_size} bytes, but only read {bytes_read} bytes") return obj @@ -206,9 +210,11 @@ def read_value( # size = read_value(node.m_Children[0].m_Children[0], reader, as_dict) size = reader.read_int() + if size < 0: + raise ValueError("Negative length read from TypeTree") subtype = node.m_Children[0].m_Children[1] if metaflag_is_aligned(subtype.m_MetaFlag): - value = read_value_array(subtype, reader, config) + value = read_value_array(subtype, reader, config, size) else: value = [read_value(subtype, reader, config) for _ in range(size)] @@ -221,9 +227,7 @@ def read_value( else: config = config.copy() config.has_registry = True - value[child.m_Name if config.as_dict else child._clean_name] = read_value( - child, reader, config - ) + value[child.m_Name if config.as_dict else child._clean_name] = read_value(child, reader, config) if not config.as_dict: if node.m_Type.startswith("PPtr<"): @@ -238,16 +242,14 @@ def read_value( value = clz(**value) except TypeError: keys = set(value.keys()) - annotation_keys = set(clz.__annotations__) + annotation_keys = get_annotation_keys(clz) missing_keys = annotation_keys - keys if clz is UnknownObject or missing_keys: value = UnknownObject(node, **value) else: extra_keys = keys - annotation_keys if extra_keys: - instance = clz( - **{key: value[key] for key in annotation_keys} - ) + instance = clz(**{key: value[key] for key in annotation_keys}) for key in extra_keys: setattr(instance, key, value[key]) value = instance @@ -274,7 +276,7 @@ def read_value_array( elif node.m_Type == "string": value = [reader.read_aligned_string() for _ in range(size)] elif node.m_Type == "TypelessData": - value = [reader.read_bytes() for _ in range(size)] + value = [reader.read_byte_array() for _ in range(size)] elif node.m_Type == "pair": key_node = node.m_Children[0] value_node = node.m_Children[1] @@ -305,32 +307,19 @@ def read_value_array( align = True subtype = node.m_Children[0].m_Children[1] if metaflag_is_aligned(subtype.m_MetaFlag): - value = [ - read_value_array(subtype, reader, config, reader.read_int()) - for _ in range(size) - ] + value = [read_value_array(subtype, reader, config, reader.read_int()) for _ in range(size)] else: - value = [ - [read_value(subtype, reader, config) for _ in range(reader.read_int())] - for _ in range(size) - ] + value = [[read_value(subtype, reader, config) for _ in range(reader.read_int())] for _ in range(size)] else: # Class if config.as_dict: value = [ - { - child.m_Name: read_value(child, reader, config) - for child in node.m_Children - } - for _ in range(size) + {child.m_Name: read_value(child, reader, config) for child in node.m_Children} for _ in range(size) ] elif node.m_Type.startswith("PPtr<"): value = [ PPtr[Any]( assetsfile=config.assetsfile, - **{ - child.m_Name: read_value(child, reader, config) - for child in node.m_Children - }, + **{child.m_Name: read_value(child, reader, config) for child in node.m_Children}, ) for _ in range(size) ] @@ -341,45 +330,28 @@ def read_value_array( UnknownObject, ) keys = set(child._clean_name for child in node.m_Children) - annotation_keys = set(clz.__annotations__) + annotation_keys = get_annotation_keys(clz) missing_keys = annotation_keys - keys extra_keys = keys - annotation_keys if missing_keys or clz is UnknownObject: value = [ UnknownObject( node, - **{ - child._clean_name: read_value(child, reader, config) - for child in node.m_Children - }, + **{child._clean_name: read_value(child, reader, config) for child in node.m_Children}, ) for _ in range(size) ] elif extra_keys: value = [None] * size for i in range(size): - value_i_d = { - child._clean_name: read_value(child, reader, config) - for child in node.m_Children - } - value_i = clz( - **{ - key: value - for key, value in value_i_d.items() - if key in annotation_keys - } - ) + value_i_d = {child._clean_name: read_value(child, reader, config) for child in node.m_Children} + value_i = clz(**{key: value for key, value in value_i_d.items() if key in annotation_keys}) for key in extra_keys: setattr(value_i, key, value_i_d[key]) value[i] = value_i else: value = [ - clz( - **{ - child._clean_name: read_value(child, reader, config) - for child in node.m_Children - } - ) + clz(**{child._clean_name: read_value(child, reader, config) for child in node.m_Children}) for _ in range(size) ] @@ -392,19 +364,6 @@ def metaflag_is_aligned(meta_flag: int | None) -> bool: return ((meta_flag or 0) & kAlignBytes) != 0 -def clean_name(name: str) -> str: - if name.startswith("(int&)"): - name = name[6:] - if name.endswith("?"): - name = name[:-1] - name = re.sub(r"[ \.:\-\[\]]", "_", name) - if name in ["pass", "from"]: - name += "_" - if name[0].isdigit(): - name = f"x{name}" - return name - - FUNCTION_WRITE_MAP = { "SInt8": EndianBinaryWriter.write_byte, "UInt8": EndianBinaryWriter.write_u_byte, diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index 8f847b0da..a0a095711 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -2,18 +2,26 @@ import re from struct import Struct -from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Tuple, Any, Union +from threading import Lock +from typing import ( + TYPE_CHECKING, + Dict, + Iterator, + List, + Optional, + Tuple, + Union, + cast, +) from attrs import define, field +from ..helpers.Tpk import get_common_strings from ..streams.EndianBinaryReader import EndianBinaryReader from ..streams.EndianBinaryWriter import EndianBinaryWriter -if TYPE_CHECKING: - from .Tpk import UnityVersion - try: - from ..UnityPyBoost import TypeTreeNode as TypeTreeNodeC + from ..UnityPyBoost import TypeTreeNode as TypeTreeNodeC # type: ignore except ImportError: @define(slots=True) @@ -34,6 +42,10 @@ class TypeTreeNodeC: def __attrs_post_init__(self): self._clean_name = clean_name(self.m_Name) + def __repr__(self): + return f"TypeTreeNode(m_Level={self.m_Level}, m_Type='{self.m_Type}', \ + m_Name='{self.m_Name}', m_MetaFlag={self.m_MetaFlag})" + TYPETREENODE_KEYS = [ "m_Level", @@ -49,6 +61,9 @@ def __attrs_post_init__(self): "m_RefTypeHash", ] +SYSTEM_GLOBAL_LOCK = Lock() +NAME_PEEK_NODE_CACHE: dict[Tuple[str, str, int], Union[Tuple[TypeTreeNode, str], None]] = {} + class TypeTreeNode(TypeTreeNodeC): def traverse(self) -> Iterator[TypeTreeNode]: @@ -98,9 +113,7 @@ def parse_blob(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: node_struct, keys = _get_blob_node_struct(reader.endian, version) struct_data = reader.read(node_struct.size * node_count) - stringbuffer_reader = EndianBinaryReader( - reader.read(stringbuffer_size), reader.endian - ) + stringbuffer_reader = EndianBinaryReader(reader.read(stringbuffer_size), reader.endian) CommonString = get_common_strings() @@ -139,9 +152,7 @@ def read_string(reader: EndianBinaryReader, value: int) -> str: return fake_root.m_Children[0] @classmethod - def from_list( - cls, nodes: Union[List[Dict[str, Union[str, int]]], List[TypeTreeNode]] - ) -> TypeTreeNode: + def from_list(cls, nodes: Union[List[Dict[str, Union[str, int]]], List[TypeTreeNode]]) -> TypeTreeNode: fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, []) stack: List[TypeTreeNode] = [fake_root] parent = fake_root @@ -149,20 +160,17 @@ def from_list( # check if the nodes contain all required fields if isinstance(nodes[0], dict): - if ( - "m_Level" not in nodes[0] - or "m_Type" not in nodes[0] - or "m_Name" not in nodes[0] - ): - raise ValueError( - "Nodes must contain at least m_Level, m_Type and m_Name" - ) + if "m_Level" not in nodes[0] or "m_Type" not in nodes[0] or "m_Name" not in nodes[0]: + raise ValueError("Nodes must contain at least m_Level, m_Type and m_Name") patch_dict = {} if "m_ByteSize" not in nodes[0]: patch_dict["m_ByteSize"] = 0 if "m_Version" not in nodes[0]: patch_dict["m_Version"] = 0 - nodes = [cls(**node, **patch_dict) for node in nodes] + nodes = [cls(**node, **patch_dict) for node in nodes] # type: ignore + + if TYPE_CHECKING: + nodes = cast(List[TypeTreeNode], nodes) for node in nodes: if node.m_Level > prev.m_Level: @@ -177,6 +185,29 @@ def from_list( return fake_root.m_Children[0] + def get_name_peek_node(self) -> Union[Tuple[TypeTreeNode, str], None]: + global SYSTEM_GLOBAL_LOCK + with SYSTEM_GLOBAL_LOCK: + key = (self.m_Name, self.m_Type, self.m_Version) + if key in NAME_PEEK_NODE_CACHE: + return NAME_PEEK_NODE_CACHE[key] + + result: Union[Tuple[TypeTreeNode, str], None] = None + for i, child in enumerate(self.m_Children): + if child.m_Name in ("m_Name", "name"): + peek_node = TypeTreeNode( + self.m_Level, + self.m_Type, + self.m_Name, + self.m_ByteSize, + self.m_Version, + self.m_Children[: i + 1], + ) + result = peek_node, child.m_Name + break + NAME_PEEK_NODE_CACHE[key] = result + return result + def dump(self, writer: EndianBinaryWriter, version: int): stack: list[TypeTreeNode] = [self] while stack: @@ -191,7 +222,7 @@ def dump(self, writer: EndianBinaryWriter, version: int): if version != 3: assert self.m_Index is not None writer.write_int(self.m_Index) - writer.write_int(self.m_TypeFlags) + writer.write_int(self.m_TypeFlags or 0) writer.write_int(self.m_Version) if version != 3: assert self.m_MetaFlag is not None @@ -206,9 +237,7 @@ def dump_blob(self, writer: EndianBinaryWriter, version: int): string_writer = EndianBinaryWriter() # string buffer setup - CommonStringOffsetMap = { - string: offset for offset, string in get_common_strings().items() - } + CommonStringOffsetMap = {string: offset for offset, string in get_common_strings().items()} string_offsets: dict[str, int] = {} @@ -249,7 +278,8 @@ def write_node(node: TypeTreeNode): def dump_structure(self, indent: str = " ") -> str: # dump structure similar to https://github.com/AssetRipper/TypeTreeDumps/blob/main/StructsDump sb = [ - f"{indent}{self.m_Type} {self.m_Name} // ByteSize{{{self.m_ByteSize:X}}}, Index{{{self.m_Index}}}, Version{{{self.m_Version}}}, TypeFlags{{{self.m_TypeFlags}}}, MetaFlag{{{self.m_MetaFlag}}}" + f"{indent}{self.m_Type} {self.m_Name} // ByteSize{{{self.m_ByteSize:X}}}, Index{{{self.m_Index}}}, \ + Version{{{self.m_Version}}}, TypeFlags{{{self.m_TypeFlags}}}, MetaFlag{{{self.m_MetaFlag}}}" ] for child in self.m_Children: sb.append(child.dump_structure(indent + " ")) @@ -257,9 +287,7 @@ def dump_structure(self, indent: str = " ") -> str: def to_dict(self) -> dict: return { - key: value - for key, value in ((key, getattr(self, key)) for key in TYPETREENODE_KEYS) - if value is not None + key: value for key, value in ((key, getattr(self, key)) for key in TYPETREENODE_KEYS) if value is not None } def to_dict_list(self) -> List[dict]: @@ -268,36 +296,10 @@ def to_dict_list(self) -> List[dict]: *(item for child in self.m_Children for item in child.to_dict_list()), ] - def __eq__(self, other: TypeTreeNode) -> bool: + def __eq__(self, other: TypeTreeNode) -> bool: # type: ignore return self.to_dict() == other.to_dict() and self.m_Children == other.m_Children -COMMONSTRING_CACHE: Dict[Optional[UnityVersion], Dict[int, str]] = {} - - -def get_common_strings(version: Optional[UnityVersion] = None) -> Dict[int, str]: - if version in COMMONSTRING_CACHE: - return COMMONSTRING_CACHE[version] - - from .Tpk import TPKTYPETREE - - tree = TPKTYPETREE - common_string = tree.CommonString - strings = common_string.GetStrings(tree.StringBuffer) - if version: - count = common_string.GetCount(version) - strings = strings[:count] - - ret: Dict[int, str] = {} - offset = 0 - for string in strings: - ret[offset] = string - offset += len(string) + 1 - - COMMONSTRING_CACHE[version] = ret - return ret - - def _get_blob_node_struct(endian: str, version: int) -> tuple[Struct, list[str]]: struct_type = f"{endian}hBBIIiii" keys = [ @@ -317,15 +319,18 @@ def _get_blob_node_struct(endian: str, version: int) -> tuple[Struct, list[str]] return Struct(struct_type), keys +CLEAN_NAME_REMOVE_RE = re.compile(r"[\?\*]") +CLEAN_NAME_REPLACE_RE = re.compile(r"[ \.:\-\[\]]") + + def clean_name(name: str) -> str: # keep in sync with TypeTreeHelper.cpp if len(name) == 0: return name if name.startswith("(int&)"): name = name[6:] - if name.endswith("?"): - name = name[:-1] - name = re.sub(r"[ \.:\-\[\]]", "_", name) + name = CLEAN_NAME_REMOVE_RE.sub("", name) + name = CLEAN_NAME_REPLACE_RE.sub("_", name) if name in ["pass", "from"]: name += "_" if name[0].isdigit(): diff --git a/UnityPy/helpers/UnityVersion.py b/UnityPy/helpers/UnityVersion.py new file mode 100644 index 000000000..3f001f6f1 --- /dev/null +++ b/UnityPy/helpers/UnityVersion.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +import re +from enum import IntEnum +from typing import Optional, Tuple, Union + +VersionPattern = re.compile( + r"^(?P\d+)\.(?P\d+)\.(?P\d+)(?P.+?)?(?P\d+)?(?P.*)$", + flags=re.DOTALL, +) + + +class UnityVersionType(IntEnum): + a = 0 # Alpha + b = 1 # Beta + c = 2 # China + f = 3 # Final + p = 4 # Patch + x = 5 # Experimental + u = 255 # Unknown + + +class UnityVersion(int): + # https://github.com/AssetRipper/VersionUtilities/blob/master/VersionUtilities/UnityVersion.cs + _type_str: Optional[str] + _postfix: Optional[str] + + @property + def major(self): + return (self >> 48) & 0xFFFF + + @property + def minor(self): + return (self >> 32) & 0xFFFF + + @property + def build(self): + return (self >> 16) & 0xFFFF + + @property + def type(self): + return UnityVersionType((self >> 8) & 0xFF) + + @property + def type_str(self): + return getattr(self, "_type_str", self.type.name) + + @property + def postfix(self): + return getattr(self, "_postfix", "") + + @property + def type_number(self): + return self & 0xFF + + @classmethod + def from_list( + cls, major: int = 0, minor: int = 0, build: int = 0, type: int = UnityVersionType.f, type_number: int = 0 + ): + return cls((major << 48) | (minor << 32) | (build << 16) | (type << 8) | type_number) + + @classmethod + def from_str(cls, version: str): + # formats: + # old: 5.0.0, .. + # new: 2018.1.1f2 .. + # the new format string can be followed by a custom postfix + match = VersionPattern.match(version) + if not match: + raise ValueError(f"Invalid version string: {version}") + major = int(match.group("major")) + minor = int(match.group("minor")) + build = int(match.group("build")) + type_str = match.group("type_str") + type_number = int(match.group("type_number") or 0) + postfix = match.group("postfix") + + if type_str is None: + return cls.from_list(major, minor, build) + + type = getattr(UnityVersionType, type_str.lower(), UnityVersionType.u) + obj = cls.from_list(major, minor, build, type, type_number) + if type is UnityVersionType.u: + obj._type_str = type_str + if postfix: + obj._postfix = postfix + + return obj + + def __str__(self) -> str: + if self.major <= 5: + return f"{self.major}.{self.minor}.{self.build}" + else: + return f"{self.major}.{self.minor}{self.type_str}{self.type_number}{self.postfix}" + + def __repr__(self) -> str: + return f"UnityVersion {self.__str__()}" + + def __getitem__(self, idx: Union[int, slice]) -> Union[int, Tuple[int, ...]]: + values = ( + self.major, + self.minor, + self.build, + self.type.value, + self.type_number, + ) + return values[idx] + + def as_tuple(self) -> Tuple[int, int, int, int, int]: + return (self.major, self.minor, self.build, self.type.value, self.type_number) + + def __eq__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + if isinstance(other, int): + return super().__eq__(other) + elif isinstance(other, tuple): + return self.as_tuple() == other + raise NotImplementedError("Unsupported comparison") + + def __ne__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + return not self.__eq__(other) + + def __lt__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + if isinstance(other, int): + return super().__lt__(other) + elif isinstance(other, tuple): + return self.as_tuple() < other + raise NotImplementedError("Unsupported comparison") + + def __le__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + return self.__lt__(other) or self.__eq__(other) + + def __gt__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + if isinstance(other, int): + return super().__gt__(other) + elif isinstance(other, tuple): + return self.as_tuple() > other + raise NotImplementedError("Unsupported comparison") + + def __ge__(self, other: Union[int, UnityVersion, Tuple[int, ...]]) -> bool: + return self.__gt__(other) or self.__eq__(other) + + def __hash__(self) -> int: + return super().__hash__() + + +__all__ = ["UnityVersion", "UnityVersionType"] diff --git a/UnityPy/helpers/__init__.py b/UnityPy/helpers/__init__.py index 066f4b96c..6dba06cb0 100644 --- a/UnityPy/helpers/__init__.py +++ b/UnityPy/helpers/__init__.py @@ -1 +1,10 @@ -from . import ArchiveStorageManager, CompressionHelper, ImportHelper, TypeTreeHelper \ No newline at end of file +from . import ArchiveStorageManager, CompressionHelper, ContainerHelper, ImportHelper, TypeTreeHelper, UnityVersion + +__all__ = [ + "ArchiveStorageManager", + "CompressionHelper", + "ImportHelper", + "TypeTreeHelper", + "ContainerHelper", + "UnityVersion", +] diff --git a/UnityPy/lib/FMOD/Darwin/__init__.py b/UnityPy/lib/FMOD/Darwin/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Darwin/libfmod.dylib b/UnityPy/lib/FMOD/Darwin/libfmod.dylib deleted file mode 100644 index f94ced2df..000000000 Binary files a/UnityPy/lib/FMOD/Darwin/libfmod.dylib and /dev/null differ diff --git a/UnityPy/lib/FMOD/Linux/__init__.py b/UnityPy/lib/FMOD/Linux/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Linux/arm/__init__.py b/UnityPy/lib/FMOD/Linux/arm/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Linux/arm/libfmod.so b/UnityPy/lib/FMOD/Linux/arm/libfmod.so deleted file mode 100644 index aea2139f3..000000000 Binary files a/UnityPy/lib/FMOD/Linux/arm/libfmod.so and /dev/null differ diff --git a/UnityPy/lib/FMOD/Linux/arm64/__init__.py b/UnityPy/lib/FMOD/Linux/arm64/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Linux/arm64/libfmod.so b/UnityPy/lib/FMOD/Linux/arm64/libfmod.so deleted file mode 100644 index 0bf089b68..000000000 Binary files a/UnityPy/lib/FMOD/Linux/arm64/libfmod.so and /dev/null differ diff --git a/UnityPy/lib/FMOD/Linux/x86/__init__.py b/UnityPy/lib/FMOD/Linux/x86/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Linux/x86/libfmod.so b/UnityPy/lib/FMOD/Linux/x86/libfmod.so deleted file mode 100644 index 6f2e31dca..000000000 Binary files a/UnityPy/lib/FMOD/Linux/x86/libfmod.so and /dev/null differ diff --git a/UnityPy/lib/FMOD/Linux/x86_64/__init__.py b/UnityPy/lib/FMOD/Linux/x86_64/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Linux/x86_64/libfmod.so b/UnityPy/lib/FMOD/Linux/x86_64/libfmod.so deleted file mode 100644 index b1f09cf3e..000000000 Binary files a/UnityPy/lib/FMOD/Linux/x86_64/libfmod.so and /dev/null differ diff --git a/UnityPy/lib/FMOD/Windows/__init__.py b/UnityPy/lib/FMOD/Windows/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Windows/arm/__init__.py b/UnityPy/lib/FMOD/Windows/arm/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Windows/arm/fmod.dll b/UnityPy/lib/FMOD/Windows/arm/fmod.dll deleted file mode 100644 index eba99c036..000000000 Binary files a/UnityPy/lib/FMOD/Windows/arm/fmod.dll and /dev/null differ diff --git a/UnityPy/lib/FMOD/Windows/x64/__init__.py b/UnityPy/lib/FMOD/Windows/x64/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Windows/x64/fmod.dll b/UnityPy/lib/FMOD/Windows/x64/fmod.dll deleted file mode 100644 index 22d5d7bf4..000000000 Binary files a/UnityPy/lib/FMOD/Windows/x64/fmod.dll and /dev/null differ diff --git a/UnityPy/lib/FMOD/Windows/x86/__init__.py b/UnityPy/lib/FMOD/Windows/x86/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/FMOD/Windows/x86/fmod.dll b/UnityPy/lib/FMOD/Windows/x86/fmod.dll deleted file mode 100644 index b19e554d9..000000000 Binary files a/UnityPy/lib/FMOD/Windows/x86/fmod.dll and /dev/null differ diff --git a/UnityPy/lib/FMOD/__init__.py b/UnityPy/lib/FMOD/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/lib/README.MD b/UnityPy/lib/README.MD deleted file mode 100644 index 647bfd629..000000000 --- a/UnityPy/lib/README.MD +++ /dev/null @@ -1,2 +0,0 @@ -## FMOD -Source: [FMOD Engine 2.00.10](https://fmod.com/download) diff --git a/UnityPy/lib/__init__.py b/UnityPy/lib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/math/Color.py b/UnityPy/math/Color.py deleted file mode 100644 index 9390aff88..000000000 --- a/UnityPy/math/Color.py +++ /dev/null @@ -1,56 +0,0 @@ -from dataclasses import dataclass -from .Vector4 import Vector4 - - -@dataclass -class Color: - R: float - G: float - B: float - A: float - - def __init__(self, r: float = 0.0, g: float = 0.0, b: float = 0.0, a: float = 0.0): - if not all(isinstance(v, (int, float)) for v in (r, g, b, a)): - raise TypeError("All components must be numeric.") - self.R = r - self.G = g - self.B = b - self.A = a - - def __add__(self, other): - return Color( - self.R + other.R, self.G + other.G, self.B + other.B, self.A + other.A - ) - - def __sub__(self, other): - return Color( - self.R - other.R, self.G - other.G, self.B - other.B, self.A - other.A - ) - - def __mul__(self, other): - if isinstance(other, Color): - return Color( - self.R * other.R, self.G * other.G, self.B * other.B, self.A * other.A - ) - else: - return Color(self.R * other, self.G * other, self.B * other, self.A * other) - - def __truediv__(self, other): - if isinstance(other, Color): - return Color( - self.R / other.R, self.G / other.G, self.B / other.B, self.A / other.A - ) - else: - return Color(self.R / other, self.G / other, self.B / other, self.A / other) - - def __eq__(self, other): - if isinstance(other, Color): - return self.__dict__ == other.__dict__ - else: - return False - - def __ne__(self, other): - return not (self == other) - - def Vector4(self): - return Vector4(self.R, self.G, self.B, self.A) diff --git a/UnityPy/math/Matrix4x4.py b/UnityPy/math/Matrix4x4.py deleted file mode 100644 index e09f2ac02..000000000 --- a/UnityPy/math/Matrix4x4.py +++ /dev/null @@ -1,281 +0,0 @@ -from dataclasses import dataclass -from typing import MutableSequence, Sequence, Union -from .Vector3 import Vector3 - - -@dataclass -class Matrix4x4: - M: MutableSequence[float] - - def __init__(self, values: Sequence[Union[int, float]]): - if not isinstance(values, Sequence) or len(values) != 16: - raise ValueError("Values must be a sequence with 16 elements.") - if not all(isinstance(v, (int, float)) for v in values): - raise TypeError("All values must be numeric.") - self.M = [float(v) for v in values] - - def __getitem__(self, index): - if isinstance(index, tuple): - row, col = index - if not (0 <= row < 4 and 0 <= col < 4): - raise IndexError("Row and column indices must in range [0, 3].") - index = row + col * 4 - if not (0 <= index < 16): - raise IndexError("Index out of range for Matrix4x4.") - return self.M[index] - - def __setitem__(self, index, value): - if isinstance(index, tuple): - row, col = index - if not (0 <= row < 4 and 0 <= col < 4): - raise IndexError("Row and column indices must in range [0, 3].") - index = row + col * 4 - if not (0 <= index < 16): - raise IndexError("Index out of range for Matrix4x4.") - self.M[index] = value - - def __eq__(self, other): - if not isinstance(other, Matrix4x4): - return False - return all(abs(a - b) < 1e-6 for a, b in zip(self.M, other.M)) - - def __mul__(lhs, rhs): - res = Matrix4x4([0] * 16) - res.M00 = ( - lhs.M00 * rhs.M00 - + lhs.M01 * rhs.M10 - + lhs.M02 * rhs.M20 - + lhs.M03 * rhs.M30 - ) - res.M01 = ( - lhs.M00 * rhs.M01 - + lhs.M01 * rhs.M11 - + lhs.M02 * rhs.M21 - + lhs.M03 * rhs.M31 - ) - res.M02 = ( - lhs.M00 * rhs.M02 - + lhs.M01 * rhs.M12 - + lhs.M02 * rhs.M22 - + lhs.M03 * rhs.M32 - ) - res.M03 = ( - lhs.M00 * rhs.M03 - + lhs.M01 * rhs.M13 - + lhs.M02 * rhs.M23 - + lhs.M03 * rhs.M33 - ) - - res.M10 = ( - lhs.M10 * rhs.M00 - + lhs.M11 * rhs.M10 - + lhs.M12 * rhs.M20 - + lhs.M13 * rhs.M30 - ) - res.M11 = ( - lhs.M10 * rhs.M01 - + lhs.M11 * rhs.M11 - + lhs.M12 * rhs.M21 - + lhs.M13 * rhs.M31 - ) - res.M12 = ( - lhs.M10 * rhs.M02 - + lhs.M11 * rhs.M12 - + lhs.M12 * rhs.M22 - + lhs.M13 * rhs.M32 - ) - res.M13 = ( - lhs.M10 * rhs.M03 - + lhs.M11 * rhs.M13 - + lhs.M12 * rhs.M23 - + lhs.M13 * rhs.M33 - ) - - res.M20 = ( - lhs.M20 * rhs.M00 - + lhs.M21 * rhs.M10 - + lhs.M22 * rhs.M20 - + lhs.M23 * rhs.M30 - ) - res.M21 = ( - lhs.M20 * rhs.M01 - + lhs.M21 * rhs.M11 - + lhs.M22 * rhs.M21 - + lhs.M23 * rhs.M31 - ) - res.M22 = ( - lhs.M20 * rhs.M02 - + lhs.M21 * rhs.M12 - + lhs.M22 * rhs.M22 - + lhs.M23 * rhs.M32 - ) - res.M23 = ( - lhs.M20 * rhs.M03 - + lhs.M21 * rhs.M13 - + lhs.M22 * rhs.M23 - + lhs.M23 * rhs.M33 - ) - - res.M30 = ( - lhs.M30 * rhs.M00 - + lhs.M31 * rhs.M10 - + lhs.M32 * rhs.M20 - + lhs.M33 * rhs.M30 - ) - res.M31 = ( - lhs.M30 * rhs.M01 - + lhs.M31 * rhs.M11 - + lhs.M32 * rhs.M21 - + lhs.M33 * rhs.M31 - ) - res.M32 = ( - lhs.M30 * rhs.M02 - + lhs.M31 * rhs.M12 - + lhs.M32 * rhs.M22 - + lhs.M33 * rhs.M32 - ) - res.M33 = ( - lhs.M30 * rhs.M03 - + lhs.M31 * rhs.M13 - + lhs.M32 * rhs.M23 - + lhs.M33 * rhs.M33 - ) - - return res - - @staticmethod - def Scale(vector: Vector3): - return Matrix4x4( - [vector.X, 0, 0, 0, - 0, vector.Y, 0, 0, - 0, 0, vector.Z, 0, - 0, 0, 0, 1] - ) - - @property - def M00(self): - return self.M[0] - - @M00.setter - def M00(self, value): - self.M[0] = value - - @property - def M10(self): - return self.M[1] - - @M10.setter - def M10(self, value): - self.M[1] = value - - @property - def M20(self): - return self.M[2] - - @M20.setter - def M20(self, value): - self.M[2] = value - - @property - def M30(self): - return self.M[3] - - @M30.setter - def M30(self, value): - self.M[3] = value - - @property - def M01(self): - return self.M[4] - - @M01.setter - def M01(self, value): - self.M[4] = value - - @property - def M11(self): - return self.M[5] - - @M11.setter - def M11(self, value): - self.M[5] = value - - @property - def M21(self): - return self.M[6] - - @M21.setter - def M21(self, value): - self.M[6] = value - - @property - def M31(self): - return self.M[7] - - @M31.setter - def M31(self, value): - self.M[7] = value - - @property - def M02(self): - return self.M[8] - - @M02.setter - def M02(self, value): - self.M[8] = value - - @property - def M12(self): - return self.M[9] - - @M12.setter - def M12(self, value): - self.M[9] = value - - @property - def M22(self): - return self.M[10] - - @M22.setter - def M22(self, value): - self.M[10] = value - - @property - def M32(self): - return self.M[11] - - @M32.setter - def M32(self, value): - self.M[11] = value - - @property - def M03(self): - return self.M[12] - - @M03.setter - def M03(self, value): - self.M[12] = value - - @property - def M13(self): - return self.M[13] - - @M13.setter - def M13(self, value): - self.M[13] = value - - @property - def M23(self): - return self.M[14] - - @M23.setter - def M23(self, value): - self.M[14] = value - - @property - def M33(self): - return self.M[15] - - @M33.setter - def M33(self, value): - self.M[15] = value diff --git a/UnityPy/math/Quaternion.py b/UnityPy/math/Quaternion.py deleted file mode 100644 index 6c27afecf..000000000 --- a/UnityPy/math/Quaternion.py +++ /dev/null @@ -1,32 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class Quaternion: - X: float - Y: float - Z: float - W: float - - def __init__(self, x: float = 0.0, y: float = 0.0, z: float = 0.0, w: float = 1.0): - if not all(isinstance(v, (int, float)) for v in (x, y, z, w)): - raise TypeError("All components must be numeric.") - self.X = float(x) - self.Y = float(y) - self.Z = float(z) - self.W = float(w) - - def __getitem__(self, index): - return (self.X, self.Y, self.Z, self.W)[index] - - def __setitem__(self, index, value): - if index == 0: - self.X = value - elif index == 1: - self.Y = value - elif index == 2: - self.Z = value - elif index == 3: - self.W = value - else: - raise IndexError("Index out of range") diff --git a/UnityPy/math/Rectangle.py b/UnityPy/math/Rectangle.py deleted file mode 100644 index a198ec434..000000000 --- a/UnityPy/math/Rectangle.py +++ /dev/null @@ -1,46 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class Rectangle: - height: int - width: int - x: int - y: int - - def __init__(self, *args, **kwargs): - if args: - # Rectangle(Point, Size) - if len(args) == 4: - self.x, self.y, self.width, self.height = args - elif kwargs: - self.__dict__.update(kwargs) - - def round(self): - return Rectangle( - round(self.x), round(self.y), round(self.width), round(self.height) - ) - - @property - def left(self): - return self.x - - @property - def top(self): - return self.y - - @property - def right(self): - return self.x + self.width - - @property - def bottom(self): - return self.y + self.height - - @property - def size(self): - return self.width, self.height - - @property - def location(self): - return self.x, self.y diff --git a/UnityPy/math/Vector2.py b/UnityPy/math/Vector2.py deleted file mode 100644 index c876bca35..000000000 --- a/UnityPy/math/Vector2.py +++ /dev/null @@ -1,83 +0,0 @@ -from dataclasses import dataclass -from math import sqrt - - -kEpsilon = 0.00001 - - -@dataclass -class Vector2: - '''https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Vector2.cs''' - - X: float = 0.0 - Y: float = 0.0 - - def __init__(self, x: float = 0.0, y: float = 0.0): - if not all(isinstance(v, (int, float)) for v in (x, y)): - raise TypeError("All components must be numeric.") - self.X = float(x) - self.Y = float(y) - - def __getitem__(self, index): - return (self.X, self.Y)[index] - - def __setitem__(self, index, value): - if index == 0: - self.X = value - elif index == 1: - self.Y = value - else: - raise IndexError("Index out of range") - - def __hash__(self): - return self.X.__hash__() ^ (self.Y.__hash__() << 2) - - def normalize(self): - length = self.length() - if length > kEpsilon: - invNorm = 1.0 / length - self.X *= invNorm - self.Y *= invNorm - else: - self.X = self.Y = 0.0 - - Normalize = normalize - - def length(self): - return sqrt(self.lengthSquared()) - - Length = length - - def lengthSquared(self): - return self.X ** 2 + self.Y ** 2 - - LengthSquared = lengthSquared - - @staticmethod - def Zero(): - return Vector2(0, 0) - - @staticmethod - def One(): - return Vector2(1, 1) - - def __add__(a, b): - return Vector2(a.X + b.X, a.Y + b.Y) - - def __sub__(a, b): - return Vector2(a.X - b.X, a.Y - b.Y) - - def __mul__(a, d): - return Vector2(a.X * d, a.Y * d) - - def __truediv__(a, d): - return Vector2(a.X / d, a.Y / d) - - def __eq__(lhs, rhs): - if isinstance(rhs, Vector2): - diff = lhs - rhs - return diff.lengthSquared() < kEpsilon * kEpsilon - return False - - def __ne__(lhs, rhs): - return not (lhs == rhs) diff --git a/UnityPy/math/Vector3.py b/UnityPy/math/Vector3.py deleted file mode 100644 index a821ec1d5..000000000 --- a/UnityPy/math/Vector3.py +++ /dev/null @@ -1,112 +0,0 @@ -from dataclasses import dataclass -from math import sqrt -from typing import Sequence - - -kEpsilon = 0.00001 - - -@dataclass -class Vector3: - '''https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Vector3.cs''' - - X: float = 0.0 - Y: float = 0.0 - Z: float = 0.0 - - def __init__(self, *args): - from .Vector4 import Vector4 - if len(args) == 1: - args = args[0] - - if isinstance(args, Sequence): - if len(args) == 3: # args=(x, y, z) - self.X, self.Y, self.Z = args - elif len(args) == 0: # args=() - self.X = self.Y = self.Z = 0.0 - else: - raise TypeError("Invalid argument length for Vector3") - elif isinstance(args, Vector4): - # dirty patch for Vector4 - self.X, self.Y, self.Z = args.X, args.Y, args.Z - else: - raise TypeError("If only 1 argument passed, it must be a sequence or Vector4") - - def __getitem__(self, index): - return (self.X, self.Y, self.Z)[index] - - def __setitem__(self, index, value): - if index == 0: - self.X = value - elif index == 1: - self.Y = value - elif index == 2: - self.Z = value - else: - raise IndexError("Index out of range") - - def __hash__(self): - return ( - self.X.__hash__() ^ - (self.Y.__hash__() << 2) ^ - (self.Z.__hash__() >> 2) - ) - - def normalize(self): - length = self.length() - if length > kEpsilon: - invNorm = 1.0 / length - self.X *= invNorm - self.Y *= invNorm - self.Z *= invNorm - else: - self.X = self.Y = self.Z = 0.0 - - Normalize = normalize - - def length(self): - return sqrt(self.lengthSquared()) - - Length = length - - def lengthSquared(self): - return self.X ** 2 + self.Y ** 2 + self.Z ** 2 - - LengthSquared = lengthSquared - - @staticmethod - def Zero(): - return Vector3(0, 0, 0) - - @staticmethod - def One(): - return Vector3(1, 1, 1) - - def __add__(a, b): - return Vector3(a.X + b.X, a.Y + b.Y, a.Z + b.Z) - - def __sub__(a, b): - return Vector3(a.X - b.X, a.Y - b.Y, a.Z - b.Z) - - def __mul__(a, d): - return Vector3(a.X * d, a.Y * d, a.Z * d) - - def __truediv__(a, d): - return Vector3(a.X / d, a.Y / d, a.Z / d) - - def __eq__(lhs, rhs): - if isinstance(rhs, Vector3): - diff = lhs - rhs - return diff.lengthSquared() < kEpsilon * kEpsilon - return False - - def __ne__(lhs, rhs): - return not (lhs == rhs) - - def Vector2(self): - from .Vector2 import Vector2 - return Vector2(self.X, self.Y) - - def Vector4(self): - from .Vector4 import Vector4 - return Vector4(self.X, self.Y, self.Z, 0.0) diff --git a/UnityPy/math/Vector4.py b/UnityPy/math/Vector4.py deleted file mode 100644 index d6e87c8b5..000000000 --- a/UnityPy/math/Vector4.py +++ /dev/null @@ -1,112 +0,0 @@ -from dataclasses import dataclass -from math import sqrt -from typing import Sequence - - -kEpsilon = 0.00001 - - -@dataclass -class Vector4: - '''https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Vector4.cs''' - - X: float = 0.0 - Y: float = 0.0 - Z: float = 0.0 - W: float = 0.0 - - def __init__(self, *args): - if len(args) == 1: - args = args[0] - - if isinstance(args, Sequence): - if len(args) == 4: # args=(x, y, z, w) - self.X, self.Y, self.Z, self.W = args - elif len(args) == 2: # args=(Vector3, w) - self.X, self.Y, self.Z = args[0] - self.W = args[1] - elif len(args) == 0: # args=() - self.X = self.Y = self.Z = self.W = 0.0 - else: - raise TypeError("Invalid argument length for Vector4") - else: - raise TypeError("If only 1 argument passed, it must be a sequence") - - def __getitem__(self, index): - return (self.X, self.Y, self.Z, self.W)[index] - - def __setitem__(self, index, value): - if index == 0: - self.X = value - elif index == 1: - self.Y = value - elif index == 2: - self.Z = value - elif index == 3: - self.W = value - else: - raise IndexError("Index out of range") - - def __hash__(self): - return ( - self.X.__hash__() ^ - (self.Y.__hash__() << 2) ^ - (self.Z.__hash__() >> 2) ^ - (self.W.__hash__() >> 1) - ) - - def normalize(self): - length = self.length() - if length > kEpsilon: - invNorm = 1.0 / length - self.X *= invNorm - self.Y *= invNorm - self.Z *= invNorm - self.W *= invNorm - else: - self.X = self.Y = self.Z = self.W = 0.0 - - Normalize = normalize - - def length(self): - return sqrt(self.lengthSquared()) - - Length = length - - def lengthSquared(self): - return self.X ** 2 + self.Y ** 2 + self.Z ** 2 + self.W ** 2 - - LengthSquared = lengthSquared - - @staticmethod - def Zero(): - return Vector4(0, 0, 0, 0) - - @staticmethod - def One(): - return Vector4(1, 1, 1, 1) - - def __add__(a, b): - return Vector4(a.X + b.X, a.Y + b.Y, a.Z + b.Z, a.W + b.W) - - def __sub__(a, b): - return Vector4(a.X - b.X, a.Y - b.Y, a.Z - b.Z, a.W - b.W) - - def __mul__(a, d): - return Vector4(a.X * d, a.Y * d, a.Z * d, a.W * d) - - def __truediv__(a, d): - return Vector4(a.X / d, a.Y / d, a.Z / d, a.W / d) - - def __eq__(lhs, rhs): - if isinstance(rhs, Vector4): - diff = lhs - rhs - return diff.lengthSquared() < kEpsilon * kEpsilon - return False - - def __ne__(lhs, rhs): - return not (lhs == rhs) - - def Vector3(self): - from .Vector3 import Vector3 - return Vector3(self.X, self.Y, self.Z) diff --git a/UnityPy/math/__init__.py b/UnityPy/math/__init__.py deleted file mode 100644 index 6f6e76938..000000000 --- a/UnityPy/math/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .Color import Color -from .Vector2 import Vector2 -from .Vector3 import Vector3 -from .Vector4 import Vector4 -from .Matrix4x4 import Matrix4x4 -from .Quaternion import Quaternion -from .Rectangle import Rectangle diff --git a/UnityPy/resources/lzma.tpk b/UnityPy/resources/lzma.tpk new file mode 100644 index 000000000..26e074496 --- /dev/null +++ b/UnityPy/resources/lzma.tpk @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b2277765f0f7a6253df04426abd83d2bf37f8d1ad30542cddd2d81ae484741b +size 207798 diff --git a/UnityPy/resources/uncompressed.tpk b/UnityPy/resources/uncompressed.tpk deleted file mode 100644 index e939fa13c..000000000 Binary files a/UnityPy/resources/uncompressed.tpk and /dev/null differ diff --git a/UnityPy/streams/EndianBinaryReader.py b/UnityPy/streams/EndianBinaryReader.py index 8cfeea9af..968b32d89 100644 --- a/UnityPy/streams/EndianBinaryReader.py +++ b/UnityPy/streams/EndianBinaryReader.py @@ -1,93 +1,92 @@ -import sys -import re -from struct import Struct, unpack -from io import IOBase, BufferedReader +from __future__ import annotations import builtins -from typing import Callable, List, Optional, Tuple, Union +import re +import sys +from io import BufferedReader, IOBase +from struct import Struct, unpack +from types import MethodType +from typing import Any, Callable, ClassVar, Dict, List, Literal, Optional, Tuple, Union reNot0 = re.compile(b"(.*?)\x00", re.S) SYS_ENDIAN = "<" if sys.byteorder == "little" else ">" - -from ..math import Color, Matrix4x4, Quaternion, Vector2, Vector3, Vector4, Rectangle +Endianess = Literal["<", ">"] # generate unpack and unpack_from functions TYPE_PARAM_SIZE_LIST = [ - ("short", "h", 2), - ("u_short", "H", 2), - ("int", "i", 4), - ("u_int", "I", 4), - ("long", "q", 8), - ("u_long", "Q", 8), - ("half", "e", 2), - ("float", "f", 4), - ("double", "d", 8), - ("vector2", "2f", 8), - ("vector3", "3f", 12), - ("vector4", "4f", 16), + ("short", "h"), + ("u_short", "H"), + ("int", "i"), + ("u_int", "I"), + ("long", "q"), + ("u_long", "Q"), + ("half", "e"), + ("float", "f"), + ("double", "d"), ] -LOCALS = locals() -for endian_s, endian_l in (("<", "little"), (">", "big")): - for typ, param, _ in TYPE_PARAM_SIZE_LIST: - LOCALS[f"unpack_{endian_l}_{typ}"] = Struct(f"{endian_s}{param}").unpack - LOCALS[f"unpack_{endian_l}_{typ}_from"] = Struct( - f"{endian_s}{param}" - ).unpack_from +MEMORY_FUNCTIONS: Dict[Endianess, Dict[str, Callable[["EndianBinaryReader_Memoryview"], Any]]] = {"<": {}, ">": {}} +STREAM_FUNCTIONS: Dict[Endianess, Dict[str, Callable[["EndianBinaryReader_Streamable"], Any]]] = {"<": {}, ">": {}} class EndianBinaryReader: - endian: str Length: int Position: int BaseOffset: int + _endian: Endianess + _function_map: ClassVar[Dict[Endianess, Dict[str, Callable]]] def __new__( cls, item: Union[bytes, bytearray, memoryview, IOBase, str], - endian: str = ">", + endian: Endianess = ">", offset: int = 0, ): if isinstance(item, (bytes, bytearray, memoryview)): - obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Memoryview) + obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Memoryview) # type: ignore elif isinstance(item, IOBase): - obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Streamable) + obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Streamable) # type: ignore elif isinstance(item, str): - item = open(item, "rb") - obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Streamable) + obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Streamable_LocalFile) # type: ignore elif isinstance(item, EndianBinaryReader): - item = ( - item.stream - if isinstance(item, EndianBinaryReader_Streamable) - else item.view - ) + item = item.stream if isinstance(item, EndianBinaryReader_Streamable) else item.view return EndianBinaryReader(item, endian, offset) elif hasattr(item, "read"): if hasattr(item, "seek") and hasattr(item, "tell"): - obj = super(EndianBinaryReader, cls).__new__( - EndianBinaryReader_Streamable - ) + obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Streamable) else: item = item.read() - obj = super(EndianBinaryReader, cls).__new__( - EndianBinaryReader_Memoryview - ) - - obj.__init__(item, endian) + obj = super(EndianBinaryReader, cls).__new__(EndianBinaryReader_Memoryview) + else: + raise TypeError("Unsupported type for EndianBinaryReader: %s" % type(item)) return obj - def __init__(self, item, endian: str = ">", offset: int = 0): + def __init__(self, item, endian: Endianess = ">", offset: int = 0): + self._endian = "" # type: ignore self.endian = endian self.BaseOffset = offset self.Position = 0 + @property + def endian(self) -> Endianess: + return self._endian + + @endian.setter + def endian(self, value: Endianess): + if value not in ("<", ">"): + raise ValueError("Invalid endian") + if value != self._endian: + for func_name, func in self._function_map[value].items(): + setattr(self, func_name, MethodType(func, self)) + self._endian = value + @property def bytes(self) -> builtins.bytes: # implemented by Streamable and Memoryview versions return b"" - def read(self, *args) -> builtins.bytes: + def read(self, size: Optional[int] = -1, /) -> builtins.bytes: # implemented by Streamable and Memoryview versions return b"" @@ -97,7 +96,7 @@ def read_byte(self) -> int: def read_u_byte(self) -> int: return unpack(self.endian + "B", self.read(1))[0] - def read_bytes(self, num) -> builtins.bytes: + def read_bytes(self, num: int) -> builtins.bytes: return self.read(num) def read_short(self) -> int: @@ -127,17 +126,14 @@ def read_double(self) -> float: def read_boolean(self) -> bool: return bool(unpack(self.endian + "?", self.read(1))[0]) - def read_string(self, size=None, encoding="utf8") -> str: + def read_string(self, size: Optional[int] = None) -> str: if size is None: - ret = self.read_string_to_null() + return self.read_string_to_null() else: - ret = unpack(f"{self.endian}{size}is", self.read(size))[0] - try: - return ret.decode(encoding) - except UnicodeDecodeError: - return ret + raw = self.read_bytes(size) + return raw.decode("utf8", "surrogateescape") - def read_string_to_null(self, max_length=32767) -> str: + def read_string_to_null(self, max_length: int = 32767) -> str: ret = [] c = b"" while c != b"\0" and len(ret) < max_length and self.Position != self.Length: @@ -159,46 +155,9 @@ def read_aligned_string(self) -> str: def align_stream(self, alignment=4): self.Position += (alignment - self.Position % alignment) % alignment - def read_quaternion(self) -> Quaternion: - return Quaternion( - self.read_float(), self.read_float(), self.read_float(), self.read_float() - ) - - def read_vector2(self) -> Vector2: - return Vector2(self.read_float(), self.read_float()) - - def read_vector3(self) -> Vector3: - return Vector3(self.read_float(), self.read_float(), self.read_float()) - - def read_vector4(self) -> Vector4: - return Vector4( - self.read_float(), self.read_float(), self.read_float(), self.read_float() - ) - - def read_rectangle_f(self) -> Rectangle: - return Rectangle( - self.read_float(), self.read_float(), self.read_float(), self.read_float() - ) - - def read_color_uint(self): - r = self.read_u_byte() - g = self.read_u_byte() - b = self.read_u_byte() - a = self.read_u_byte() - - return Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0) - - def read_color4(self) -> Color: - return Color( - self.read_float(), self.read_float(), self.read_float(), self.read_float() - ) - def read_byte_array(self) -> builtins.bytes: return self.read(self.read_int()) - def read_matrix(self) -> Matrix4x4: - return Matrix4x4(self.read_float_array(16)) - def read_array(self, command: Callable, length: int) -> list: return [command() for _ in range(length)] @@ -208,53 +167,39 @@ def read_array_struct(self, param: str, length: Optional[int] = None) -> tuple: struct = Struct(f"{self.endian}{length}{param}") return struct.unpack(self.read(struct.size)) - def read_boolean_array(self, length: Optional[int] = None) -> Tuple[bool]: + def read_boolean_array(self, length: Optional[int] = None) -> Tuple[bool, ...]: return self.read_array_struct("?", length) - def read_u_byte_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_u_byte_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("B", length) - def read_u_short_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_u_short_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("h", length) - def read_short_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_short_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("H", length) - def read_int_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_int_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("i", length) - def read_u_int_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_u_int_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("I", length) - def read_long_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_long_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("q", length) - def read_u_long_array(self, length: Optional[int] = None) -> Tuple[int]: + def read_u_long_array(self, length: Optional[int] = None) -> Tuple[int, ...]: return self.read_array_struct("Q", length) - def read_u_int_array_array(self, length: Optional[int] = None) -> List[Tuple[int]]: - return self.read_array( - self.read_u_int_array, length if length is not None else self.read_int() - ) - - def read_float_array(self, length: Optional[int] = None) -> Tuple[float]: + def read_float_array(self, length: Optional[int] = None) -> Tuple[float, ...]: return self.read_array_struct("f", length) - def read_double_array(self, length: Optional[int] = None) -> Tuple[float]: + def read_double_array(self, length: Optional[int] = None) -> Tuple[float, ...]: return self.read_array_struct("d", length) def read_string_array(self) -> List[str]: return self.read_array(self.read_aligned_string, self.read_int()) - def read_vector2_array(self) -> List[Vector2]: - return self.read_array(self.read_vector2, self.read_int()) - - def read_vector4_array(self) -> List[Vector4]: - return self.read_array(self.read_vector4, self.read_int()) - - def read_matrix_array(self) -> List[Matrix4x4]: - return self.read_array(self.read_matrix, self.read_int()) - def real_offset(self) -> int: """Returns offset in the underlying file. (Not working with unpacked streams.) @@ -265,48 +210,58 @@ def read_the_rest(self, obj_start: int, obj_size: int) -> builtins.bytes: """Returns the rest of the current reader bytes.""" return self.read_bytes(obj_size - (self.Position - obj_start)) + def seek(self, offset: int, whence: int = 0) -> int: + if whence == 0: + new_pos = offset + elif whence == 1: + new_pos = self.Position + offset + elif whence == 2: + new_pos = self.Length + offset + else: + raise ValueError("Invalid whence value") + if new_pos < 0: + raise ValueError("New position is before the start of the stream") + self.Position = new_pos + return self.Position + + def tell(self) -> int: + return self.Position + class EndianBinaryReader_Memoryview(EndianBinaryReader): __slots__ = ("view", "_endian", "BaseOffset", "Position", "Length") + _endian: Endianess view: memoryview + _function_map = MEMORY_FUNCTIONS - def __init__(self, view, endian: str = ">", offset: int = 0): - self._endian = "" + def __init__(self, view, endian: Endianess = ">", offset: int = 0): super().__init__(view, endian=endian, offset=offset) self.view = memoryview(view) self.Length = len(view) @property - def endian(self): - return self._endian - - @endian.setter - def endian(self, value: str): - if value not in ("<", ">"): - raise ValueError("Invalid endian") - if value != self._endian: - setattr( - self, - "__class__", - EndianBinaryReader_Memoryview_LittleEndian - if value == "<" - else EndianBinaryReader_Memoryview_BigEndian, - ) - self._endian = value - - @property - def bytes(self) -> memoryview: - return self.view + def bytes(self): + return self.view.tobytes() def dispose(self) -> None: self.view.release() - def read(self, length: int) -> memoryview: - if not length: - return memoryview(b"") - ret = self.view[self.Position : self.Position + length] - self.Position += length - return ret + def read(self, size: Optional[int] = -1, /): + if not size: + return b"" + if size == -1: + size = self.Length - self.Position + ret = self.view[self.Position : self.Position + size] + self.Position += size + return ret.tobytes() + + def read_array_struct(self, param: str, length: Optional[int] = None) -> tuple: + if length is None: + length = self.read_int() + struct = Struct(f"{self.endian}{length}{param}") + value = struct.unpack_from(self.view, self.Position) + self.Position += struct.size + return value def read_aligned_string(self) -> str: length = self.read_int() @@ -323,187 +278,45 @@ def read_string_to_null(self, max_length: int = 32767) -> str: if self.Position + max_length >= self.Length: raise Exception("String not terminated") else: - return bytes(self.read_bytes(max_length)).decode( - "utf8", "surrogateescape" - ) + return bytes(self.read_bytes(max_length)).decode("utf8", "surrogateescape") ret = match[1].decode("utf8", "surrogateescape") self.Position = match.end() return ret -class EndianBinaryReader_Memoryview_LittleEndian(EndianBinaryReader_Memoryview): - def read_u_short(self): - (ret,) = unpack_little_u_short_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_short(self): - (ret,) = unpack_little_short_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_int(self): - (ret,) = unpack_little_int_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_u_int(self): - (ret,) = unpack_little_u_int_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_long(self): - (ret,) = unpack_little_long_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_u_long(self): - (ret,) = unpack_little_u_long_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_half(self): - (ret,) = unpack_little_half_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_float(self): - (ret,) = unpack_little_float_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_double(self): - (ret,) = unpack_little_double_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_vector2(self): - (x, y) = unpack_little_vector2_from(self.view, self.Position) - self.Position += 8 - return Vector2(x, y) - - def read_vector3(self): - (x, y, z) = unpack_little_vector3_from(self.view, self.Position) - self.Position += 12 - return Vector3(x, y, z) - - def read_vector4(self): - (x, y, z, w) = unpack_little_vector4_from(self.view, self.Position) - self.Position += 16 - return Vector4(x, y, z, w) - - -class EndianBinaryReader_Memoryview_BigEndian(EndianBinaryReader_Memoryview): - def read_u_short(self): - (ret,) = unpack_big_u_short_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_short(self): - (ret,) = unpack_big_short_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_int(self): - (ret,) = unpack_big_int_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_u_int(self): - (ret,) = unpack_big_u_int_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_long(self): - (ret,) = unpack_big_long_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_u_long(self): - (ret,) = unpack_big_u_long_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_half(self): - (ret,) = unpack_big_half_from(self.view, self.Position) - self.Position += 2 - return ret - - def read_float(self): - (ret,) = unpack_big_float_from(self.view, self.Position) - self.Position += 4 - return ret - - def read_double(self): - (ret,) = unpack_big_double_from(self.view, self.Position) - self.Position += 8 - return ret - - def read_vector2(self): - (x, y) = unpack_big_vector2_from(self.view, self.Position) - self.Position += 8 - return Vector2(x, y) - - def read_vector3(self): - (x, y, z) = unpack_big_vector3_from(self.view, self.Position) - self.Position += 12 - return Vector3(x, y, z) - - def read_vector4(self): - (x, y, z, w) = unpack_big_vector4_from(self.view, self.Position) - self.Position += 16 - return Vector4(x, y, z, w) - - class EndianBinaryReader_Streamable(EndianBinaryReader): __slots__ = ("stream", "_endian", "BaseOffset") stream: BufferedReader + _function_map = STREAM_FUNCTIONS - def __init__(self, stream, endian=">", offset=0): - self._endian = "" + def __init__(self, stream: BufferedReader, endian: Endianess = ">", offset: int = 0): self.stream = stream super().__init__(stream, endian=endian, offset=offset) self.read = self.stream.read - def get_position(self): - return self.stream.tell() - - def set_position(self, value): - self.stream.seek(value + self.BaseOffset) - @property - def endian(self): - return self._endian + def Position(self) -> int: + return self.stream.tell() - self.BaseOffset - @endian.setter - def endian(self, value): - if value not in ("<", ">"): - raise ValueError("Invalid endian") - if value != self._endian: - setattr( - self, - "__class__", - EndianBinaryReader_Streamable_LittleEndian - if value == "<" - else EndianBinaryReader_Streamable_BigEndian, - ) - self._endian = value + @Position.setter + def Position(self, value: int): + if value < 0: + raise ValueError("Position cannot be negative") + self.stream.seek(value + self.BaseOffset) @property - def Length(self): + def Length(self): # type: ignore pos = self.Position length = self.stream.seek(0, 2) - self.BaseOffset self.Position = pos return length - Position = property(get_position, set_position) - @property def bytes(self): last_pos = self.Position self.Position = 0 ret = self.read(self.Length) - self.Position = last_pos + self.Position = last_pos # type: ignore return ret def dispose(self): @@ -511,77 +324,26 @@ def dispose(self): pass -class EndianBinaryReader_Streamable_LittleEndian(EndianBinaryReader_Streamable): - def read_u_short(self): - return unpack_little_u_short(self.read(2))[0] - - def read_short(self): - return unpack_little_short(self.read(2))[0] - - def read_int(self): - return unpack_little_int(self.read(4))[0] - - def read_u_int(self): - return unpack_little_u_int(self.read(4))[0] - - def read_long(self): - return unpack_little_long(self.read(8))[0] +class EndianBinaryReader_Streamable_LocalFile(EndianBinaryReader_Streamable): + def __init__(self, path: str, endian: Endianess = ">", offset: int = 0): + super().__init__(open(path, "rb"), endian=endian, offset=offset) - def read_u_long(self): - return unpack_little_u_long(self.read(8))[0] - - def read_half(self): - return unpack_little_half(self.read(2))[0] - - def read_float(self): - return unpack_little_float(self.read(4))[0] - - def read_double(self): - return unpack_little_double(self.read(8))[0] - - def read_vector2(self): - return Vector2(*unpack_little_vector2(self.read(8))) - - def read_vector3(self): - return Vector3(*unpack_little_vector3(self.read(12))) - - def read_vector4(self): - return Vector4(*unpack_little_vector4(self.read(16))) - - -class EndianBinaryReader_Streamable_BigEndian(EndianBinaryReader_Streamable): - def read_u_short(self): - return unpack_big_u_short(self.read(2))[0] - - def read_short(self): - return unpack_big_short(self.read(2))[0] - - def read_int(self): - return unpack_big_int(self.read(4))[0] - - def read_u_int(self): - return unpack_big_u_int(self.read(4))[0] - - def read_long(self): - return unpack_big_long(self.read(8))[0] - - def read_u_long(self): - return unpack_big_u_long(self.read(8))[0] - - def read_half(self): - return unpack_big_half(self.read(2))[0] + def __del__(self): + self.stream.close() - def read_float(self): - return unpack_big_float(self.read(4))[0] - def read_double(self): - return unpack_big_double(self.read(8))[0] +for endian_s in ("<", ">"): + for reader_type_name, struct_type_char in TYPE_PARAM_SIZE_LIST: + func_name = f"read_{reader_type_name}" + struct = Struct(f"{endian_s}{struct_type_char}") - def read_vector2(self): - return Vector2(*unpack_big_vector2(self.read(8))) + def memory_read_func(self: EndianBinaryReader_Memoryview, /, struct=struct): + value = struct.unpack_from(self.view, self.Position)[0] + self.Position += struct.size + return value - def read_vector3(self): - return Vector3(*unpack_big_vector3(self.read(12))) + def stream_read_func(self: EndianBinaryReader_Streamable, /, struct=struct): + return struct.unpack(self.stream.read(struct.size))[0] - def read_vector4(self): - return Vector4(*unpack_big_vector4(self.read(16))) + MEMORY_FUNCTIONS[endian_s][func_name] = memory_read_func + STREAM_FUNCTIONS[endian_s][func_name] = stream_read_func diff --git a/UnityPy/streams/EndianBinaryWriter.py b/UnityPy/streams/EndianBinaryWriter.py index 0f2ea8cc3..1473c871b 100644 --- a/UnityPy/streams/EndianBinaryWriter.py +++ b/UnityPy/streams/EndianBinaryWriter.py @@ -1,10 +1,9 @@ -from struct import pack -from io import BytesIO, IOBase - import builtins -from typing import Callable, Union +from io import BytesIO, IOBase +from struct import pack +from typing import Callable, Sequence, TypeVar, Union -from ..math import Color, Matrix4x4, Quaternion, Vector2, Vector3, Vector4, Rectangle +T = TypeVar("T") class EndianBinaryWriter: @@ -12,11 +11,7 @@ class EndianBinaryWriter: Position: int stream: IOBase - def __init__( - self, - input_: Union[bytes, bytearray, IOBase] = b"", - endian: str = ">" - ): + def __init__(self, input_: Union[bytes, bytearray, IOBase] = b"", endian: str = ">"): if isinstance(input_, (bytes, bytearray)): self.stream = BytesIO(input_) self.stream.seek(0, 2) @@ -36,9 +31,9 @@ def bytes(self): def Length(self) -> int: pos = self.stream.tell() self.stream.seek(0, 2) - l = self.stream.tell() + length = self.stream.tell() self.stream.seek(pos) - return l + return length def dispose(self): self.stream.close() @@ -96,55 +91,17 @@ def write_aligned_string(self, value: str): self.write(bstring) self.align_stream(4) - def align_stream(self, alignment:int = 4): + def align_stream(self, alignment: int = 4): pos = self.stream.tell() align = (alignment - pos % alignment) % alignment self.write(b"\0" * align) - def write_quaternion(self, value: Quaternion): - self.write_float(value.X) - self.write_float(value.Y) - self.write_float(value.Z) - self.write_float(value.W) - - def write_vector2(self, value: Vector2): - self.write_float(value.X) - self.write_float(value.Y) - - def write_vector3(self, value: Vector3): - self.write_float(value.X) - self.write_float(value.Y) - self.write_float(value.Z) - - def write_vector4(self, value: Vector4): - self.write_float(value.X) - self.write_float(value.Y) - self.write_float(value.Z) - self.write_float(value.W) - - def write_rectangle_f(self, value: Rectangle): - self.write_float(value.x) - self.write_float(value.y) - self.write_float(value.width) - self.write_float(value.height) - - def write_color_uint(self, value: Color): - self.write_u_byte(int(value.R * 255)) - self.write_u_byte(int(value.G * 255)) - self.write_u_byte(int(value.B * 255)) - self.write_u_byte(int(value.A * 255)) - - def write_color4(self, value: Color): - self.write_float(value.R) - self.write_float(value.G) - self.write_float(value.B) - self.write_float(value.A) - - def write_matrix(self, value: Matrix4x4): - for val in value.M: - self.write_float(val) - - def write_array(self, command: Callable, value: list, write_length: bool = True): + def write_array( + self, + command: Callable[[T], None], + value: Sequence[T], + write_length: bool = True, + ): if write_length: self.write_int(len(value)) for val in value: @@ -154,29 +111,20 @@ def write_byte_array(self, value: builtins.bytes): self.write_int(len(value)) self.write(value) - def write_boolean_array(self, value: list): + def write_boolean_array(self, value: Sequence[bool]): self.write_array(self.write_boolean, value) - def write_u_short_array(self, value: list): + def write_u_short_array(self, value: Sequence[int]): self.write_array(self.write_u_short, value) - def write_int_array(self, value: list, write_length: bool = False): + def write_int_array(self, value: Sequence[int], write_length: bool = False): return self.write_array(self.write_int, value, write_length) - def write_u_int_array(self, value: list, write_length: bool = False): + def write_u_int_array(self, value: Sequence[int], write_length: bool = False): return self.write_array(self.write_u_int, value, write_length) - def write_float_array(self, value: list, write_length: bool = False): + def write_float_array(self, value: Sequence[float], write_length: bool = False): return self.write_array(self.write_float, value, write_length) - def write_string_array(self, value: list): + def write_string_array(self, value: Sequence[str]): self.write_array(self.write_aligned_string, value) - - def write_vector2_array(self, value: list): - self.write_array(self.write_vector2, value) - - def write_vector4_array(self, value: list): - self.write_array(self.write_vector4, value) - - def write_matrix_array(self, value: list): - self.write_array(self.write_matrix, value) diff --git a/UnityPy/streams/__init__.py b/UnityPy/streams/__init__.py index 0b713c1ef..987543d53 100644 --- a/UnityPy/streams/__init__.py +++ b/UnityPy/streams/__init__.py @@ -1,2 +1,7 @@ from .EndianBinaryReader import EndianBinaryReader from .EndianBinaryWriter import EndianBinaryWriter + +__all__ = [ + "EndianBinaryReader", + "EndianBinaryWriter", +] diff --git a/generators/ClassesGenerator.py b/UnityPy/tools/TpkClassGenerator.py similarity index 79% rename from generators/ClassesGenerator.py rename to UnityPy/tools/TpkClassGenerator.py index b1c6cf0ad..2536644e8 100644 --- a/generators/ClassesGenerator.py +++ b/UnityPy/tools/TpkClassGenerator.py @@ -1,22 +1,23 @@ """Generates the classes for the UnityPy objects from the TypeTree of the TPK files.""" from __future__ import annotations -from dataclasses import dataclass, field + import os import sys -from typing import Dict, Set, Optional, Tuple, List +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Set, Tuple -# small hack to import UnityPy from the parent directory instead of the installed package +# import UnityPy from the parent directory instead of the installed package ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(ROOT) -from UnityPy.helpers.Tpk import TPKTYPETREE, TpkUnityNode # noqa: E402 +from UnityPy.helpers.Tpk import TpkUnityNode, get_typetree # noqa: E402 from UnityPy.helpers.TypeTreeNode import clean_name # noqa: E402 -NODES = TPKTYPETREE.NodeBuffer.Nodes -STRINGS = TPKTYPETREE.StringBuffer.Strings +NODES = get_typetree().NodeBuffer +STRINGS = get_typetree().StringBuffer BASE_TYPE_MAP = { - "char": "str", + "char": "int", # used for byte data "short": "int", "int": "int", "long long": "int", @@ -50,15 +51,15 @@ from attrs import define as attrs_define from .math import ( - ColorRGBA, - Matrix3x4f, - Matrix4x4f, - Quaternionf, - Vector2f, - Vector3f, - Vector4f, - float3, - float4, + ColorRGBA, + Matrix3x4f, + Matrix4x4f, + Quaternionf, + Vector2f, + Vector3f, + Vector4f, + float3, + float4, ) from .Object import Object from .PPtr import PPtr @@ -67,25 +68,25 @@ def unitypy_define(cls: T) -> T: - \"\"\" - A hacky solution to bypass multiple problems related to attrs and inheritance. - - The class inheritance is very lax and based on the typetrees. - Some of the child classes might not have the same attributes as the parent class, - which would make type-hinting more tricky, and breaks attrs.define. - - Therefore this function bypasses the issue - by redifining the bases for problematic classes for the attrs.define call. - \"\"\" - bases = cls.__bases__ - if bases[0] in (object, Object, ABC): - cls = attrs_define(cls, slots=True, unsafe_hash=True) - else: - cls.__bases__ = (Object,) - cls = attrs_define(cls, slots=False, unsafe_hash=True) - cls.__bases__ = bases - return cls -"""[0:] + \"\"\" + A hacky solution to bypass multiple problems related to attrs and inheritance. + + The class inheritance is very lax and based on the typetrees. + Some of the child classes might not have the same attributes as the parent class, + which would make type-hinting more tricky, and breaks attrs.define. + + Therefore this function bypasses the issue + by redefining the bases for problematic classes for the attrs.define call. + \"\"\" + bases = cls.__bases__ + if bases[0] in (object, Object, ABC): + cls = attrs_define(cls, slots=True, unsafe_hash=True) + else: + cls.__bases__ = (Object,) + cls = attrs_define(cls, slots=False, unsafe_hash=True) + cls.__bases__ = bases + return cls +"""[1:] # LIST_BASE_TYPE_MAP = { # "short": "np.int16", @@ -139,12 +140,12 @@ def generate_str(self) -> str: if len(self.types) == 1: typ = next(iter(self.types)) else: - typ = f"Union[{', '.join(self.types)}]" + typ = f"Union[{', '.join(sorted(self.types))}]" if self.optional: - return f" {self.clean_name}: Optional[{typ}] = None" + return f" {self.clean_name}: Optional[{typ}] = None" else: - return f" {self.clean_name}: {typ}" + return f" {self.clean_name}: {typ}" @property def clean_name(self) -> str: @@ -179,7 +180,7 @@ def generate_str(self) -> str: parentsString = f"({', '.join(parents)})" if parents else "" if len(self.fields) == 0: - field_strings = [" pass"] + field_strings = [" pass"] else: field_strings = map( NodeClassField.generate_str, @@ -305,16 +306,16 @@ def generate_field_type(node_id: int, node: Optional[TpkUnityNode] = None) -> st return res -def main(): +def generate_classes(): main_classes: Set[str] = set() deps: Dict[str, List[str]] = {} - for _class_id, class_info in TPKTYPETREE.ClassInformation.items(): + for _class_id, class_info in get_typetree().ClassInformation.items(): abstract = True base = None cls_name: Optional[str] = None - for _version, unity_class in class_info.Classes: + for _version, unity_class in class_info: if unity_class is None: continue cls_name = STRINGS[unity_class.Name] @@ -322,16 +323,12 @@ def main(): if unity_class.ReleaseRootNode is not None: abstract = False - cls = implement_node_class( - unity_class.ReleaseRootNode, override_name=cls_name - ) + cls = implement_node_class(unity_class.ReleaseRootNode, override_name=cls_name) cls.base = base if isinstance(cls_name, str): if abstract: - CLASS_CACHE_NAME[cls_name] = NodeClass( - {0}, name=cls_name, base=base, abstract=True - ) + CLASS_CACHE_NAME[cls_name] = NodeClass({0}, name=cls_name, base=base, abstract=True) main_classes.add(cls_name) if base: @@ -350,9 +347,7 @@ def main(): if cls_name in deps: stack = sorted(deps.pop(cls_name)) + stack - sorted_classes += sorted( - set(CLASS_CACHE_NAME.keys()) - set(sorted_classes) - FORBIDDEN_CLASSES - ) + sorted_classes += sorted(set(CLASS_CACHE_NAME.keys()) - set(sorted_classes) - FORBIDDEN_CLASSES) i = 0 names = set() while i < len(sorted_classes): @@ -363,17 +358,12 @@ def main(): names.add(name) i += 1 - fp = os.path.join(ROOT, "UnityPy", "classes", "generated.py") - with open(fp, "wt", encoding="utf8") as f: + fp = os.path.join(ROOT, "classes", "generated.py") + with open(fp, "w", encoding="utf8") as f: f.write(GENERATED_HEADER) f.write("\n\n") - f.write( - "\n\n".join( - cls.generate_str() - for cls in map(CLASS_CACHE_NAME.__getitem__, sorted_classes) - ) - ) + f.write("\n\n\n".join(cls.generate_str() for cls in map(CLASS_CACHE_NAME.__getitem__, sorted_classes))) f.write("\n") @@ -381,6 +371,6 @@ def main(): import time t1 = time.time_ns() - main() + generate_classes() t2 = time.time_ns() print(t2 - t1 / 10**9) diff --git a/UnityPy/tools/extractor.py b/UnityPy/tools/extractor.py index dc9d58aad..b1f0c8e60 100644 --- a/UnityPy/tools/extractor.py +++ b/UnityPy/tools/extractor.py @@ -2,7 +2,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Callable, Dict, List, Optional, Tuple, Union +from typing import Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Union import UnityPy from UnityPy.classes import ( @@ -19,12 +19,12 @@ Texture2D, ) from UnityPy.enums.ClassIDType import ClassIDType -from UnityPy.files import SerializedFile +from UnityPy.files import ObjectReader, SerializedFile def export_obj( - obj: Union[Object, PPtr], - fp: Path, + obj: Union[ObjectReader, PPtr], + fp: str, append_name: bool = False, append_path_id: bool = False, export_unknown_as_typetree: bool = False, @@ -37,7 +37,8 @@ def export_obj( fp (Path): A valid filepath where the object should be exported to. append_name (bool, optional): Decides if the obj name will be appended to the filepath. Defaults to False. append_path_id (bool, optional): Decides if the obj path id will be appended to the filepath. Defaults to False. - export_unknown_as_typetree (bool, optional): If set, then unimplemented objects will be exported via their typetree or dumped as bin. Defaults to False. + export_unknown_as_typetree (bool, optional): If set, then unimplemented objects will be exported + via their typetree or dumped as bin. Defaults to False. asset_filter (func(Object)->bool, optional): Determines whether to export an object. Defaults to all objects. Returns: @@ -52,22 +53,29 @@ def export_obj( return [] # set filepath - obj = obj.read() + if isinstance(obj, PPtr): + obj = obj.deref() + + instance = obj.parse_as_object() # a filter that returned True during an earlier extract_assets check can return False now with more info from read() - if asset_filter and not asset_filter(obj): + if asset_filter and not asset_filter(instance): return [] if append_name: - fp = os.path.join(fp, obj.m_Name if getattr(obj, "m_Name") else obj.object_reader.type.name) + name = getattr(instance, "m_Name", obj.type.name) + fp = os.path.join( + fp, + name, + ) fp, extension = os.path.splitext(fp) if append_path_id: - fp = f"{fp}_{obj.object_reader.path_id}" + fp = f"{fp}_{obj.m_PathID}" # export - return export_func(obj, fp, extension) + return export_func(instance, fp, extension) def extract_assets( @@ -88,7 +96,8 @@ def extract_assets( ignore_first_container_dirs (int, optional): [description]. Defaults to 0. append_path_id (bool, optional): [description]. Defaults to False. export_unknown_as_typetree (bool, optional): [description]. Defaults to False. - asset_filter (func(object)->bool, optional): Determines whether to export an object. Defaults to all objects. + asset_filter (func(object)->bool, optional): Determines whether to export an object. + Defaults to all objects. Returns: List[Tuple[SerializedFile, int]]: [description] @@ -106,11 +115,10 @@ def defaulted_export_index(type: ClassIDType): return 999 if use_container: - container = sorted( - env.container.items(), key=lambda x: defaulted_export_index(x[1].type) - ) + container = sorted(env.container.items(), key=lambda x: defaulted_export_index(x[1].type)) for obj_path, obj in container: - # The filter here can only access metadata. The same filter may produce a different result later in extract_obj after obj.read() + # The filter here can only access metadata. + # The same filter may produce a different result later in extract_obj after obj.read() if asset_filter is not None and not asset_filter(obj): continue # the check of the various sub directories is required to avoid // in the path @@ -154,7 +162,11 @@ def defaulted_export_index(type: ClassIDType): ############################################################################### -def exportTextAsset(obj: TextAsset, fp: str, extension: str = ".txt") -> List[Tuple[SerializedFile, int]]: +def exportTextAsset( + obj: Union[TextAsset, ObjectReader], fp: str, extension: str = ".txt" +) -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() if not extension: extension = ".txt" with open(f"{fp}{extension}", "wb") as f: @@ -162,7 +174,9 @@ def exportTextAsset(obj: TextAsset, fp: str, extension: str = ".txt") -> List[Tu return [(obj.assets_file, obj.object_reader.path_id)] -def exportFont(obj: Font, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: +def exportFont(obj: Union[Font, ObjectReader], fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() # TODO - export glyphs if obj.m_FontData: extension = ".ttf" @@ -173,7 +187,9 @@ def exportFont(obj: Font, fp: str, extension: str = "") -> List[Tuple[Serialized return [(obj.assets_file, obj.object_reader.path_id)] -def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[Tuple[SerializedFile, int]]: +def exportMesh(obj: Union[Mesh, ObjectReader], fp: str, extension=".obj") -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() if not extension: extension = ".obj" with open(f"{fp}{extension}", "wt", encoding="utf8", newline="") as f: @@ -181,7 +197,9 @@ def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[Tuple[SerializedFil return [(obj.assets_file, obj.object_reader.path_id)] -def exportShader(obj: Shader, fp: str, extension=".txt") -> List[Tuple[SerializedFile, int]]: +def exportShader(obj: Union[Shader, ObjectReader], fp: str, extension=".txt") -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() if not extension: extension = ".txt" with open(f"{fp}{extension}", "wt", encoding="utf8", newline="") as f: @@ -190,43 +208,32 @@ def exportShader(obj: Shader, fp: str, extension=".txt") -> List[Tuple[Serialize def exportMonoBehaviour( - obj: Union[MonoBehaviour, Object], fp: str, extension: str = "" + obj: Union[MonoBehaviour, ObjectReader], fp: str, extension: str = "" ) -> List[Tuple[SerializedFile, int]]: - export = None - - if obj.object_reader.serialized_type.node: - # a typetree is available from the SerializedFile for this object - export = obj.object_reader.read_typetree() - elif isinstance(obj, MonoBehaviour): - # try to get the typetree from the MonoBehavior script - script_ptr = obj.m_Script - if script_ptr: - # looks like we have a script - script = script_ptr.read() - # check if there is a locally stored typetree for it - nodes = MONOBEHAVIOUR_TYPETREES.get(script.m_AssemblyName, {}).get( - script.m_ClassName, None - ) - if nodes: - export = obj.object_reader.read_typetree(nodes) - else: - export = obj.object_reader.read_typetree() + reader = obj.object_reader if isinstance(obj, MonoBehaviour) else obj - if not export: - extension = ".bin" - export = obj.object_reader.raw_data - else: + try: + export = reader.parse_as_dict() extension = ".json" - export = json.dumps(export, indent=4, ensure_ascii=False).encode( - "utf8", errors="surrogateescape" - ) + export = json.dumps(export, indent=4, ensure_ascii=False).encode("utf8", errors="surrogateescape") + except Exception: + extension = ".bin" + export = reader.get_raw_data() with open(f"{fp}{extension}", "wb") as f: f.write(export) - return [(obj.assets_file, obj.object_reader.path_id)] + return [(obj.assets_file, obj.path_id)] -def exportAudioClip(obj: AudioClip, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: - samples = obj.samples +def exportAudioClip( + obj: Union[AudioClip, ObjectReader], fp: str, extension: str = "" +) -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + clip = obj.parse_as_object() + else: + clip = obj + obj = clip.object_reader + + samples = clip.samples if len(samples) == 0: pass elif len(samples) == 1: @@ -237,25 +244,35 @@ def exportAudioClip(obj: AudioClip, fp: str, extension: str = "") -> List[Tuple[ for name, clip_data in samples.items(): with open(os.path.join(fp, f"{name}.wav"), "wb") as f: f.write(clip_data) - return [(obj.assets_file, obj.object_reader.path_id)] + return [(obj.assets_file, obj.path_id)] -def exportSprite(obj: Sprite, fp: str, extension: str = ".png") -> List[Tuple[SerializedFile, int]]: - if not extension: - extension = ".png" - obj.image.save(f"{fp}{extension}") +def exportSprite( + obj: Union[Sprite, ObjectReader], fp: str, extension: str = ".png" +) -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + sprite = obj.parse_as_object() + else: + sprite = obj + obj = sprite.object_reader + + sprite.image.save(f"{fp}{extension}") exported = [ - (obj.assets_file, obj.object_reader.path_id), - (obj.m_RD.texture.assetsfile, obj.m_RD.texture.path_id), + (obj.assets_file, obj.path_id), + (sprite.m_RD.texture.assetsfile, sprite.m_RD.texture.path_id), ] - alpha_assets_file = getattr(obj.m_RD.alphaTexture, "assets_file", None) - alpha_path_id = getattr(obj.m_RD.alphaTexture, "path_id", None) + alpha_assets_file = getattr(sprite.m_RD.alphaTexture, "assets_file", None) + alpha_path_id = getattr(sprite.m_RD.alphaTexture, "path_id", None) if alpha_path_id and alpha_assets_file: exported.append((alpha_assets_file, alpha_path_id)) return exported -def exportTexture2D(obj: Texture2D, fp: str, extension: str = ".png") -> List[Tuple[SerializedFile, int]]: +def exportTexture2D( + obj: Union[Texture2D, ObjectReader], fp: str, extension: str = ".png" +) -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() if not extension: extension = ".png" if obj.m_Width: @@ -263,7 +280,12 @@ def exportTexture2D(obj: Texture2D, fp: str, extension: str = ".png") -> List[Tu obj.image.save(f"{fp}{extension}") return [(obj.assets_file, obj.object_reader.path_id)] -def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: + +def exportGameObject( + obj: Union[GameObject, ObjectReader], fp: str, extension: str = "" +) -> List[Tuple[SerializedFile, int]]: + if isinstance(obj, ObjectReader): + obj = obj.parse_as_object() exported = [(obj.assets_file, obj.object_reader.path_id)] refs = crawl_obj(obj) if refs: @@ -296,46 +318,51 @@ def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[Tupl ClassIDType.Texture2D: exportTexture2D, } -MONOBEHAVIOUR_TYPETREES: Dict["Assembly-Name.dll", Dict["Class-Name", List[Dict]]] = {} +ASSEMBLY_NAME_DLL = str +CLASS_NAME = str +MONOBEHAVIOUR_TYPETREES: Dict[ASSEMBLY_NAME_DLL, Dict[CLASS_NAME, List[Dict]]] = {} -def crawl_obj(obj: Object, ret: Optional[dict] = None) -> Dict[int, Union[Object, PPtr]]: - """Crawls through the data struture of the object and returns a list of all the components.""" + +def crawl_obj(obj: Union[Object, ObjectReader, PPtr], ret: Optional[dict] = None) -> Dict[int, Union[Object, PPtr]]: + """Crawls through the data struture of the object + and returns a list of all the components. + """ if not ret: ret = {} + values: Sequence if isinstance(obj, PPtr): - if obj.path_id == 0 and obj.file_id == 0 and obj.index == -2: + if obj.m_PathID == 0 and obj.m_FileID == 0 and obj.m_Index == -2: return ret try: - obj = obj.read() + instance = obj.deref_parse_as_dict() + values = instance.values() except AttributeError: return ret + elif isinstance(obj, Object): + values = obj.__dict__.values() + elif isinstance(obj, ObjectReader): + values = obj.parse_as_dict().values() else: return ret - ret[obj.path_id] = obj - # MonoBehaviour really on their typetree - # while Object denotes that the class of the object isn't implemented yet - if isinstance(obj, (MonoBehaviour, Object)): - data = obj.read_typetree().__dict__.values() - else: - data = obj.__dict__.values() + ret[obj.m_PathID] = obj - for value in flatten(data): + for value in flatten(values): if isinstance(value, (Object, PPtr)): - if value.path_id in ret: + if value.m_PathID in ret: continue crawl_obj(value, ret) return ret -def flatten(l): - for el in list(l): - if isinstance(el, (list, tuple)): - yield from flatten(el) - elif isinstance(el, dict): - yield from flatten(el.values()) +def flatten(seq: Sequence) -> Iterable: + for elem in list(seq): + if isinstance(elem, (list, tuple)): + yield from flatten(elem) + elif isinstance(elem, dict): + yield from flatten(elem.values()) # type: ignore else: - yield el + yield elem diff --git a/UnityPy/tools/libil2cpp_helper/__init__.py b/UnityPy/tools/libil2cpp_helper/__init__.py deleted file mode 100644 index 3d4cb9311..000000000 --- a/UnityPy/tools/libil2cpp_helper/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .metadata import Metadata \ No newline at end of file diff --git a/UnityPy/tools/libil2cpp_helper/helper.py b/UnityPy/tools/libil2cpp_helper/helper.py deleted file mode 100644 index be3aa96e7..000000000 --- a/UnityPy/tools/libil2cpp_helper/helper.py +++ /dev/null @@ -1,111 +0,0 @@ -from enum import Enum -from io import BytesIO -from struct import pack, unpack -from typing import List, Iterator, Tuple, Union, BinaryIO, get_origin, get_args - -# save original int class -_int = int - - -class CustomIntWrapper(int): - __size: int - __format: str - - @classmethod - def read_from(cls, f: BytesIO): - return cls( - unpack("<" + getattr(cls, "__format"), f.read(getattr(cls, "__size")))[0] - ) - - -def CustomIntWrapperFactory(name: str, __size: int, __format: str) -> CustomIntWrapper: - return type(name, (CustomIntWrapper,), {"__size": __size, "__format": __format}) - - -byte = CustomIntWrapperFactory("byte", 1, "B") -short = CustomIntWrapperFactory("short", 2, "h") -ushort = CustomIntWrapperFactory("ushort", 2, "H") -int = CustomIntWrapperFactory("int", 4, "i") -uint = CustomIntWrapperFactory("uint", 4, "I") -long = CustomIntWrapperFactory("long", 8, "q") -ulong = CustomIntWrapperFactory("ulong", 8, "Q") - - -class Version: - Min: float - Max: float - - def __new__(cls, Min: float = 0, Max: float = 99): - spec = [] - if Min: - spec.append(f"Min={Min}") - if Max != 99: - spec.append(f"Max={Max}") - newclass = type( - f"Version ({', '.join(spec)})", (Version,), {"Min": Min, "Max": Max} - ) - return newclass - - @classmethod - def check_compatiblity(cls, version): - return cls.Min <= version <= cls.Max - - -class MetaDataClass: - version: float - size: int - parseString: str - - def __init__(self, reader: BinaryIO = None) -> None: - if not (self.version): - raise NotImplementedError( - "Using an unversioned MetaDataClass isn't possible." - ) - if reader: - self.read_from(reader) - - def read_from(self, reader: BytesIO): - self.__dict__.update( - zip( - self.__annotations__.keys(), - unpack(self.parseString, reader.read(self.size)), - ) - ) - - def write_to(self, writer: BytesIO): - writer.write( - pack( - "<" + self.parseString, - (self.get(key) for key in self.__annotations__.keys()), - ) - ) - - @classmethod - def generate_versioned_subclass(cls, version: float): - # fetch fields & calculate size - compatible_fields = {} - size = 0 - parseString = [] - for key, clz in cls.__annotations__.items(): - if get_origin(clz) == Union: - clz, *version_checks = get_args(clz) - if not any( - version_check.check_compatiblity(version) - for version_check in version_checks - ): - continue - compatible_fields[key] = clz - size += getattr(clz, "__size") - parseString.append(getattr(clz, "__format")) - - newclass = type( - f"{cls.__name__} - V{version:.1f}", - (MetaDataClass,), - { - "__annotations__": compatible_fields, - "size": size, - "version": version, - "parseString": "".join(parseString), - }, - ) - return newclass diff --git a/UnityPy/tools/libil2cpp_helper/il2cpp.py b/UnityPy/tools/libil2cpp_helper/il2cpp.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/UnityPy/tools/libil2cpp_helper/il2cpp_class.py b/UnityPy/tools/libil2cpp_helper/il2cpp_class.py deleted file mode 100644 index 64e30063f..000000000 --- a/UnityPy/tools/libil2cpp_helper/il2cpp_class.py +++ /dev/null @@ -1,230 +0,0 @@ -from .helper import * - - -class Il2CppCodeRegistration(MetaDataClass): - methodPointersCount: Union[long, Version(Max=24.1)] - methodPointers: Union[ulong, Version(Max=24.1)] - delegateWrappersFromNativeToManagedCount: Union[ulong, Version(Max=21)] - delegateWrappersFromNativeToManaged: Union[ - ulong, Version(Max=21) - ] # note the double indirection to handle different calling conventions - reversePInvokeWrapperCount: Union[long, Version(Min=22)] - reversePInvokeWrappers: Union[ulong, Version(Min=22)] - delegateWrappersFromManagedToNativeCount: Union[ulong, Version(Max=22)] - delegateWrappersFromManagedToNative: Union[ulong, Version(Max=22)] - marshalingFunctionsCount: Union[ulong, Version(Max=22)] - marshalingFunctions: Union[ulong, Version(Max=22)] - ccwMarshalingFunctionsCount: Union[ulong, Version(Min=21, Max=22)] - ccwMarshalingFunctions: Union[ulong, Version(Min=21, Max=22)] - genericMethodPointersCount: long - genericMethodPointers: ulong - genericAdjustorThunks: Union[ulong, Version(Min=24.4, Max=24.4), Version(Min=27.1)] - invokerPointersCount: long - invokerPointers: ulong - customAttributeCount: Union[long, Version(Max=24.4)] - customAttributeGenerators: Union[ulong, Version(Max=24.4)] - guidCount: Union[long, Version(Min=21, Max=22)] - guids: Union[ulong, Version(Min=21, Max=22)] # Il2CppGuid - unresolvedVirtualCallCount: Union[long, Version(Min=22)] - unresolvedVirtualCallPointers: Union[ulong, Version(Min=22)] - interopDataCount: Union[ulong, Version(Min=23)] - interopData: Union[ulong, Version(Min=23)] - windowsRuntimeFactoryCount: Union[ulong, Version(Min=24.3)] - windowsRuntimeFactoryTable: Union[ulong, Version(Min=24.3)] - codeGenModulesCount: Union[long, Version(Min=24.2)] - codeGenModules: Union[ulong, Version(Min=24.2)] - - -class Il2CppMetadataRegistration(MetaDataClass): - genericClassesCount: long - genericClasses: ulong - genericInstsCount: long - genericInsts: ulong - genericMethodTableCount: long - genericMethodTable: ulong - typesCount: long - types: ulong - methodSpecsCount: long - methodSpecs: ulong - methodReferencesCount: Union[long, Version(Max=16)] - methodReferences: Union[ulong, Version(Max=16)] - - fieldOffsetsCount: long - fieldOffsets: ulong - - typeDefinitionsSizesCount: long - typeDefinitionsSizes: ulong - metadataUsagesCount: Union[ulong, Version(Min=19)] - metadataUsages: Union[ulong, Version(Min=19)] - - -class Il2CppTypeEnum(uint, Enum): - IL2CPP_TYPE_END = 0x00 # End of List - IL2CPP_TYPE_VOID = 0x01 - IL2CPP_TYPE_BOOLEAN = 0x02 - IL2CPP_TYPE_CHAR = 0x03 - IL2CPP_TYPE_I1 = 0x04 - IL2CPP_TYPE_U1 = 0x05 - IL2CPP_TYPE_I2 = 0x06 - IL2CPP_TYPE_U2 = 0x07 - IL2CPP_TYPE_I4 = 0x08 - IL2CPP_TYPE_U4 = 0x09 - IL2CPP_TYPE_I8 = 0x0A - IL2CPP_TYPE_U8 = 0x0B - IL2CPP_TYPE_R4 = 0x0C - IL2CPP_TYPE_R8 = 0x0D - IL2CPP_TYPE_STRING = 0x0E - IL2CPP_TYPE_PTR = 0x0F # arg: token - IL2CPP_TYPE_BYREF = 0x10 # arg: token - IL2CPP_TYPE_VALUETYPE = 0x11 # arg: token - IL2CPP_TYPE_CLASS = 0x12 # arg: token - IL2CPP_TYPE_VAR = 0x13 # Generic parameter in a generic type definition, represented as number (compressed unsigned integer) number - IL2CPP_TYPE_ARRAY = 0x14 # type, rank, boundsCount, bound1, loCount, lo1 - IL2CPP_TYPE_GENERICINST = 0x15 # \x{2026} - IL2CPP_TYPE_TYPEDBYREF = 0x16 - IL2CPP_TYPE_I = 0x18 - IL2CPP_TYPE_U = 0x19 - IL2CPP_TYPE_FNPTR = 0x1B # arg: full method signature - IL2CPP_TYPE_OBJECT = 0x1C - IL2CPP_TYPE_SZARRAY = 0x1D # 0-based one-dim-array - IL2CPP_TYPE_MVAR = 0x1E # Generic parameter in a generic method definition, represented as number (compressed unsigned integer) - IL2CPP_TYPE_CMOD_REQD = 0x1F # arg: typedef or typeref token - IL2CPP_TYPE_CMOD_OPT = 0x20 # optional arg: typedef or typref token - IL2CPP_TYPE_INTERNAL = 0x21 # CLR internal type - - IL2CPP_TYPE_MODIFIER = 0x40 # Or with the following types - IL2CPP_TYPE_SENTINEL = 0x41 # Sentinel for varargs method signature - IL2CPP_TYPE_PINNED = 0x45 # Local var that points to pinned object - - IL2CPP_TYPE_ENUM = 0x55 # an enumeration - - -# class Il2CppType(MetaDataClass): -# datapoint: ulong -# bits: uint -# data { get: Union set; } -# attrs { get: uint set; } -# type { get: Il2CppTypeEnum set; } -# num_mods { get: uint set; } -# byref { get: uint set; } -# pinned { get: uint set; } - -# public void Init() -# { -# attrs = bits & 0xffff; -# type = (Il2CppTypeEnum)((bits >> 16) & 0xff); -# num_mods = (bits >> 24) & 0x3f; -# byref = (bits >> 30) & 1; -# pinned = bits >> 31; -# data = new Union { dummy = datapoint }; -# } - -# public class Union -# { -# dummy: ulong -# #/ -# #/ for VALUETYPE and CLASS -# #/ -# klassIndex => (long)dummy: long -# #/ -# #/ for VALUETYPE and CLASS at runtime -# #/ -# typeHandle => dummy: ulong -# #/ -# #/ for PTR and SZARRAY -# #/ -# type => dummy: ulong -# #/ -# #/ for ARRAY -# #/ -# array => dummy: ulong -# #/ -# #/ for VAR and MVAR -# #/ -# genericParameterIndex => (long)dummy: long -# #/ -# #/ for VAR and MVAR at runtime -# #/ -# genericParameterHandle => dummy: ulong -# #/ -# #/ for GENERICINST -# #/ -# generic_class => dummy: ulong -# } -# } - - -class Il2CppGenericContext(MetaDataClass): - # The instantiation corresponding to the class generic parameters - class_inst: ulong - # The instantiation corresponding to the method generic parameters - method_inst: ulong - - -class Il2CppGenericClass(MetaDataClass): - typeDefinitionIndex: Union[long, Version(Max=24.4)] # the generic type definition - type: Union[ulong, Version(Min=27)] # the generic type definition - context: Il2CppGenericContext # a context that contains the type instantiation doesn't contain any method instantiation - cached_class: ulong # if present, the Il2CppClass corresponding to the instantiation. - - -class Il2CppGenericInst(MetaDataClass): - type_argc: long - type_argv: ulong - - -class Il2CppArrayType(MetaDataClass): - etype: ulong - rank: byte - numsizes: byte - numlobounds: byte - sizes: ulong - lobounds: ulong - - -class Il2CppGenericMethodIndices(MetaDataClass): - methodIndex: int - invokerIndex: int - adjustorThunk: Union[int, Version(Min=24.4, Max=24.4), Version(Min=27.1)] - - -class Il2CppGenericMethodFunctionsDefinitions(MetaDataClass): - genericMethodIndex: int - indices: Il2CppGenericMethodIndices - - -class Il2CppMethodSpec(MetaDataClass): - methodDefinitionIndex: int - classIndexIndex: int - methodIndexIndex: int - - -class Il2CppCodeGenModule(MetaDataClass): - moduleName: ulong - methodPointerCount: long - methodPointers: ulong - adjustorThunkCount: Union[long, Version(Min=24.4, Max=24.4), Version(Min=27.1)] - adjustorThunks: Union[ulong, Version(Min=24.4, Max=24.4), Version(Min=27.1)] - invokerIndices: ulong - reversePInvokeWrapperCount: ulong - reversePInvokeWrapperIndices: ulong - rgctxRangesCount: long - rgctxRanges: ulong - rgctxsCount: long - rgctxs: ulong - debuggerMetadata: ulong - customAttributeCacheGenerator: Union[ulong, Version(Min=27)] - moduleInitializer: Union[ulong, Version(Min=27)] - staticConstructorTypeIndices: Union[ulong, Version(Min=27)] - metadataRegistration: Union[ulong, Version(Min=27)] # Per-assembly mode only - codeRegistaration: Union[ulong, Version(Min=27)] # Per-assembly mode only - - -class Il2CppRange(MetaDataClass): - start: int - length: int - - -class Il2CppTokenRangePair(MetaDataClass): - token: uint - range: Il2CppRange diff --git a/UnityPy/tools/libil2cpp_helper/metadata.py b/UnityPy/tools/libil2cpp_helper/metadata.py deleted file mode 100644 index e9d5e54e9..000000000 --- a/UnityPy/tools/libil2cpp_helper/metadata.py +++ /dev/null @@ -1,297 +0,0 @@ -from .metadata_class import * -from typing import List, Dict -from collections import OrderedDict - - -class Metadata: - header: Il2CppGlobalMetadataHeader - imageDefs: List[Il2CppImageDefinition] - typeDefs: List[Il2CppTypeDefinition] - methodDefs: List[Il2CppMethodDefinition] - parameterDefs: List[Il2CppParameterDefinition] - fieldDefs: List[Il2CppFieldDefinition] - fieldDefaultValuesDic: Dict[int, Il2CppFieldDefaultValue] - parameterDefaultValuesDic: Dict[int, Il2CppParameterDefaultValue] - propertyDefs: List[Il2CppPropertyDefinition] - attributeTypeRanges: List[Il2CppCustomAttributeTypeRange] - attributeTypeRangesDic: Dict[Il2CppImageDefinition, Dict[uint, int]] - stringLiterals: List[Il2CppStringLiteral] - metadataUsageLists: List[Il2CppMetadataUsageList] - metadataUsagePairs: List[Il2CppMetadataUsagePair] - attributeTypes: List[int] - interfaceIndices: List[int] - metadataUsageDic: Dict[uint, OrderedDict[uint, uint]] - maxMetadataUsages: int # long - nestedTypeIndices: List[int] - eventDefs: List[Il2CppEventDefinition] - genericContainers: List[Il2CppGenericContainer] - fieldRefs: List[Il2CppFieldRef] - genericParameters: List[Il2CppGenericParameter] - constraintIndices: List[int] - vtableMethods: List[uint] - rgctxEntries: List[Il2CppRGCTXDefinition] - - stringCache: Dict[uint, str] - Address: int # ulong - - version: int - Version: float - - def __init__(self, stream: BytesIO): - self.reader = stream - self.stringCache = {} - - sanity = uint.read_from(stream) - if sanity != 0xFAB11BAF: - raise ValueError( - "ERROR: Metadata file supplied is not valid metadata file." - ) - self.version = version = int.read_from(stream) - if version < 16 or version > 27: - raise NotImplementedError( - f"ERROR: Metadata file supplied is not a supported version[{version}]." - ) - - self.Version = Version = float(version) - self.header = header = self.ReadClass(Il2CppGlobalMetadataHeader, 0) - if version == 24: - if header.stringLiteralOffset == 264: - self.Version = Version = 24.2 - self.header = header = self.ReadClass(Il2CppGlobalMetadataHeader, 0) - else: - self.imageDefs = imageDefs = self.ReadMetadataClassArray( - Il2CppImageDefinition, header.imagesOffset, header.imagesCount - ) - if any(x.token != 1 for x in imageDefs): - self.Version = Version = 24.1 - - self.imageDefs = imageDefs = self.ReadMetadataClassArray( - Il2CppImageDefinition, header.imagesOffset, header.imagesCount - ) - self.typeDefs = self.ReadMetadataClassArray( - Il2CppTypeDefinition, - header.typeDefinitionsOffset, - header.typeDefinitionsCount, - ) - self.methodDefs = self.ReadMetadataClassArray( - Il2CppMethodDefinition, header.methodsOffset, header.methodsCount - ) - self.parameterDefs = self.ReadMetadataClassArray( - Il2CppParameterDefinition, header.parametersOffset, header.parametersCount - ) - self.fieldDefs = self.ReadMetadataClassArray( - Il2CppFieldDefinition, header.fieldsOffset, header.fieldsCount - ) - self.fieldDefaultValues = self.ReadMetadataClassArray( - Il2CppFieldDefaultValue, - header.fieldDefaultValuesOffset, - header.fieldDefaultValuesCount, - ) - self.parameterDefaultValues = self.ReadMetadataClassArray( - Il2CppParameterDefaultValue, - header.parameterDefaultValuesOffset, - header.parameterDefaultValuesCount, - ) - self.fieldDefaultValuesDic = {x.fieldIndex: x for x in self.fieldDefaultValues} - self.parameterDefaultValuesDic = { - x.parameterIndex: x for x in self.parameterDefaultValues - } - self.propertyDefs = self.ReadMetadataClassArray( - Il2CppPropertyDefinition, header.propertiesOffset, header.propertiesCount - ) - self.interfaceIndices = self.ReadClassArray( - int, header.interfacesOffset, header.interfacesCount // 4 - ) - self.nestedTypeIndices = self.ReadClassArray( - int, header.nestedTypesOffset, header.nestedTypesCount // 4 - ) - self.eventDefs = self.ReadMetadataClassArray( - Il2CppEventDefinition, header.eventsOffset, header.eventsCount - ) - self.genericContainers = self.ReadMetadataClassArray( - Il2CppGenericContainer, - header.genericContainersOffset, - header.genericContainersCount, - ) - self.genericParameters = self.ReadMetadataClassArray( - Il2CppGenericParameter, - header.genericParametersOffset, - header.genericParametersCount, - ) - self.constraintIndices = self.ReadClassArray( - int, - header.genericParameterConstraintsOffset, - header.genericParameterConstraintsCount // 4, - ) - self.vtableMethods = self.ReadClassArray( - uint, header.vtableMethodsOffset, header.vtableMethodsCount // 4 - ) - if 16 < Version < 27: # TODO - self.stringLiterals = self.ReadMetadataClassArray( - Il2CppStringLiteral, - header.stringLiteralOffset, - header.stringLiteralCount, - ) - self.metadataUsageLists = self.ReadMetadataClassArray( - Il2CppMetadataUsageList, - header.metadataUsageListsOffset, - header.metadataUsageListsCount, - ) - self.metadataUsagePairs = self.ReadMetadataClassArray( - Il2CppMetadataUsagePair, - header.metadataUsagePairsOffset, - header.metadataUsagePairsCount, - ) - - self.ProcessingMetadataUsage() - - self.fieldRefs = self.ReadMetadataClassArray( - Il2CppFieldRef, header.fieldRefsOffset, header.fieldRefsCount - ) - - if Version > 20: - self.attributeTypeRanges = self.ReadMetadataClassArray( - Il2CppCustomAttributeTypeRange, - header.attributesInfoOffset, - header.attributesInfoCount, - ) - self.attributeTypes = self.ReadClassArray( - int, header.attributeTypesOffset, header.attributeTypesCount // 4 - ) - - if Version >= 24.1: - self.attributeTypeRangesDic = attributeTypeRangesDic = {} - for imageDef in imageDefs: - dic = {} - attributeTypeRangesDic[imageDef] = dic - end = imageDef.customAttributeStart + imageDef.customAttributeCount - for i in range(imageDef.customAttributeStart, end): - dic[self.attributeTypeRanges[i].token] = i - - if Version <= 24.1: - self.rgctxEntries = self.ReadMetadataClassArray( - Il2CppRGCTXDefinition, - header.rgctxEntriesOffset, - header.rgctxEntriesCount, - ) - - def ReadClass(self, clz: MetaDataClass, addr: int) -> List[MetaDataClass]: - self.reader.seek(addr) - return clz.generate_versioned_subclass(self.Version)(self.reader) - - def ReadClassArray( - self, - clz: Union[MetaDataClass, CustomIntWrapper, Il2CppRGCTXDefinition], - addr: int, - count: int, - ) -> List[MetaDataClass]: - self.reader.seek(addr) - if issubclass(clz, (MetaDataClass, Il2CppRGCTXDefinition)): - return [clz(self.reader) for _ in range(count)] - elif issubclass(clz, CustomIntWrapper): - return [clz.read_from(self.reader) for _ in range(count)] - elif clz == Il2CppRGCTXDefinition: - return [clz.read_from(self.reader) for _ in range(count)] - else: - raise ValueError("Invalid clz type") - - def ReadMetadataClassArray( - self, clz: MetaDataClass, addr: int, count: int - ) -> List[MetaDataClass]: - clz = clz.generate_versioned_subclass(self.Version) - return self.ReadClassArray(clz, addr, count // clz.size) - - def GetFieldDefaultValueFromIndex(self, index: int) -> Il2CppFieldDefaultValue: - return self.fieldDefaultValuesDic.get(index, None) - - def GetParameterDefaultValueFromIndex( - self, index: int - ) -> Il2CppParameterDefaultValue: - return self.parameterDefaultValuesDic.get(index, None) - - def GetDefaultValueFromIndex(self, index: int) -> int: - return self.header.fieldAndParameterDefaultValueDataOffset + index - - def GetStringFromIndex(self, index: int) -> str: - result = self.stringCache.get(index, None) - if result == None: - result = self.ReadStringToNull(self.header.stringOffset + index) - self.stringCache[index] = result - return result - - # public int GetCustomAttributeIndex(Il2CppImageDefinition imageDef, int customAttributeIndex, uint token) - # { - # if (Version > 24) - # { - # if (attributeTypeRangesDic[imageDef].TryGetValue(token, out var index)) - # { - # return index - # } - # else - # { - # return -1 - # } - # } - # else - # { - # return customAttributeIndex - # } - # } - - def GetStringLiteralFromIndex(self, index: int) -> str: - stringLiteral = self.stringLiterals[index] - self.reader.seek(self.header.stringLiteralDataOffset + stringLiteral.dataIndex) - return self.reader.read(stringLiteral.Length).encode("utf8") - - def GetStringLiterals(self): - return [self.GetDecodedMethodIndex(i) for i in range(len(self.stringLiterals))] - - def ProcessingMetadataUsage(self): - self.metadataUsageDic = metadataUsageDic = { - i: OrderedDict() for i in range(1, 7) - } - for metadataUsageList in self.metadataUsageLists: - for i in range(metadataUsageList.count): - offset = metadataUsageList.start + i - metadataUsagePair = self.metadataUsagePairs[offset] - usage = self.GetEncodedIndexType(metadataUsagePair.encodedSourceIndex) - decodedIndex = self.GetDecodedMethodIndex( - metadataUsagePair.encodedSourceIndex - ) - metadataUsageDic[usage][ - metadataUsagePair.destinationIndex - ] = decodedIndex - - self.maxMetadataUsages = ( - max(y for x in metadataUsageDic.values() for y in x.keys()) + 1 - ) - - def GetEncodedIndexType(self, index: int) -> int: - return (index & 0xE0000000) >> 29 - - def GetDecodedMethodIndex(self, index: int): - if self.Version >= 27: - return (index & 0x1FFFFFFE) >> 1 - return index & 0x1FFFFFFF - - def SizeOf(typ) -> int: - return typ.size - - def ReadString(self, numChars: int) -> str: - start = self.reader.tell() - # UTF8 takes up to 4 bytes per character - string = self.reader.read(numChars * 4).encode("utf8")[:numChars] - # make our position what it would have been if we'd known the exact number of bytes needed. - self.reader.seek(start) - self.reader.read(len(string.encode("utf8"))) - return string - - def ReadStringToNull(self, offset: int) -> str: - read_one = lambda: self.reader.read(1) - start = self.reader.seek(offset) - c = b"\x00" - ret = [] - while c == b"\x00": - c = read_one() - ret.append(c) - return b"".join(ret).encode("utf8") diff --git a/UnityPy/tools/libil2cpp_helper/metadata_class.py b/UnityPy/tools/libil2cpp_helper/metadata_class.py deleted file mode 100644 index bba2c4b5a..000000000 --- a/UnityPy/tools/libil2cpp_helper/metadata_class.py +++ /dev/null @@ -1,325 +0,0 @@ -from .helper import * - - -class Il2CppGlobalMetadataHeader(MetaDataClass): - sanity: uint - version: int - stringLiteralOffset: uint # string data for managed code - stringLiteralCount: int - stringLiteralDataOffset: uint - stringLiteralDataCount: int - stringOffset: uint # string data for metadata - stringCount: int - eventsOffset: uint # Il2CppEventDefinition - eventsCount: int - propertiesOffset: uint # Il2CppPropertyDefinition - propertiesCount: int - methodsOffset: uint # Il2CppMethodDefinition - methodsCount: int - parameterDefaultValuesOffset: uint # Il2CppParameterDefaultValue - parameterDefaultValuesCount: int - fieldDefaultValuesOffset: uint # Il2CppFieldDefaultValue - fieldDefaultValuesCount: int - fieldAndParameterDefaultValueDataOffset: uint # uint8_t - fieldAndParameterDefaultValueDataCount: int - fieldMarshaledSizesOffset: int # Il2CppFieldMarshaledSize - fieldMarshaledSizesCount: int - parametersOffset: uint # Il2CppParameterDefinition - parametersCount: int - fieldsOffset: uint # Il2CppFieldDefinition - fieldsCount: int - genericParametersOffset: uint # Il2CppGenericParameter - genericParametersCount: int - genericParameterConstraintsOffset: uint # TypeIndex - genericParameterConstraintsCount: int - genericContainersOffset: uint # Il2CppGenericContainer - genericContainersCount: int - nestedTypesOffset: uint # TypeDefinitionIndex - nestedTypesCount: int - interfacesOffset: uint # TypeIndex - interfacesCount: int - vtableMethodsOffset: uint # EncodedMethodIndex - vtableMethodsCount: int - interfaceOffsetsOffset: int # Il2CppInterfaceOffsetPair - interfaceOffsetsCount: int - typeDefinitionsOffset: uint # Il2CppTypeDefinition - typeDefinitionsCount: int - rgctxEntriesOffset: Union[uint, Version(Max=24.1)] # Il2CppRGCTXDefinition - rgctxEntriesCount: Union[int, Version(Max=24.1)] - imagesOffset: uint # Il2CppImageDefinition - imagesCount: int - assembliesOffset: int # Il2CppAssemblyDefinition - assembliesCount: int - metadataUsageListsOffset: Union[ - uint, Version(Min=19, Max=24.4) - ] # Il2CppMetadataUsageList - metadataUsageListsCount: Union[int, Version(Min=19, Max=24.4)] - metadataUsagePairsOffset: Union[ - uint, Version(Min=19, Max=24.4) - ] # Il2CppMetadataUsagePair - metadataUsagePairsCount: Union[int, Version(Min=19, Max=24.4)] - fieldRefsOffset: Union[uint, Version(Min=19)] # Il2CppFieldRef - fieldRefsCount: Union[int, Version(Min=19)] - referencedAssembliesOffset: Union[int, Version(Min=20)] # int32_t - referencedAssembliesCount: Union[int, Version(Min=20)] - attributesInfoOffset: Union[uint, Version(Min=21)] # Il2CppCustomAttributeTypeRange - attributesInfoCount: Union[int, Version(Min=21)] - attributeTypesOffset: Union[uint, Version(Min=21)] # TypeIndex - attributeTypesCount: Union[int, Version(Min=21)] - unresolvedVirtualCallParameterTypesOffset: Union[int, Version(Min=22)] # TypeIndex - unresolvedVirtualCallParameterTypesCount: Union[int, Version(Min=22)] - unresolvedVirtualCallParameterRangesOffset: Union[ - int, Version(Min=22) - ] # Il2CppRange - unresolvedVirtualCallParameterRangesCount: Union[int, Version(Min=22)] - windowsRuntimeTypeNamesOffset: Union[ - int, Version(Min=23) - ] # Il2CppWindowsRuntimeTypeNamePair - windowsRuntimeTypeNamesSize: Union[int, Version(Min=23)] - windowsRuntimeStringsOffset: Union[int, Version(Min=27)] # const char* - windowsRuntimeStringsSize: Union[int, Version(Min=27)] - exportedTypeDefinitionsOffset: Union[int, Version(Min=24)] # TypeDefinitionIndex - exportedTypeDefinitionsCount: Union[int, Version(Min=24)] - - -class Il2CppImageDefinition(MetaDataClass): - nameIndex: uint - assemblyIndex: int - - typeStart: int - typeCount: uint - - exportedTypeStart: Union[int, Version(Min=24)] - exportedTypeCount: Union[uint, Version(Min=24)] - - entryPointIndex: int - token: Union[uint, Version(Min=19)] - - customAttributeStart: Union[int, Version(Min=24.1)] - customAttributeCount: Union[uint, Version(Min=24.1)] - - -class Il2CppTypeDefinition(MetaDataClass): - nameIndex: uint - namespaceIndex: uint - customAttributeIndex: Union[int, Version(Max=24)] - byvalTypeIndex: int - byrefTypeIndex: Union[int, Version(Max=24.4)] - - declaringTypeIndex: int - parentIndex: int - elementTypeIndex: int # we can probably remove this one. Only used for enums - - rgctxStartIndex: Union[int, Version(Max=24.1)] - rgctxCount: Union[int, Version(Max=24.1)] - - genericContainerIndex: int - - delegateWrapperFromManagedToNativeIndex: Union[int, Version(Max=22)] - marshalingFunctionsIndex: Union[int, Version(Max=22)] - ccwFunctionIndex: Union[int, Version(Min=21, Max=22)] - guidIndex: Union[int, Version(Min=21, Max=22)] - - flags: uint - - fieldStart: int - methodStart: int - eventStart: int - propertyStart: int - nestedTypesStart: int - interfacesStart: int - vtableStart: int - interfaceOffsetsStart: int - - method_count: ushort - property_count: ushort - field_count: ushort - event_count: ushort - nested_type_count: ushort - vtable_count: ushort - interfaces_count: ushort - interface_offsets_count: ushort - - # bitfield to portably encode boolean values as single bits - # 01 - valuetype; - # 02 - enumtype; - # 03 - has_finalize; - # 04 - has_cctor; - # 05 - is_blittable; - # 06 - is_import_or_windows_runtime; - # 07-10 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128) - # 11 - PackingSize is default - # 12 - ClassSize is default - # 13-16 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128) - the specified packing size (even for explicit layouts) - bitfield: uint - token: Union[uint, Version(Min=19)] - - @property - def IsValueType(self) -> bool: - return (self.bitfield & 0x1) == 1 - - @property - def IsEnum(self) -> bool: - return ((self.bitfield >> 1) & 0x1) == 1 - - -class Il2CppMethodDefinition(MetaDataClass): - nameIndex: uint - declaringType: int - returnType: int - parameterStart: int - customAttributeIndex: Union[int, Version(Max=24)] - genericContainerIndex: int - methodIndex: Union[int, Version(Max=24.1)] - invokerIndex: Union[int, Version(Max=24.1)] - delegateWrapperIndex: Union[int, Version(Max=24.1)] - rgctxStartIndex: Union[int, Version(Max=24.1)] - rgctxCount: Union[int, Version(Max=24.1)] - token: uint - flags: ushort - iflags: ushort - slot: ushort - parameterCount: ushort - - -class Il2CppParameterDefinition(MetaDataClass): - nameIndex: uint - token: uint - customAttributeIndex: Union[int, Version(Max=24)] - typeIndex: int - - -class Il2CppFieldDefinition(MetaDataClass): - nameIndex: uint - typeIndex: int - customAttributeIndex: Union[int, Version(Max=24)] - token: Union[uint, Version(Min=19)] - - -class Il2CppFieldDefaultValue(MetaDataClass): - fieldIndex: int - typeIndex: int - dataIndex: int - - -class Il2CppPropertyDefinition(MetaDataClass): - nameIndex: uint - get: int - set: int - attrs: uint - customAttributeIndex: Union[int, Version(Max=24)] - token: Union[uint, Version(Min=19)] - - -class Il2CppCustomAttributeTypeRange(MetaDataClass): - token: Union[uint, Version(Min=24.1)] - start: int - count: int - - -class Il2CppMetadataUsageList(MetaDataClass): - start: uint - count: uint - - -class Il2CppMetadataUsagePair(MetaDataClass): - destinationIndex: uint - encodedSourceIndex: uint - - -class Il2CppStringLiteral(MetaDataClass): - length: uint - dataIndex: int - - -class Il2CppParameterDefaultValue(MetaDataClass): - parameterIndex: int - typeIndex: int - dataIndex: int - - -class Il2CppEventDefinition(MetaDataClass): - nameIndex: uint - typeIndex: int - add: int - remove: int - rais: int - customAttributeIndex: Union[int, Version(Max=24)] - token: Union[uint, Version(Min=19)] - - -class Il2CppGenericContainer(MetaDataClass): - # index of the generic type definition or the generic method definition corresponding to this container - ownerIndex: int # either index into Il2CppClass metadata array or Il2CppMethodDefinition array - type_argc: int - # If true, we're a generic method, otherwise a generic type definition. - is_method: int - # Our type parameters. - genericParameterStart: int - - -class Il2CppFieldRef(MetaDataClass): - typeIndex: int - fieldIndex: int # local offset into type fields - - -class Il2CppGenericParameter(MetaDataClass): - ownerIndex: int # Type or method this parameter was defined in. - nameIndex: uint - constraintsStart: short - constraintsCount: short - num: ushort - flags: ushort - - -class Il2CppRGCTXDataType(uint, Enum): - IL2CPP_RGCTX_DATA_INVALID = 0 - IL2CPP_RGCTX_DATA_TYPE = 1 - IL2CPP_RGCTX_DATA_CLASS = 2 - IL2CPP_RGCTX_DATA_METHOD = 3 - IL2CPP_RGCTX_DATA_ARRAY = 4 - - -class Il2CppRGCTXDefinitionData(MetaDataClass): - rgctxDataDummy: int - - @property - def methodIndex(self) -> int: - return self.rgctxDataDummy - - @property - def typeIndex(self) -> int: - return self.rgctxDataDummy - - -class Il2CppRGCTXDefinition: - type: Il2CppRGCTXDataType - data: Il2CppRGCTXDefinitionData - - version: float - size: int - parseString: str - - def __init__(self, reader: BinaryIO = None) -> None: - if not (self.version): - raise NotImplementedError( - "Using an unversioned MetaDataClass isn't possible." - ) - if reader: - self.read_from(reader) - - def read_from(self, reader: BytesIO): - self.type = Il2CppRGCTXDataType.read_from(reader) - self.data = Il2CppRGCTXDefinitionData.generate_versioned_subclass(self.version)( - reader - ) - - def write_to(self, writer: BytesIO): - self.type = self.data.write_to(writer) - self.data.write_to(writer) - - @classmethod - def generate_versioned_subclass(cls, version: float): - cls.version = version - cls.size = 8 # TODO if data changes - return cls diff --git a/UnityPyBoost/ArchiveStorageDecryptor.cpp b/UnityPyBoost/ArchiveStorageDecryptor.cpp index 6765750b5..b26534ff9 100644 --- a/UnityPyBoost/ArchiveStorageDecryptor.cpp +++ b/UnityPyBoost/ArchiveStorageDecryptor.cpp @@ -9,7 +9,7 @@ inline unsigned char decrypt_byte(unsigned char *bytes, uint64_t& offset, uint64 + substitute_data[index & 3] + substitute_data[((index >> 4) & 3) + 8] + substitute_data[((unsigned char)index >> 6) + 12]; - bytes[offset] = (unsigned char)((index_data[bytes[offset] & 0xF] - count_byte) & 0xF | 0x10 * (index_data[bytes[offset] >> 4] - count_byte)); + bytes[offset] = (unsigned char)(((index_data[bytes[offset] & 0xF] - count_byte) & 0xF) | 0x10 * (index_data[bytes[offset] >> 4] - count_byte)); count_byte = bytes[offset++]; index++; return count_byte; @@ -62,21 +62,21 @@ PyObject *decrypt_block(PyObject *self, PyObject *args) { if (index_data.buf) PyBuffer_Release(&index_data); if (substitute_data.buf) PyBuffer_Release(&substitute_data); if (data.buf) PyBuffer_Release(&data); - return NULL; + return nullptr; } - PyObject *result = PyBytes_FromStringAndSize(NULL, data.len); - if (result == NULL) { + PyObject *result = PyBytes_FromStringAndSize(nullptr, data.len); + if (result == nullptr) { PyBuffer_Release(&index_data); PyBuffer_Release(&substitute_data); PyBuffer_Release(&data); - return NULL; + return nullptr; } unsigned char *result_raw = (unsigned char *)PyBytes_AS_STRING(result); memcpy(result_raw, data.buf, data.len); - uint64_t offset = 0; + Py_ssize_t offset = 0; while (offset < data.len) { offset += decrypt(result_raw + offset, index++, data.len - offset, (unsigned char *)index_data.buf, (unsigned char *)substitute_data.buf); } diff --git a/UnityPyBoost/Mesh.cpp b/UnityPyBoost/Mesh.cpp index beb66629a..e1baf0366 100644 --- a/UnityPyBoost/Mesh.cpp +++ b/UnityPyBoost/Mesh.cpp @@ -1,5 +1,6 @@ #include "Mesh.hpp" #include +#include #include #define MAX(x, y) (((x) > (y)) ? (x) : (y)) @@ -20,6 +21,64 @@ enum VertexFormat kVertexFormatSInt32 }; +template +void unpack_vertexdata_template(uint8_t *componentBytes, uint8_t *vertexData, uint32_t m_VertexCount, uint32_t m_StreamOffset, uint32_t m_StreamStride, uint32_t m_ChannelOffset, uint32_t m_ChannelDimension) +{ + const auto channelSize = componentByteSize * m_ChannelDimension; + + uint8_t *componentCur = componentBytes; + uint8_t *vertexCur = vertexData; + + // move vertexCur to the first vertex + vertexCur += m_StreamOffset + m_ChannelOffset; + + for (uint32_t v = 0; v < m_VertexCount; v++) + { + memcpy(componentCur, vertexCur, channelSize); + componentCur += channelSize; + vertexCur += m_StreamStride; + } +} + +template +void swap_vertexdata(uint8_t *componentBytes, uint32_t m_VertexCount, uint32_t m_ChannelDimension) +{ + if constexpr (componentByteSize == 1) + { + // do nothing + } + else if constexpr (componentByteSize == 2) + { + uint16_t *componentUints = (uint16_t *)componentBytes; + for (uint32_t i = 0; i < m_VertexCount * m_ChannelDimension; i++) + { + swap_any_inplace(componentUints++); + } + } + else if constexpr (componentByteSize == 4) + { + uint32_t *componentUints = (uint32_t *)componentBytes; + for (uint32_t i = 0; i < m_VertexCount * m_ChannelDimension; i++) + { + swap_any_inplace(componentUints++); + } + } + else if constexpr (componentByteSize == 8) + { + uint64_t *componentUints = (uint64_t *)componentBytes; + for (uint32_t i = 0; i < m_VertexCount * m_ChannelDimension; i++) + { + swap_any_inplace(componentUints++); + } + } + else + { + const auto compoentByteSizeStr = std::to_string(componentByteSize); + const auto error_message = "Swap not implemented for this size: " + compoentByteSizeStr; + PyErr_SetString(PyExc_ValueError, error_message.c_str()); + } +} + PyObject *unpack_vertexdata(PyObject *self, PyObject *args) { // define vars @@ -39,7 +98,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) { PyBuffer_Release(&vertexDataView); } - return NULL; + return nullptr; } uint8_t *vertexData = (uint8_t *)vertexDataView.buf; @@ -52,159 +111,49 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) { PyBuffer_Release(&vertexDataView); PyErr_SetString(PyExc_ValueError, "Vertex data access out of bounds"); - return NULL; + return nullptr; } PyObject *res = PyBytes_FromStringAndSize(nullptr, componentBytesLength); if (!res) { PyBuffer_Release(&vertexDataView); - return NULL; + return nullptr; } uint8_t *componentBytes = (uint8_t *)PyBytes_AS_STRING(res); - for (uint32_t v = 0; v < m_VertexCount; v++) + switch (componentByteSize) { - uint32_t vertexOffset = m_StreamOffset + m_ChannelOffset + m_StreamStride * v; - for (uint32_t d = 0; d < m_ChannelDimension; d++) + case 1: + unpack_vertexdata_template<1>(componentBytes, vertexData, m_VertexCount, m_StreamOffset, m_StreamStride, m_ChannelOffset, m_ChannelDimension); + break; + case 2: + unpack_vertexdata_template<2>(componentBytes, vertexData, m_VertexCount, m_StreamOffset, m_StreamStride, m_ChannelOffset, m_ChannelDimension); + if (swap) { - uint32_t vertexDataOffset = vertexOffset + componentByteSize * d; - uint32_t componentOffset = componentByteSize * (v * m_ChannelDimension + d); - memcpy(componentBytes + componentOffset, vertexData + vertexDataOffset, componentByteSize); + swap_vertexdata<2>(componentBytes, m_VertexCount, m_ChannelDimension); } - } - - if (swap) // swap bytes - { - if (componentByteSize == 2) + break; + case 4: + unpack_vertexdata_template<4>(componentBytes, vertexData, m_VertexCount, m_StreamOffset, m_StreamStride, m_ChannelOffset, m_ChannelDimension); + if (swap) { - uint16_t *componentUints = (uint16_t *)componentBytes; - for (uint32_t i = 0; i < componentBytesLength; i += 2) - { - swap_any_inplace(componentUints++); - } + swap_vertexdata<4>(componentBytes, m_VertexCount, m_ChannelDimension); } - else if (componentByteSize == 4) + break; + case 8: + unpack_vertexdata_template<8>(componentBytes, vertexData, m_VertexCount, m_StreamOffset, m_StreamStride, m_ChannelOffset, m_ChannelDimension); + if (swap) { - - uint32_t *componentUints = (uint32_t *)componentBytes; - for (uint32_t i = 0; i < componentBytesLength; i += 4) - { - swap_any_inplace(componentUints++); - } + swap_vertexdata<8>(componentBytes, m_VertexCount, m_ChannelDimension); } + break; + default: + PyBuffer_Release(&vertexDataView); + PyErr_SetString(PyExc_ValueError, "Unsupported component byte size"); + return nullptr; } PyBuffer_Release(&vertexDataView); return res; - - // fast enough in Python - // uint32_t itemCount = componentBytesLength / componentByteSize; - // PyObject *lst = PyList_New(itemCount); - // if (!lst) - // return NULL; - - // switch (format) - // { - // case kVertexFormatFloat: - // { - // float *items = (float *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyFloat_FromDouble((double)*items++)); - // } - // // result[i] = BitConverter.ToSingle(inputBytes, i * 4); - // break; - // } - // case kVertexFormatFloat16: - // { - // uint16_t *items = (uint16_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // double x = _PyFloat_Unpack2(items++, 0); - // if (x == -1.0 && PyErr_Occurred()) - // { - // return NULL; - // } - // PyList_SetItem(lst, i, PyFloat_FromDouble(x)); - // } - // // result[i] = Half.ToHalf(inputBytes, i * 2); - // break; - // } - // case kVertexFormatUNorm8: - // { - // uint8_t *items = componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyFloat_FromDouble((double)(*items++ / 255.0f))); - // } - // // result[i] = inputBytes[i] / 255f; - // break; - // } - // case kVertexFormatSNorm8: - // { - // int8_t *items = (int8_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyFloat_FromDouble((double)MAX((*items++ / 127.0f), -1.0f))); - // } - // // result[i] = Math.Max((sbyte)inputBytes[i] / 127f, -1f); - // break; - // } - // case kVertexFormatUNorm16: - // { - // uint16_t *items = (uint16_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyFloat_FromDouble((double)(*items++ / 65535.0f))); - // } - // // result[i] = BitConverter.ToUInt16(inputBytes, i * 2) / 65535f; - // break; - // } - // case kVertexFormatSNorm16: - // { - // int16_t *items = (int16_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyFloat_FromDouble((double)MAX((*items++ / 32767.0f), -1.0f))); - // } - // // result[i] = Math.Max(BitConverter.ToInt16(inputBytes, i * 2) / 32767f, -1f); - // break; - // } - // case kVertexFormatUInt8: - // case kVertexFormatSInt8: - // { - // uint8_t *items = componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyLong_FromUnsignedLong((uint32_t)*items++)); - // } - // // result[i] = inputBytes[i]; - // break; - // } - // case kVertexFormatUInt16: - // case kVertexFormatSInt16: - // { - // uint16_t *items = (uint16_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyLong_FromUnsignedLong((uint32_t)*items++)); - // } - // // result[i] = BitConverter.ToInt16(inputBytes, i * 2); - // break; - // } - // case kVertexFormatUInt32: - // case kVertexFormatSInt32: - // { - // uint32_t *items = (uint32_t *)componentBytes; - // for (uint32_t i = 0; i < itemCount; i++) - // { - // PyList_SetItem(lst, i, PyLong_FromUnsignedLong(*items++)); - // } - // // result[i] = BitConverter.ToInt32(inputBytes, i * 4); - // break; - // } - // } - // free(componentBytes); - // return lst; } diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index d2b6b09bc..ec9fa234e 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -40,11 +40,8 @@ std::string clean_name(const std::string &name) cleaned_name = cleaned_name.substr(6); } - // Remove trailing "?" - if (!cleaned_name.empty() && cleaned_name.back() == '?') - { - cleaned_name.pop_back(); - } + // Remove certain characters + cleaned_name = std::regex_replace(cleaned_name, std::regex("[\\?\\*]"), ""); // Replace certain characters with "_" cleaned_name = std::regex_replace(cleaned_name, std::regex("[ \\.:\\-\\[\\]]"), "_"); @@ -76,7 +73,7 @@ inline PyObject *read_bool(ReaderT *reader) if (reader->ptr + 1 > reader->end) { PyErr_SetString(PyExc_ValueError, "read_bool out of bounds"); - return NULL; + return nullptr; } PyObject *value = *reader->ptr++ ? Py_True : Py_False; Py_INCREF(value); @@ -87,8 +84,8 @@ inline PyObject *read_bool_array(ReaderT *reader, int32_t count) { if (reader->ptr + count > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_bool out of bounds"); - return NULL; + PyErr_SetString(PyExc_ValueError, "read_bool_array out of bounds"); + return nullptr; } PyObject *list = PyList_New(count); for (auto i = 0; i < count; i++) @@ -105,7 +102,7 @@ inline PyObject *read_u8(ReaderT *reader) if (reader->ptr + 1 > reader->end) { PyErr_SetString(PyExc_ValueError, "read_u8 out of bounds"); - return NULL; + return nullptr; } return PyLong_FromUnsignedLong(*reader->ptr++); } @@ -114,8 +111,8 @@ inline PyObject *read_u8_array(ReaderT *reader, int32_t count) { if (reader->ptr + count > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_u8 out of bounds"); - return NULL; + PyErr_SetString(PyExc_ValueError, "read_u8_array out of bounds"); + return nullptr; } PyObject *list = PyList_New(count); for (auto i = 0; i < count; i++) @@ -130,7 +127,7 @@ inline PyObject *read_s8(ReaderT *reader) if (reader->ptr + 1 > reader->end) { PyErr_SetString(PyExc_ValueError, "read_s8 out of bounds"); - return NULL; + return nullptr; } return PyLong_FromLong((int8_t)*reader->ptr++); } @@ -139,8 +136,8 @@ inline PyObject *read_s8_array(ReaderT *reader, int32_t count) { if (reader->ptr + count > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_s8 out of bounds"); - return NULL; + PyErr_SetString(PyExc_ValueError, "read_s8_array out of bounds"); + return nullptr; } PyObject *list = PyList_New(count); int8_t *ptr = (int8_t *)reader->ptr; @@ -153,14 +150,15 @@ inline PyObject *read_s8_array(ReaderT *reader, int32_t count) } template -inline PyObject *read_int(ReaderT *reader) +inline PyObject *read_num(ReaderT *reader) { - static_assert(std::is_integral::value, "Unsupported type for read_int"); + static_assert(std::is_integral::value || std::is_floating_point::value, "Unsupported type for read_num"); if (reader->ptr + sizeof(T) > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_int out of bounds"); - return NULL; + std::string error_msg = "read_" + std::string(typeid(T).name()) + " out of bounds"; + PyErr_SetString(PyExc_EOFError, error_msg.c_str()); + return nullptr; } T value = *(T *)reader->ptr; if constexpr (swap) @@ -168,7 +166,11 @@ inline PyObject *read_int(ReaderT *reader) swap_any_inplace(&value); } reader->ptr += sizeof(T); - if constexpr (std::is_signed::value) + if constexpr (std::is_floating_point::value) + { + return PyFloat_FromDouble(value); + } + else if constexpr (std::is_signed::value) { if constexpr (std::is_same::value) { @@ -179,7 +181,7 @@ inline PyObject *read_int(ReaderT *reader) return PyLong_FromLong((int32_t)value); } } - else + else if constexpr (std::is_unsigned::value) { if constexpr (std::is_same::value) { @@ -190,17 +192,24 @@ inline PyObject *read_int(ReaderT *reader) return PyLong_FromUnsignedLong((uint32_t)value); } } + else + { + std::string error_msg = "Unsupported type for read_num: " + std::string(typeid(T).name()); + PyErr_SetString(PyExc_TypeError, error_msg.c_str()); + return nullptr; + } } template -inline PyObject *read_int_array(ReaderT *reader, int32_t count) +inline PyObject *read_num_array(ReaderT *reader, int32_t count) { - static_assert(std::is_integral::value, "Unsupported type for read_int_array"); + static_assert(std::is_integral::value || std::is_floating_point::value, "Unsupported type for read_num_array"); if (reader->ptr + sizeof(T) * count > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_int_array out of bounds"); - return NULL; + std::string error_msg = "read_" + std::string(typeid(T).name()) + "_array out of bounds"; + PyErr_SetString(PyExc_EOFError, error_msg.c_str()); + return nullptr; } PyObject *list = PyList_New(count); T *ptr = (T *)reader->ptr; @@ -211,72 +220,41 @@ inline PyObject *read_int_array(ReaderT *reader, int32_t count) { swap_any_inplace(&value); } - if constexpr (std::is_signed::value) + PyObject *item; + if constexpr (std::is_floating_point::value) + { + item = PyFloat_FromDouble(value); + } + else if constexpr (std::is_signed::value) { if constexpr (std::is_same::value) { - PyList_SET_ITEM(list, i, PyLong_FromLongLong(value)); + item = PyLong_FromLongLong(value); } else { - PyList_SET_ITEM(list, i, PyLong_FromLong((int32_t)value)); + item = PyLong_FromLong((int32_t)value); } } - else + else if constexpr (std::is_unsigned::value) { if constexpr (std::is_same::value) { - PyList_SET_ITEM(list, i, PyLong_FromUnsignedLongLong(value)); + item = PyLong_FromUnsignedLongLong(value); } else { - PyList_SET_ITEM(list, i, PyLong_FromUnsignedLong((uint32_t)value)); + item = PyLong_FromUnsignedLong((uint32_t)value); } } - } - reader->ptr = (uint8_t *)ptr; - return list; -} - -template -inline PyObject *read_float(ReaderT *reader) -{ - static_assert(std::is_floating_point::value, "Unsupported type for read_float"); - - if (reader->ptr + sizeof(T) > reader->end) - { - PyErr_SetString(PyExc_ValueError, "read_float out of bounds"); - return NULL; - } - T value = *(T *)reader->ptr; - if constexpr (swap) - { - swap_any_inplace(&value); - } - reader->ptr += sizeof(T); - return PyFloat_FromDouble(value); -} - -template -inline PyObject *read_float_array(ReaderT *reader, int32_t count) -{ - static_assert(std::is_floating_point::value, "Unsupported type for read_float_array"); - - if (reader->ptr + sizeof(T) * count > reader->end) - { - PyErr_SetString(PyExc_ValueError, "read_float_array out of bounds"); - return NULL; - } - T *ptr = (T *)reader->ptr; - PyObject *list = PyList_New(count); - for (auto i = 0; i < count; i++) - { - T value = *ptr++; - if constexpr (swap) + else { - swap_any_inplace(&value); + Py_DECREF(list); + std::string error_msg = "Unsupported type for read_num_array: " + std::string(typeid(T).name()); + PyErr_SetString(PyExc_TypeError, error_msg.c_str()); + return nullptr; } - PyList_SET_ITEM(list, i, PyFloat_FromDouble(value)); + PyList_SET_ITEM(list, i, item); } reader->ptr = (uint8_t *)ptr; return list; @@ -287,7 +265,7 @@ inline bool _read_length(ReaderT *reader, int32_t *length) { if (reader->ptr + sizeof(int32_t) > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_length out of bounds"); + PyErr_SetString(PyExc_EOFError, "read_length out of bounds"); return false; } *length = *(int32_t *)reader->ptr; @@ -295,6 +273,11 @@ inline bool _read_length(ReaderT *reader, int32_t *length) { swap_any_inplace(length); } + if (*length < 0) + { + PyErr_SetString(PyExc_ValueError, "Negative length read from TypeTree"); + return false; + } reader->ptr += sizeof(int32_t); return true; } @@ -305,12 +288,12 @@ inline PyObject *read_str(ReaderT *reader) int32_t length; if (!_read_length(reader, &length)) { - return NULL; + return nullptr; } if (reader->ptr + length > reader->end) { - PyErr_SetString(PyExc_ValueError, "read_str out of bounds"); - return NULL; + PyErr_SetString(PyExc_EOFError, "read_str out of bounds"); + return nullptr; } PyObject *py_str = PyUnicode_DecodeUTF8((char *)reader->ptr, length, "surrogateescape"); reader->ptr += length; @@ -324,12 +307,12 @@ inline PyObject *read_bytes(ReaderT *reader) int32_t length; if (!_read_length(reader, &length)) { - return NULL; + return nullptr; } if (reader->ptr + length > reader->end) { PyErr_SetString(PyExc_ValueError, "read_bytes out of bounds"); - return NULL; + return nullptr; } PyObject *bytes = PyBytes_FromStringAndSize((char *)reader->ptr, length); reader->ptr += length; @@ -342,19 +325,19 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe if (PyList_GET_SIZE(node->m_Children) != 2) { PyErr_SetString(PyExc_ValueError, "Pair node must have 2 children"); - return NULL; + return nullptr; } PyObject *first = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0), config); - if (!first) + if (first == nullptr) { - return NULL; + return nullptr; } PyObject *second = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 1), config); - if (!second) + if (second == nullptr) { Py_DECREF(first); - return NULL; + return nullptr; } // PyTuple_Pack creates two strong references PyObject *pair = PyTuple_Pack(2, first, second); @@ -370,27 +353,31 @@ inline PyObject *read_pair_array(ReaderT *reader, TypeTreeNodeObject *node, Type if (PyList_GET_SIZE(node->m_Children) != 2) { PyErr_SetString(PyExc_ValueError, "Pair node must have 2 children"); - return NULL; + return nullptr; } TypeTreeNodeObject *first_child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0); TypeTreeNodeObject *second_child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 1); PyObject *list = PyList_New(count); + if (list == nullptr) + { + return nullptr; + } for (auto i = 0; i < count; i++) { PyObject *first = read_typetree_value(reader, first_child, config); - if (!first) + if (first == nullptr) { Py_DECREF(list); - return NULL; + return nullptr; } PyObject *second = read_typetree_value(reader, second_child, config); - if (!second) + if (second == nullptr) { Py_DECREF(first); Py_DECREF(list); - return NULL; + return nullptr; } PyList_SET_ITEM(list, i, PyTuple_Pack(2, first, second)); // pack creates two strong references // so we need to decref both values here to bring their ref count back to 1 @@ -422,10 +409,10 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR } } PyObject *child_value = read_typetree_value(reader, child, config); // child_value: 1 refcount - if (!child_value) + if (child_value == nullptr) { Py_DECREF(value); // value: 0 refcount - return NULL; + return nullptr; } int set_item_result; if constexpr (as_dict == true) @@ -440,7 +427,7 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR { Py_DECREF(value); // value: 0 refcount Py_DECREF(child_value); // child_value: 0 refcount - return NULL; + return nullptr; } // PyDict_SetItem increases ref count, so we need to decref here Py_DECREF(child_value); // child_value: 1 refcount @@ -454,22 +441,12 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR return value; } -#if PY_VERSION_HEX >= 0x030e0000 -PyObject *get_annotations = nullptr; -#endif +static PyObject *_get_annotations = nullptr; inline PyObject *get_annotations(PyObject *clz) { #if PY_VERSION_HEX >= 0x030e0000 - if (get_annotations == nullptr) - { - // from annotationlib import get_annotations - PyObject *annotationlib = PyImport_ImportModule("annotationlib"); - get_annotations = PyObject_GetAttrString(annotationlib, "get_annotations"); - Py_INCREF(get_annotations); - Py_DECREF(annotationlib); - } - return PyObject_CallFunctionObjArgs(get_annotations, clz, NULL); + return PyObject_CallFunctionObjArgs(_get_annotations, clz, nullptr); #else return PyObject_GetAttrString(clz, "__annotations__"); #endif @@ -485,6 +462,13 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre // dict iterator values PyObject *key, *value = nullptr; Py_ssize_t pos; + // slots check + PyObject *slots = nullptr; + + if (kwargs == nullptr) + { + return nullptr; + } if (node->_data_type == NodeDataType::PPtr) { @@ -518,6 +502,16 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre } PyErr_Clear(); + // if __slots__ is defined, setattr for non-slots attributes will fail + // so we can skip the extra field check + slots = PyObject_GetAttrString(clz, "__slots__"); + if (PyTuple_Check(slots) && PyTuple_GET_SIZE(slots) > 0) + { + Py_XDECREF(slots); + goto PARSE_CLASS_UNKNOWN; + } + Py_XDECREF(slots); + // possibly extra fields annotations = get_annotations(clz); if (annotations == nullptr) @@ -533,11 +527,6 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre { continue; } - if (PyObject_HasAttrString(clz, "__slots__")) - { - // if __slots__ is defined, setattr for non-slots attributes will fail - goto PARSE_CLASS_UNKNOWN; - } PyObject *extra_value = PyDict_GetItem(kwargs, child->_clean_name); // - borrowed ref +/- 0 PyDict_SetItem(extras, child->_clean_name, extra_value); // +1 PyDict_DelItem(kwargs, child->_clean_name); // -1 @@ -570,10 +559,13 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre clz = PyObject_GetAttrString(config->classes, "UnknownObject"); PyDict_SetItemString(kwargs, "__node__", (PyObject *)node); // merge extras back into kwargs - pos = 0; - while (PyDict_Next(extras, &pos, &key, &value)) + if (extras != nullptr) { - PyDict_SetItem(kwargs, key, value); + pos = 0; + while (PyDict_Next(extras, &pos, &key, &value)) + { + PyDict_SetItem(kwargs, key, value); + } } instance = PyObject_Call(clz, args, kwargs); } @@ -592,14 +584,14 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile if (assetsfile == Py_None) { PyErr_SetString(PyExc_ValueError, "Reference Type found but no SerializedFile passed as assetsfile to read_typetree!"); - return NULL; + return nullptr; } PyObject *ref_types = PyObject_GetAttrString(assetsfile, "ref_types"); if (!ref_types || !PyList_Check(ref_types)) { Py_XDECREF(ref_types); PyErr_SetString(PyExc_ValueError, "No SerializedFile.ref_types"); - return NULL; + return nullptr; } PyObject *type = PyDict_GetItemString(ref_object, "type"); @@ -607,12 +599,12 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile { Py_DECREF(ref_types); PyErr_SetString(PyExc_ValueError, "Failed to get 'type'"); - return NULL; + return nullptr; } - PyObject *cls = NULL; - PyObject *ns = NULL; - PyObject *asm_ = NULL; + PyObject *cls = nullptr; + PyObject *ns = nullptr; + PyObject *asm_ = nullptr; if (PyDict_Check(type)) { cls = PyDict_GetItemString(type, "class"); @@ -636,7 +628,7 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile Py_XDECREF(ns); Py_XDECREF(asm_); PyErr_SetString(PyExc_ValueError, "Failed to get 'class', 'ns' or 'asm'"); - return NULL; + return nullptr; } if (PyUnicode_GET_LENGTH(cls) == 0) @@ -649,7 +641,7 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile } Py_ssize_t ref_types_len = PyList_Size(ref_types); - TypeTreeNodeObject *ref_type_node = NULL; + TypeTreeNodeObject *ref_type_node = nullptr; for (Py_ssize_t i = 0; i < ref_types_len; i++) { PyObject *ref_type = PyList_GetItem(ref_types, i); @@ -715,31 +707,31 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre value = read_u8(reader); break; case NodeDataType::u16: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::u32: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::u64: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::s8: value = read_s8(reader); break; case NodeDataType::s16: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::s32: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::s64: - value = read_int(reader); + value = read_num(reader); break; case NodeDataType::f32: - value = read_float(reader); + value = read_num(reader); break; case NodeDataType::f64: - value = read_float(reader); + value = read_num(reader); break; case NodeDataType::boolean: value = read_bool(reader); @@ -767,7 +759,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { PyErr_SetString(PyExc_ValueError, "Failed to get ref type node"); Py_DECREF(value); - return NULL; + return nullptr; } else if (ref_node == (TypeTreeNodeObject *)Py_None) { @@ -782,16 +774,16 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre child_value = read_typetree_value(reader, child, config); } - if (!child_value) + if (child_value == nullptr) { Py_DECREF(value); - return NULL; + return nullptr; } if (PyDict_SetItem(value, child->m_Name, child_value)) { Py_DECREF(value); Py_DECREF(child_value); - return NULL; + return nullptr; } // dict increases ref count, so we need to decref here Py_DECREF(child_value); @@ -799,11 +791,11 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre if (!config->as_dict) { PyObject *clz = PyObject_GetAttrString(config->classes, "UnknownObject"); - if (clz == NULL) + if (clz == nullptr) { PyErr_SetString(PyExc_ValueError, "Failed to get class"); Py_DECREF(value); - return NULL; + return nullptr; } PyObject *args = PyTuple_Pack(1, (PyObject *)node); PyObject *instance = PyObject_Call(clz, args, value); @@ -824,6 +816,12 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre if (child && child->_data_type == NodeDataType::Array) { // array + if (PyList_GET_SIZE(child->m_Children) != 2) + { + PyErr_SetString(PyExc_ValueError, "Array node must have 2 children"); + return nullptr; + } + if (child->_align) { align = true; @@ -831,20 +829,24 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre int32_t length; if (!_read_length(reader, &length)) { - return NULL; + return nullptr; } child = (TypeTreeNodeObject *)PyList_GET_ITEM(child->m_Children, 1); if (std::find(std::begin(SUPPORTED_VALUE_ARRAY_READ_TYPES), std::end(SUPPORTED_VALUE_ARRAY_READ_TYPES), child->_data_type) == std::end(SUPPORTED_VALUE_ARRAY_READ_TYPES)) { value = PyList_New(length); + if (value == nullptr) + { + return nullptr; + } for (int i = 0; i < length; i++) { PyObject *item = read_typetree_value(reader, child, config); - if (!item) + if (item == nullptr) { Py_DECREF(value); - return NULL; + return nullptr; } PyList_SET_ITEM(value, i, item); } @@ -869,7 +871,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre } } - if (align) + if (align && value != nullptr) { align4(reader); } @@ -889,31 +891,31 @@ PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, T value = read_u8_array(reader, count); break; case NodeDataType::u16: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::u32: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::u64: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::s8: value = read_s8_array(reader, count); break; case NodeDataType::s16: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::s32: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::s64: - value = read_int_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::f32: - value = read_float_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::f64: - value = read_float_array(reader, count); + value = read_num_array(reader, count); break; case NodeDataType::boolean: value = read_bool_array(reader, count); @@ -922,9 +924,11 @@ PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, T value = read_pair_array(reader, node, config, count); break; default: - value = PyErr_Format(PyExc_ValueError, "Unsupported type for read_typetree_value_array: %d", node->_data_type); + std::string error_msg = "Unsupported type for read_value_array: " + std::to_string(node->_data_type); + PyErr_SetString(PyExc_TypeError, error_msg.c_str()); + value = nullptr; } - if (align) + if (align && value != nullptr) { align4(reader); } @@ -941,9 +945,20 @@ static inline void set_none_if_null_n_incref(PyObject **field) Py_INCREF(*field); } +static bool is_null_none_or_type(PyObject *obj, PyTypeObject *type, const char *type_name, const char *field_name) +{ + if (obj == nullptr || obj == Py_None || PyObject_TypeCheck(obj, type)) + { + return true; + } + std::string error_msg = "Expected " + std::string(type_name) + " or None for " + std::string(field_name); + PyErr_SetString(PyExc_TypeError, error_msg.c_str()); + return false; +} + PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) { - const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", NULL}; + const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", nullptr}; Py_buffer view; PyObject *node = nullptr; int as_dict = 1; @@ -1009,7 +1024,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) Py_DECREF(config.assetfile); Py_DECREF(config.classes); PyErr_SetString(PyExc_ValueError, "Invalid endian"); - return NULL; + return nullptr; } } @@ -1034,7 +1049,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) Py_XDECREF(config.assetfile); Py_XDECREF(config.classes); - return Py_BuildValue("(Nn)", value, bytes_read); + return (value != nullptr) ? Py_BuildValue("(Nn)", value, bytes_read) : nullptr; } // TypeTreeNode impl @@ -1123,7 +1138,7 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject "m_Index", "m_MetaFlag", "m_RefTypeHash", - NULL}; + nullptr}; // ensure all fields are set to 0 // in case init fails, so that dealloc doesn't segfault @@ -1140,7 +1155,7 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject self->m_RefTypeHash = nullptr; self->_clean_name = nullptr; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!O!O!O!|O!O!O!O!O!O!", (char **)kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!O!O!O!|OOOOOO", (char **)kwlist, // required fields &PyLong_Type, &self->m_Level, &PyUnicode_Type, &self->m_Type, @@ -1148,12 +1163,12 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject &PyLong_Type, &self->m_ByteSize, &PyLong_Type, &self->m_Version, // optional fields - &PyList_Type, &self->m_Children, - &PyLong_Type, &self->m_TypeFlags, - &PyLong_Type, &self->m_VariableCount, - &PyLong_Type, &self->m_Index, - &PyLong_Type, &self->m_MetaFlag, - &PyLong_Type, &self->m_RefTypeHash)) + &self->m_Children, + &self->m_TypeFlags, + &self->m_VariableCount, + &self->m_Index, + &self->m_MetaFlag, + &self->m_RefTypeHash)) { return -1; } @@ -1166,14 +1181,27 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject Py_INCREF(self->m_Version); // optional values - can still be nullptr - if (self->m_Children == nullptr) + if (self->m_Children == nullptr || self->m_Children == Py_None) { + if (self->m_Children == Py_None) + { + // in older Python's Py_None is not immortal + Py_DECREF(self->m_Children); + } self->m_Children = PyList_New(0); } else { Py_INCREF(self->m_Children); } + + if (!is_null_none_or_type(self->m_TypeFlags, &PyLong_Type, "int", "m_TypeFlags") || + !is_null_none_or_type(self->m_VariableCount, &PyLong_Type, "int", "m_VariableCount") || + !is_null_none_or_type(self->m_Index, &PyLong_Type, "int", "m_Index") || + !is_null_none_or_type(self->m_MetaFlag, &PyLong_Type, "int", "m_MetaFlag") || + !is_null_none_or_type(self->m_RefTypeHash, &PyLong_Type, "int", "m_RefTypeHash")) + return -1; + set_none_if_null_n_incref(&self->m_TypeFlags); set_none_if_null_n_incref(&self->m_VariableCount); set_none_if_null_n_incref(&self->m_Index); @@ -1190,6 +1218,16 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject return 0; } +static PyObject *TypeTreeNode_repr(TypeTreeNodeObject *self) +{ + return PyUnicode_FromFormat( + "TypeTreeNode(m_Level=%R, m_Type=%R, m_Name=%R, m_MetaFlag=%R)", + self->m_Level, + self->m_Type, + self->m_Name, + self->m_MetaFlag); +} + static PyMemberDef TypeTreeNode_members[] = { {"m_Level", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Level), 0, ""}, {"m_Type", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Type), 0, ""}, @@ -1203,16 +1241,16 @@ static PyMemberDef TypeTreeNode_members[] = { {"m_MetaFlag", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_MetaFlag), 0, ""}, {"m_RefTypeHash", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_RefTypeHash), 0, ""}, {"_clean_name", T_OBJECT_EX, offsetof(TypeTreeNodeObject, _clean_name), 0, ""}, - {NULL} /* Sentinel */ + {nullptr} /* Sentinel */ }; static PyTypeObject TypeTreeNodeType = []() -> PyTypeObject { PyTypeObject type = { #if PY_VERSION_HEX >= 0x03080000 - PyVarObject_HEAD_INIT(NULL, 0) + PyVarObject_HEAD_INIT(nullptr, 0) #else - PyObject_HEAD_INIT(NULL) 0 + PyObject_HEAD_INIT(nullptr) 0 #endif }; type.tp_name = "TypeTreeHelper.TypeTreeNode"; @@ -1224,6 +1262,7 @@ static PyTypeObject TypeTreeNodeType = []() -> PyTypeObject type.tp_init = (initproc)TypeTreeNode_init; type.tp_members = TypeTreeNode_members; type.tp_finalize = (destructor)TypeTreeNode_finalize; + type.tp_repr = (reprfunc)TypeTreeNode_repr; return type; }(); @@ -1233,5 +1272,12 @@ int add_typetreenode_to_module(PyObject *m) return -1; Py_INCREF(&TypeTreeNodeType); PyModule_AddObject(m, "TypeTreeNode", (PyObject *)&TypeTreeNodeType); +#if PY_VERSION_HEX >= 0x030e0000 + PyObject *annotationlib = PyImport_ImportModule("annotationlib"); + _get_annotations = PyObject_GetAttrString(annotationlib, "get_annotations"); + PyModule_AddObject(m, "_get_annotations", _get_annotations); // steals ref + Py_INCREF(_get_annotations); + Py_DECREF(annotationlib); +#endif return 0; } diff --git a/UnityPyBoost/UnityPyBoost.cpp b/UnityPyBoost/UnityPyBoost.cpp index 92908bda7..4b3ed8fa0 100644 --- a/UnityPyBoost/UnityPyBoost.cpp +++ b/UnityPyBoost/UnityPyBoost.cpp @@ -19,10 +19,10 @@ static struct PyMethodDef method_table[] = { (PyCFunction)decrypt_block, METH_VARARGS, "replacement for ArchiveStorageDecryptor.decrypt_block"}, - {NULL, - NULL, + {nullptr, + nullptr, 0, - NULL} // Sentinel value ending the table + nullptr} // Sentinel value ending the table }; // A struct contains the definition of a module @@ -32,10 +32,10 @@ static PyModuleDef UnityPyBoost_module = { "TODO", -1, // Optional size of the module state memory method_table, - NULL, // Optional slot definitions - NULL, // Optional traversal function - NULL, // Optional clear function - NULL // Optional module deallocation function + nullptr, // Optional slot definitions + nullptr, // Optional traversal function + nullptr, // Optional clear function + nullptr // Optional module deallocation function }; // The module init function diff --git a/examples/AssetPatch/522608825 b/examples/AssetPatch/522608825 deleted file mode 100644 index 4938f2f97..000000000 Binary files a/examples/AssetPatch/522608825 and /dev/null differ diff --git a/examples/AssetPatch/patch.py b/examples/AssetPatch/patch.py deleted file mode 100644 index 7a4d199b1..000000000 --- a/examples/AssetPatch/patch.py +++ /dev/null @@ -1,65 +0,0 @@ -import json -import os -import time -import UnityPy -from googletrans import Translator - -root = os.path.dirname(os.path.realpath(__file__)) - -def main(): - # load the original japanese localisation - src = os.path.join(root, "522608825") - e = UnityPy.load(src) - # iterate over all localisation assets - for cont, obj in e.container.items(): - # read the asset data - data = obj.read() - # get the localisation data - script = json.loads(bytes(data.script)) # bytes wrapper to handle memoryview - if hasattr(script, "infos"): - continue - print(data.name) - # translate the localisation - for entry in script["infos"]: - entry["value"] = translate(entry["value"]) - # overwrite the original - data.script = json.dumps( - script, - ensure_ascii=False, indent=4 - ).encode("utf8") - # apply the changes - data.save() - - # save the modified Bundle as file - with open(os.path.join(root, "522608825_patched"), "wb") as f: - f.write(e.file.save()) - - -# simple cache for already translated strings -# prevents requesting the same string multiple times -# therefore saving time and reducing the chance of being IP-blocked -TL_CACHE = {} -def translate(text): - # check if the text is valid - if not text.strip(" "): - return text - # check if the text was already translated once - if text in TL_CACHE: - return TL_CACHE[text] - - # actual google translation - translator = Translator(service_urls=['translate.googleapis.com']) - try: - ret = translator.translate(text, "en", "ja").text - TL_CACHE[text] = ret - return ret - except json.JSONDecodeError: - input("DecodeError") - return translate(text) - except (ConnectionError, AttributeError) as e: - print(e) - time.sleep(1) - return translate(text) - -if __name__ == "__main__": - main() diff --git a/examples/CustomMonoBehaviour/data.unity3d b/examples/CustomMonoBehaviour/data.unity3d deleted file mode 100644 index 85abee47d..000000000 Binary files a/examples/CustomMonoBehaviour/data.unity3d and /dev/null differ diff --git a/examples/CustomMonoBehaviour/get_scriptable_texture.py b/examples/CustomMonoBehaviour/get_scriptable_texture.py deleted file mode 100644 index 06ba8e738..000000000 --- a/examples/CustomMonoBehaviour/get_scriptable_texture.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -This example shows how to write a custom MonoBehaviour class. - - -The script is for a game that generates its encryption key based on a specific image. -This image is linked to by a MonoBheaviour called "ScriptableTexture2D". -It is linked to by a pointer after the default MonoBehaviour structure. -This intel was acquired from the assembly of the game. - -Unfortunately, the asset doesn't have a type-tree, so the default MonoBehaviour class can't find the pointer. -So a custom MonoBehaviour class is required to get the pointer comfortably. -Doing so is simple, as seen in the following code. -""" - -import os -import UnityPy -from UnityPy.classes import MonoBehaviour, PPtr - -class ScriptableTexture2D(MonoBehaviour): - def __init__(self, reader): - # calls the default MonoBehaviour init - super().__init__(reader=reader) - # here goes the implementation of the extra data - self.texture = PPtr(reader) - -# set the path for the target file -root = os.path.dirname(os.path.realpath(__file__)) -fp = os.path.join(root,"data.unity3d") - -env = UnityPy.load(fp) - -# find the correct asset -for obj in env.objects: - if obj.type == "MonoBehaviour": - data = obj.read() - if data.name == "ScriptableTexture2D": - # correct obj found - # lets read it with the custom class - st = ScriptableTexture2D(obj) - # read the linked image and save it - tex = st.texture.read() - print(st.texture.read().name) - #tex.image.save(os.path.join(root, f"{tex.name}.png")) \ No newline at end of file diff --git a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.deps.json b/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.deps.json deleted file mode 100644 index b1b654e8f..000000000 --- a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.deps.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v3.1/win-x64", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v3.1": {}, - ".NETCoreApp,Version=v3.1/win-x64": { - "TypeTreeGenerator/1.0.0": { - "dependencies": { - "ILRepack": "2.0.18", - "ILRepack.Lib.MSBuild.Task": "2.0.18.2", - "Mono.Cecil": "0.11.3" - }, - "runtime": { - "TypeTreeGenerator.dll": {} - } - }, - "ILRepack/2.0.18": {}, - "ILRepack.Lib.MSBuild.Task/2.0.18.2": {}, - "Mono.Cecil/0.11.3": { - "runtime": { - "lib/netstandard2.0/Mono.Cecil.Mdb.dll": { - "assemblyVersion": "0.11.3.0", - "fileVersion": "0.11.3.0" - }, - "lib/netstandard2.0/Mono.Cecil.Pdb.dll": { - "assemblyVersion": "0.11.3.0", - "fileVersion": "0.11.3.0" - }, - "lib/netstandard2.0/Mono.Cecil.Rocks.dll": { - "assemblyVersion": "0.11.3.0", - "fileVersion": "0.11.3.0" - }, - "lib/netstandard2.0/Mono.Cecil.dll": { - "assemblyVersion": "0.11.3.0", - "fileVersion": "0.11.3.0" - } - } - } - } - }, - "libraries": { - "TypeTreeGenerator/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "ILRepack/2.0.18": { - "type": "package", - "serviceable": true, - "sha512": "sha512-sR5Aj3JLDbA8JwESfWYfigSz5k1oNSHPN434W1LX8sboWJYEOSQP/KkvZGmJKPgajzSUKkl2jDar3LPZiMFU4Q==", - "path": "ilrepack/2.0.18", - "hashPath": "ilrepack.2.0.18.nupkg.sha512" - }, - "ILRepack.Lib.MSBuild.Task/2.0.18.2": { - "type": "package", - "serviceable": true, - "sha512": "sha512-lreK19MMDA/ekeqjLY4w171cG7+pHwjeTMHMNq6tghuhTOIOfHT+b/LTMj5jpfbJoR7J6AMD3yOYZoyY/2wtJA==", - "path": "ilrepack.lib.msbuild.task/2.0.18.2", - "hashPath": "ilrepack.lib.msbuild.task.2.0.18.2.nupkg.sha512" - }, - "Mono.Cecil/0.11.3": { - "type": "package", - "serviceable": true, - "sha512": "sha512-DNYE+io5XfEE8+E+5padThTPHJARJHbz1mhbhMPNrrWGKVKKqj/KEeLvbawAmbIcT73NuxLV7itHZaYCZcVWGg==", - "path": "mono.cecil/0.11.3", - "hashPath": "mono.cecil.0.11.3.nupkg.sha512" - } - } -} \ No newline at end of file diff --git a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.dll b/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.dll deleted file mode 100644 index f9df54396..000000000 Binary files a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.dll and /dev/null differ diff --git a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.pdb b/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.pdb deleted file mode 100644 index 527ffa1a2..000000000 Binary files a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.pdb and /dev/null differ diff --git a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.dev.json b/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.dev.json deleted file mode 100644 index 4a6bcc1f4..000000000 --- a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.dev.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "runtimeOptions": { - "additionalProbingPaths": [ - "C:\\Users\\W0lf\\.dotnet\\store\\|arch|\\|tfm|", - "C:\\Users\\W0lf\\.nuget\\packages" - ] - } -} \ No newline at end of file diff --git a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.json b/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.json deleted file mode 100644 index bc456d786..000000000 --- a/examples/MonoBehaviourFromAssembly/TypeTreeGenerator/TypeTreeGenerator.runtimeconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "runtimeOptions": { - "tfm": "netcoreapp3.1", - "framework": { - "name": "Microsoft.NETCore.App", - "version": "3.1.0" - } - } -} \ No newline at end of file diff --git a/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py b/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py deleted file mode 100644 index 63e54712a..000000000 --- a/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py +++ /dev/null @@ -1,170 +0,0 @@ -# py3 -# requirements: -# pythonnet 3+ -# pip install git+https://github.com/pythonnet/pythonnet/ -# TypeTreeGenerator -# https://github.com/K0lb3/TypeTreeGenerator -# requires .NET 5.0 SDK -# https://dotnet.microsoft.com/download/dotnet/5.0 -# -# pythonnet 2 and TypeTreeGenerator created with net4.8 works on Windows, -# so it can do without pythonnet_init, -# all other systems need pythonnet 3 and either .net 5 or .net core 3 and pythonnet_init - - -############################ -# -# Warning: This example isn't for beginners -# -############################ - -import os -import UnityPy -from typing import Dict -import json - -ROOT = os.path.dirname(os.path.realpath(__file__)) -TYPETREE_GENERATOR_PATH = os.path.join(ROOT, "TypeTreeGenerator") - -def main(): - # dump the trees for all classes in the assembly - dll_folder = os.path.join(ROOT, "DummyDll") - tree_path = os.path.join(ROOT, "assembly_typetrees.json") - trees = dump_assembly_trees(dll_folder, tree_path) - # by dumping it as json, it can be redistributed, - # so that other people don't have to setup pythonnet3 - # People who don't like to share their decrypted dlls could also share the relevant structures this way. - - export_monobehaviours(asset_path, trees) - -def export_monobehaviours(asset_path: str, trees: dict): - for r, d, fs in os.walk(asset_path): - for f in fs: - try: - env = UnityPy.load(os.path.join(r, f)) - except: - continue - for obj in env.objects: - if obj.type == "MonoBehaviour": - if obj.serialized_type and obj.serialized_type.node: - tree = obj.read_typetree() - else: - d = obj.read(check_read=False) - if not d.m_Script: - continue - # RIP, no referenced script - # can only dump raw - script = d.m_Script.read() - # on-demand solution without already dumped tree - #nodes = generate_tree( - # g, script.m_AssemblyName, script.m_ClassName, script.m_Namespace - #) - if script.m_ClassName not in trees: - # class not found in known trees, - # might have to add the classes of the other dlls - continue - nodes = FakeNode(**trees[script.m_ClassName]) - tree = obj.read_typetree(nodes) - - # save tree as json whereever you like - - - -def dump_assembly_trees(dll_folder: str, out_path: str): - # init pythonnet, so that it uses the correct .net for the generator - pythonnet_init() - # create generator - g = create_generator(dll_folder) - - # generate a typetree for all existing classes in the Assembly-CSharp - # while this could also be done dynamically for each required class, - # it's faster and easier overall to just fetch all at once - trees = generate_tree(g, "Assembly-CSharp.dll", "", "") - - if out_path: - with open("typetrees.json", "wt", encoding="utf8") as f: - json.dump(trees, f, ensure_ascii=False) - return trees - - - -def pythonnet_init(): - """correctly sets-up pythonnet for the typetree generator""" - # prepare correct runtime - from clr_loader import get_coreclr - from pythonnet import set_runtime - - rt = get_coreclr( - os.path.join(TYPETREE_GENERATOR_PATH, "TypeTreeGenerator.runtimeconfig.json") - ) - set_runtime(rt) - - -def create_generator(dll_folder: str): - """Loads TypeTreeGenerator library and returns an instance of the Generator class.""" - # temporarily add the typetree generator dir to paths, - # so that pythonnet can find its files - import sys - - sys.path.append(TYPETREE_GENERATOR_PATH) - - # - import clr - - clr.AddReference("TypeTreeGenerator") - - # import Generator class from the loaded library - from Generator import Generator - - # create an instance of the Generator class - g = Generator() - # load the dll folder into the generator - g.loadFolder(dll_folder) - return g - - -class FakeNode: - """A fake/minimal Node class for use in UnityPy.""" - - def __init__(self, **kwargs): - self.__dict__.update(**kwargs) - - -def generate_tree( - g: "Generator", - assembly: str, - class_name: str, - namespace: str, - unity_version=[2018, 4, 3, 1], -) -> Dict[str, Dict]: - """Generates the typetree structure / nodes for the specified class.""" - # C# System - from System import Array - - unity_version_cs = Array[int](unity_version) - - # fetch all type definitions - def_iter = g.getTypeDefs(assembly, class_name, namespace) - - # create the nodes - trees = {} - for d in def_iter: - try: - nodes = g.convertToTypeTreeNodes(d, unity_version_cs) - except Exception as e: - # print(d.Name, e) - continue - trees[d.Name] = [ - { - "level" : node.m_Level, - "type" : node.m_Type, - "name" : node.m_Name, - "meta_flag" : node.m_MetaFlag, - } - for node in nodes - ] - return trees - - -if __name__ == "__main__": - main() diff --git a/examples/rebundle.py b/examples/rebundle.py deleted file mode 100644 index 9e223aa83..000000000 --- a/examples/rebundle.py +++ /dev/null @@ -1,138 +0,0 @@ -""" -This script shows how to create a bundle from dumped assets from the memory. - -The dumped assets consist of SerializedFiles and their resources(cabs). -A sample file of the original game is required for this script. -This example uses the globalgamemanager as this asset should exist in all Unity games. -""" - -import os -import uuid -import random -from copy import copy -import re - -import UnityPy -from UnityPy.enums import ClassIDType -from UnityPy.files import BundleFile -from UnityPy.files.SerializedFile import FileIdentifier, ObjectReader, SerializedType - - -SERIALIZED_PATH = r"globalgamemanagers" -DATA_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), "data") - - -def main(): - bf = Fake( - signature="UnityFS", - version=6, - format=6, - version_engine="2017.4.30f1", - version_player="5.x.x", - _class=BundleFile, - files={}, - ) - # load default serialized file and prepare some variables for easier access to key objects - env = UnityPy.load(SERIALIZED_PATH) - sf = env.file # serialized file - or_bp = list(sf.objects.values())[0].__dict__ # object data - - bf.files["serialized_file"] = sf - sf.flags = 4 - - # remove all unnesessary stuff - for key in list(sf.objects.keys()): - del sf.objects[key] - sf.externals = [] - - # add all files from DATA_PATH - for root, dirs, files in os.walk(DATA_PATH): - for f in files: - fp = os.path.join(root, f) - if f[:3] == "CAB": - add_cab(bf, sf, root, f) - else: - add_object(sf, fp, or_bp) - - # save edited bundle - open("bundle_edited.unity3d", "wb").write(bf.save()) - - -def add_cab(bf, sf, root, f): - fp = os.path.join(root, f) - bf.files[f] = Fake(data=open(fp, "rb").read(), flags=4) - sf.externals.append( - Fake( - temp_empty="", - guid=generate_16_byte_uid(), - path=f"archive:/{os.path.basename(root)}/{f}", - type=0, - _class=FileIdentifier, - ) - ) - - -def add_object(sf, fp, or_bp): - # get correct type id - path_id, class_name = os.path.splitext(os.path.basename(fp)) - path_id = int(path_id) if re.match( - r"^\d+$", path_id) else generate_path_id(sf.objects) - class_id = getattr( - ClassIDType, class_name[1:], ClassIDType.UnknownType).value - type_id = -1 - for i, styp in enumerate(sf.types): - if styp.class_id == class_id: - type_id = i - if type_id == -1: # not found, add type - type_id = len(sf.types) - sf.types.append( - Fake( - class_id=class_id, - is_stripped_type=False, - node=[], - script_type_index=-1, - old_type_hash=generate_16_byte_uid(), - _class=SerializedType, - ) - ) - - # add new object - odata = copy(or_bp) - odata.update( - { - "data": open(fp, "rb").read(), - "path_id": generate_path_id(sf.objects), - "class_id": class_id, - "type_id": type_id, - } - ) - sf.objects[path_id] = Fake(**odata, _class=ObjectReader) - - -def generate_path_id(objects): - while True: - uid = random.randint(-(2 ** 16), 2 ** 16 - 1) - if uid not in objects: - return uid - - -def generate_16_byte_uid(): - return uuid.uuid1().urn[-16:].encode("ascii") - - -class Fake(object): - """ - fake class for easy class creation without init call - """ - - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - if "_class" in kwargs: - self.__class__ = kwargs["_class"] - - def save(self): - return self.data - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ccc32de8e..cad2658f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,13 +8,13 @@ authors = [{ name = "Rudolf Kolbe", email = "rkolbe96@gmail.com" }] description = "A Unity extraction and patching package" readme = "README.md" license = { file = "LICENSE" } -requires-python = ">=3.7" +requires-python = ">=3.8" keywords = [ "python", "unity", "unity-asset", "python3", - "data-minig", + "data-mining", "unitypack", "assetstudio", "unity-asset-extractor", @@ -26,12 +26,13 @@ classifiers = [ "Development Status :: 5 - Production/Stable", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Games/Entertainment", "Topic :: Multimedia :: Graphics", @@ -42,18 +43,30 @@ dependencies = [ "brotli", # WebFile compression # Texture & Sprite handling "Pillow", - "texture2ddecoder", # texture decompression - "etcpak", # ETC & DXT compression - "astc-encoder-py >= 0.1.8", # ASTC compression + "texture2ddecoder >= 1.0.5", # texture decompression + "etcpak", # ETC & DXT compression + "astc-encoder-py >= 0.1.12", # ASTC compression # audio extraction - "pyfmodex >= 0.7.1", + "fmod_toolkit", # filesystem handling "fsspec", # better classes "attrs", + # tpk handling + "tpk_ar" ] dynamic = ["version"] +[project.scripts] +UnityPy = "UnityPy.cli:main" + +[project.optional-dependencies] +# optional dependencies must be lowercase/normalized +ttgen = ["typetreegeneratorapi>=0.0.10"] +full = ["unitypy[ttgen]"] +tests = ["pytest", "pillow", "psutil", "unitypy[full]"] +dev = ["ruff", "unitypy[tests]"] + [project.urls] "Homepage" = "https://github.com/K0lb3/UnityPy" "Bug Tracker" = "https://github.com/K0lb3/UnityPy/issues" @@ -61,9 +74,6 @@ dynamic = ["version"] [tool.setuptools.dynamic] version = { attr = "UnityPy.__version__" } -[project.optional-dependencies] -tests = ["pytest", "pillow", "psutil"] - [tool.pytest.ini_options] testpaths = ["tests"] @@ -76,3 +86,6 @@ archs = ["x86_64", "arm64"] [tool.cibuildwheel.windows] archs = ["AMD64", "x86", "ARM64"] + +[tool.pyright] +pythonVersion = "3.8" diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 000000000..db2f2b3f3 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,33 @@ +target-version = "py38" +include = [ + "UnityPy/*.py", + "UnityPy/*.pyi", + "tests/*py", + "setup.py", + "generators/*.py", + "examples/*.py", +] +exclude = ["UnityPy/classes/generated.py"] +line-length = 120 + +[lint] +select = [ + # pycodestyle + "E", + # Pyflakes + "F", + # flake8-bugbear + "B", + # isort + "I", +] + +[lint.pydocstyle] +# Enforce numpy-style docstrings +convention = "numpy" + +[lint.per-file-ignores] +# Ignore docstring requirements for test files +"tests/**/*.py" = ["D"] +# Ignore undefined names +"UnityPy/streams/EndianBinaryReader.py" = ["F821"] diff --git a/setup.py b/setup.py index fe64ae311..5ca47e178 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os import re import subprocess -from typing import Union +from typing import Literal, cast, get_args from setuptools import Extension, find_packages, setup from setuptools.command.build_ext import build_ext @@ -10,8 +10,10 @@ try: from setuptools.command.bdist_wheel import bdist_wheel except ImportError: - from wheel.bdist_wheel import bdist_wheel + from wheel.bdist_wheel import bdist_wheel # type: ignore +System = Literal["Windows", "Linux", "Darwin"] +Arch = Literal["x64", "x86", "arm", "arm64", "x86_64"] INSTALL_DIR = os.path.dirname(os.path.realpath(__file__)) UNITYPYBOOST_DIR = os.path.join(INSTALL_DIR, "UnityPyBoost") @@ -36,10 +38,7 @@ def build_extensions(self): if version is None: raise Exception("Failed to determine compiler version") version = int(version.group(1)) - if version < 10: - cpp_version_flag = "-std=c++2a" - else: - cpp_version_flag = "-std=c++20" + cpp_version_flag = "-std=c++2a" if version < 10 else "-std=c++20" else: cpp_version_flag = "-std=c++20" @@ -52,7 +51,7 @@ def build_extensions(self): class SDist(sdist): def make_distribution(self) -> None: # add all fmod libraries to the distribution - for root, dirs, files in os.walk("UnityPy/lib/FMOD"): + for root, _dirs, files in os.walk("UnityPy/lib/FMOD"): for file in files: fp = f"{root}/{file}" if fp not in self.filelist.files: @@ -74,9 +73,7 @@ def make_distribution(self) -> None: } -def get_fmod_path( - system: Union["Windows", "Linux", "Darwin"], arch: ["x64", "x86", "arm", "arm64"] -) -> str: +def get_fmod_path(system: System, arch: Arch) -> str: if system == "Darwin": # universal dylib return "lib/FMOD/Darwin/libfmod.dylib" @@ -92,7 +89,7 @@ def get_fmod_path( raise NotImplementedError(f"Unsupported system: {system}") -class BDistWheel(bdist_wheel): +class BDistWheel(bdist_wheel): # type: ignore def run(self): platform_tag = self.get_tag()[2] if platform_tag.startswith("win"): @@ -103,37 +100,22 @@ def run(self): (v for k, v in BDIST_TAG_FMOD_MAP.items() if platform_tag.endswith(k)), None, ) - if platform_tag.startswith("macosx"): - system = "Darwin" - else: - system = "Linux" - - try: - self.distribution.package_data["UnityPy"].append( - get_fmod_path(system, arch) - ) - except NotImplementedError: - pass + system = "Darwin" if platform_tag.startswith("macosx") else "Linux" + + if arch and arch in get_args(Arch): + self.distribution.package_data["UnityPy"].append(get_fmod_path(system, cast(Arch, arch))) super().run() setup( name="UnityPy", packages=find_packages(), - package_data={"UnityPy": ["resources/uncompressed.tpk"]}, + package_data={"UnityPy": ["resources/lzma.tpk"]}, ext_modules=[ Extension( "UnityPy.UnityPyBoost", - [ - f"UnityPyBoost/{f}" - for f in os.listdir(UNITYPYBOOST_DIR) - if f.endswith(".cpp") - ], - depends=[ - f"UnityPyBoost/{f}" - for f in os.listdir(UNITYPYBOOST_DIR) - if f.endswith(".hpp") - ], + [f"UnityPyBoost/{f}" for f in os.listdir(UNITYPYBOOST_DIR) if f.endswith(".cpp")], + depends=[f"UnityPyBoost/{f}" for f in os.listdir(UNITYPYBOOST_DIR) if f.endswith(".hpp")], language="c++", include_dirs=[UNITYPYBOOST_DIR], ) diff --git a/tests/samples/atlas_test b/tests/samples/atlas_test index faa7e996c..979701586 100644 Binary files a/tests/samples/atlas_test and b/tests/samples/atlas_test differ diff --git a/tests/samples/banner_1 b/tests/samples/banner_1 index 132d0e3bb..de0f8dff4 100644 Binary files a/tests/samples/banner_1 and b/tests/samples/banner_1 differ diff --git a/tests/samples/char_118_yuki.ab b/tests/samples/char_118_yuki.ab index dda9c41a1..9c8d21674 100644 Binary files a/tests/samples/char_118_yuki.ab and b/tests/samples/char_118_yuki.ab differ diff --git a/tests/samples/xinzexi_2_n_tex b/tests/samples/xinzexi_2_n_tex index e80f3c811..4c21cba5a 100644 Binary files a/tests/samples/xinzexi_2_n_tex and b/tests/samples/xinzexi_2_n_tex differ diff --git a/tests/samples/xinzexi_2_n_tex_mesh b/tests/samples/xinzexi_2_n_tex_mesh index b02316231..785dbd862 100644 --- a/tests/samples/xinzexi_2_n_tex_mesh +++ b/tests/samples/xinzexi_2_n_tex_mesh @@ -1,1812 +1,3 @@ -g xinzexi_2_n-mesh -v -1152 671 0 -v -1152 1343 0 -v -1440 1343 0 -v -1440 671 0 -v -1152 31 0 -v -1152 671 0 -v -1440 671 0 -v -1440 31 0 -v -832 607 0 -v -832 927 0 -v -1152 927 0 -v -1152 607 0 -v -512 607 0 -v -512 927 0 -v -832 927 0 -v -832 607 0 -v -64 319 0 -v -64 607 0 -v -384 607 0 -v -384 319 0 -v -384 319 0 -v -384 607 0 -v -672 607 0 -v -672 319 0 -v -960 927 0 -v -960 1215 0 -v -1152 1215 0 -v -1152 927 0 -v -960 1215 0 -v -960 1503 0 -v -1152 1503 0 -v -1152 1215 0 -v -1440 735 0 -v -1440 991 0 -v -1632 991 0 -v -1632 735 0 -v -1440 991 0 -v -1440 1247 0 -v -1632 1247 0 -v -1632 991 0 -v -704 223 0 -v -704 479 0 -v -832 479 0 -v -832 223 0 -v -1440 1247 0 -v -1440 1407 0 -v -1632 1407 0 -v -1632 1247 0 -v -1152 1343 0 -v -1152 1503 0 -v -1312 1503 0 -v -1312 1343 0 -v -1632 1663 0 -v -1632 2047 0 -v -1696 2047 0 -v -1696 1663 0 -v -1632 1311 0 -v -1632 1663 0 -v -1696 1663 0 -v -1696 1311 0 -v -992 1503 0 -v -992 1599 0 -v -1216 1599 0 -v -1216 1503 0 -v -1440 223 0 -v -1440 447 0 -v -1536 447 0 -v -1536 223 0 -v -800 479 0 -v -800 607 0 -v -960 607 0 -v -960 479 0 -v -800 927 0 -v -800 1055 0 -v -960 1055 0 -v -960 927 0 -v -1024 95 0 -v -1024 255 0 -v -1152 255 0 -v -1152 95 0 -v -1440 31 0 -v -1440 223 0 -v -1536 223 0 -v -1536 31 0 -v -192 191 0 -v -192 255 0 -v -448 255 0 -v -448 191 0 -v -448 191 0 -v -448 255 0 -v -704 255 0 -v -704 191 0 -v -832 1311 0 -v -832 1439 0 -v -928 1439 0 -v -928 1311 0 -v -800 1599 0 -v -800 1727 0 -v -896 1727 0 -v -896 1599 0 -v -1632 1055 0 -v -1632 1183 0 -v -1728 1183 0 -v -1728 1055 0 -v -256 607 0 -v -256 703 0 -v -384 703 0 -v -384 607 0 -v -1632 927 0 -v -1632 1055 0 -v -1728 1055 0 -v -1728 927 0 -v -384 607 0 -v -384 703 0 -v -512 703 0 -v -512 607 0 -v -1600 31 0 -v -1600 159 0 -v -1696 159 0 -v -1696 31 0 -v -1600 159 0 -v -1600 287 0 -v -1696 287 0 -v -1696 159 0 -v -1888 735 0 -v -1888 895 0 -v -1937 895 0 -v -1937 735 0 -v -1760 959 0 -v -1760 1055 0 -v -1856 1055 0 -v -1856 959 0 -v -896 1535 0 -v -896 1631 0 -v -992 1631 0 -v -992 1535 0 -v -128 287 0 -v -128 319 0 -v -416 319 0 -v -416 287 0 -v -416 287 0 -v -416 319 0 -v -704 319 0 -v -704 287 0 -v -1888 607 0 -v -1888 735 0 -v -1937 735 0 -v -1937 607 0 -v -1408 1503 0 -v -1408 1567 0 -v -1536 1567 0 -v -1536 1503 0 -v -1344 1407 0 -v -1344 1535 0 -v -1408 1535 0 -v -1408 1407 0 -v -0 415 0 -v -0 543 0 -v -64 543 0 -v -64 415 0 -v -1088 479 0 -v -1088 607 0 -v -1152 607 0 -v -1152 479 0 -v -1536 31 0 -v -1536 223 0 -v -1568 223 0 -v -1568 31 0 -v -1536 1503 0 -v -1536 1567 0 -v -1632 1567 0 -v -1632 1503 0 -v -1536 223 0 -v -1536 415 0 -v -1568 415 0 -v -1568 223 0 -v -1696 159 0 -v -1696 255 0 -v -1760 255 0 -v -1760 159 0 -v -768 1343 0 -v -768 1407 0 -v -832 1407 0 -v -832 1343 0 -v -448 831 0 -v -448 895 0 -v -512 895 0 -v -512 831 0 -v -1280 0 0 -v -1280 31 0 -v -1408 31 0 -v -1408 0 0 -v -1440 1439 0 -v -1440 1503 0 -v -1504 1503 0 -v -1504 1439 0 -v -1472 671 0 -v -1472 735 0 -v -1536 735 0 -v -1536 671 0 -v -1792 479 0 -v -1792 543 0 -v -1856 543 0 -v -1856 479 0 -v -320 703 0 -v -320 767 0 -v -384 767 0 -v -384 703 0 -v -448 703 0 -v -448 767 0 -v -512 767 0 -v -512 703 0 -v -1568 319 0 -v -1568 447 0 -v -1600 447 0 -v -1600 319 0 -v -1856 863 0 -v -1856 991 0 -v -1888 991 0 -v -1888 863 0 -v -1696 95 0 -v -1696 159 0 -v -1760 159 0 -v -1760 95 0 -v -1568 191 0 -v -1568 319 0 -v -1600 319 0 -v -1600 191 0 -v -160 255 0 -v -160 287 0 -v -288 287 0 -v -288 255 0 -v -832 351 0 -v -832 479 0 -v -864 479 0 -v -864 351 0 -v -288 255 0 -v -288 287 0 -v -416 287 0 -v -416 255 0 -v -672 383 0 -v -672 479 0 -v -704 479 0 -v -704 383 0 -v -1440 639 0 -v -1440 735 0 -v -1472 735 0 -v -1472 639 0 -v -928 1119 0 -v -928 1215 0 -v -960 1215 0 -v -960 1119 0 -v -1856 767 0 -v -1856 863 0 -v -1888 863 0 -v -1888 767 0 -v -1568 63 0 -v -1568 159 0 -v -1600 159 0 -v -1600 63 0 -v -832 255 0 -v -832 351 0 -v -864 351 0 -v -864 255 0 -v -1696 415 0 -v -1696 447 0 -v -1792 447 0 -v -1792 415 0 -v -512 255 0 -v -512 287 0 -v -608 287 0 -v -608 255 0 -v -704 927 0 -v -704 959 0 -v -800 959 0 -v -800 927 0 -v -1600 415 0 -v -1600 447 0 -v -1696 447 0 -v -1696 415 0 -v -608 927 0 -v -608 959 0 -v -704 959 0 -v -704 927 0 -v -1408 0 0 -v -1408 31 0 -v -1504 31 0 -v -1504 0 0 -v -1696 1791 0 -v -1696 1887 0 -v -1728 1887 0 -v -1728 1791 0 -v -1408 1407 0 -v -1408 1503 0 -v -1440 1503 0 -v -1440 1407 0 -v -608 255 0 -v -608 287 0 -v -704 287 0 -v -704 255 0 -v -1696 1887 0 -v -1696 1983 0 -v -1728 1983 0 -v -1728 1887 0 -v -1600 1599 0 -v -1600 1663 0 -v -1632 1663 0 -v -1632 1599 0 -v -768 511 0 -v -768 575 0 -v -800 575 0 -v -800 511 0 -v -1504 1471 0 -v -1504 1503 0 -v -1568 1503 0 -v -1568 1471 0 -v -1216 1567 0 -v -1216 1599 0 -v -1280 1599 0 -v -1280 1567 0 -v -832 1567 0 -v -832 1599 0 -v -896 1599 0 -v -896 1567 0 -v -672 543 0 -v -672 607 0 -v -704 607 0 -v -704 543 0 -v -1440 479 0 -v -1440 543 0 -v -1472 543 0 -v -1472 479 0 -v -416 799 0 -v -416 863 0 -v -448 863 0 -v -448 799 0 -v -384 767 0 -v -384 831 0 -v -416 831 0 -v -416 767 0 -v -1632 383 0 -v -1632 415 0 -v -1696 415 0 -v -1696 383 0 -v -768 1663 0 -v -768 1727 0 -v -800 1727 0 -v -800 1663 0 -v -896 1631 0 -v -896 1695 0 -v -928 1695 0 -v -928 1631 0 -v -1760 223 0 -v -1760 287 0 -v -1792 287 0 -v -1792 223 0 -v -1728 31 0 -v -1728 95 0 -v -1760 95 0 -v -1760 31 0 -v -1120 255 0 -v -1120 319 0 -v -1152 319 0 -v -1152 255 0 -v -1792 223 0 -v -1792 287 0 -v -1824 287 0 -v -1824 223 0 -v -864 415 0 -v -864 479 0 -v -896 479 0 -v -896 415 0 -v -32 351 0 -v -32 415 0 -v -64 415 0 -v -64 351 0 -v -1088 63 0 -v -1088 95 0 -v -1152 95 0 -v -1152 63 0 -v -1600 0 0 -v -1600 31 0 -v -1664 31 0 -v -1664 0 0 -v -960 191 0 -v -960 255 0 -v -992 255 0 -v -992 191 0 -v -480 159 0 -v -480 191 0 -v -544 191 0 -v -544 159 0 -v -1888 543 0 -v -1888 607 0 -v -1920 607 0 -v -1920 543 0 -v -512 1087 0 -v -512 1151 0 -v -544 1151 0 -v -544 1087 0 -v -896 1055 0 -v -896 1119 0 -v -928 1119 0 -v -928 1055 0 -v -1600 1439 0 -v -1600 1503 0 -v -1632 1503 0 -v -1632 1439 0 -v -1632 1247 0 -v -1632 1311 0 -v -1664 1311 0 -v -1664 1247 0 -v -1888 895 0 -v -1888 959 0 -v -1920 959 0 -v -1920 895 0 -v -960 543 0 -v -960 607 0 -v -992 607 0 -v -992 543 0 -v -1760 1055 0 -v -1760 1119 0 -v -1792 1119 0 -v -1792 1055 0 -v -768 959 0 -v -768 1023 0 -v -800 1023 0 -v -800 959 0 -v -1824 895 0 -v -1824 959 0 -v -1856 959 0 -v -1856 895 0 -v -928 1343 0 -v -928 1407 0 -v -960 1407 0 -v -960 1343 0 -v -1504 1407 0 -v -1504 1439 0 -v -1568 1439 0 -v -1568 1407 0 -v -1312 1375 0 -v -1312 1439 0 -v -1344 1439 0 -v -1344 1375 0 -v -928 1407 0 -v -928 1471 0 -v -960 1471 0 -v -960 1407 0 -v -1728 1087 0 -v -1728 1151 0 -v -1760 1151 0 -v -1760 1087 0 -v -192 607 0 -v -192 639 0 -v -256 639 0 -v -256 607 0 -v -1856 575 0 -v -1856 639 0 -v -1888 639 0 -v -1888 575 0 -v -1728 1023 0 -v -1728 1087 0 -v -1760 1087 0 -v -1760 1023 0 -v -128 607 0 -v -128 639 0 -v -192 639 0 -v -192 607 0 -v -1312 1439 0 -v -1312 1503 0 -v -1344 1503 0 -v -1344 1439 0 -v -1440 575 0 -v -1440 639 0 -v -1472 639 0 -v -1472 575 0 -v -672 319 0 -v -672 383 0 -v -704 383 0 -v -704 319 0 -v -1408 1343 0 -v -1408 1407 0 -v -1440 1407 0 -v -1440 1343 0 -v -928 1055 0 -v -928 1119 0 -v -960 1119 0 -v -960 1055 0 -v -1568 0 0 -v -1568 63 0 -v -1600 63 0 -v -1600 0 0 -v -1504 1567 0 -v -1504 1599 0 -v -1568 1599 0 -v -1568 1567 0 -v -1568 1567 0 -v -1568 1599 0 -v -1632 1599 0 -v -1632 1567 0 -v -1696 1631 0 -v -1696 1695 0 -v -1728 1695 0 -v -1728 1631 0 -v -1696 1567 0 -v -1696 1631 0 -v -1728 1631 0 -v -1728 1567 0 -v -1856 511 0 -v -1856 575 0 -v -1888 575 0 -v -1888 511 0 -v -1600 287 0 -v -1600 351 0 -v -1632 351 0 -v -1632 287 0 -v -1568 1407 0 -v -1568 1439 0 -v -1632 1439 0 -v -1632 1407 0 -v -1600 351 0 -v -1600 415 0 -v -1632 415 0 -v -1632 351 0 -v -1152 1599 0 -v -1152 1631 0 -v -1216 1631 0 -v -1216 1599 0 -v -992 159 0 -v -992 223 0 -v -1024 223 0 -v -1024 159 0 -v -992 223 0 -v -992 287 0 -v -1024 287 0 -v -1024 223 0 -v -1760 447 0 -v -1760 479 0 -v -1824 479 0 -v -1824 447 0 -v -1120 351 0 -v -1120 415 0 -v -1152 415 0 -v -1152 351 0 -v -1120 415 0 -v -1120 479 0 -v -1152 479 0 -v -1152 415 0 -v -1696 447 0 -v -1696 479 0 -v -1760 479 0 -v -1760 447 0 -v -448 799 0 -v -448 831 0 -v -480 831 0 -v -480 799 0 -v -288 703 0 -v -288 735 0 -v -320 735 0 -v -320 703 0 -v -736 959 0 -v -736 991 0 -v -768 991 0 -v -768 959 0 -v -1792 927 0 -v -1792 959 0 -v -1824 959 0 -v -1824 927 0 -v -1536 703 0 -v -1536 735 0 -v -1568 735 0 -v -1568 703 0 -v -704 575 0 -v -704 607 0 -v -736 607 0 -v -736 575 0 -v -416 703 0 -v -416 735 0 -v -448 735 0 -v -448 703 0 -v -352 767 0 -v -352 799 0 -v -384 799 0 -v -384 767 0 -v -224 639 0 -v -224 671 0 -v -256 671 0 -v -256 639 0 -v -480 767 0 -v -480 799 0 -v -512 799 0 -v -512 767 0 -v -32 543 0 -v -32 575 0 -v -64 575 0 -v -64 543 0 -v -896 351 0 -v -896 383 0 -v -928 383 0 -v -928 351 0 -v -1472 447 0 -v -1472 479 0 -v -1504 479 0 -v -1504 447 0 -v -1632 287 0 -v -1632 319 0 -v -1664 319 0 -v -1664 287 0 -v -1760 0 0 -v -1760 31 0 -v -1792 31 0 -v -1792 0 0 -v -1024 255 0 -v -1024 287 0 -v -1056 287 0 -v -1056 255 0 -v -1824 543 0 -v -1824 575 0 -v -1856 575 0 -v -1856 543 0 -v -1824 255 0 -v -1824 287 0 -v -1856 287 0 -v -1856 255 0 -v -736 479 0 -v -736 511 0 -v -768 511 0 -v -768 479 0 -v -896 447 0 -v -896 479 0 -v -928 479 0 -v -928 447 0 -v -1760 479 0 -v -1760 511 0 -v -1792 511 0 -v -1792 479 0 -v -1792 1055 0 -v -1792 1087 0 -v -1824 1087 0 -v -1824 1055 0 -v -1440 447 0 -v -1440 479 0 -v -1472 479 0 -v -1472 447 0 -v -768 479 0 -v -768 511 0 -v -800 511 0 -v -800 479 0 -v -1696 383 0 -v -1696 415 0 -v -1728 415 0 -v -1728 383 0 -v -1728 0 0 -v -1728 31 0 -v -1760 31 0 -v -1760 0 0 -v -1760 191 0 -v -1760 223 0 -v -1792 223 0 -v -1792 191 0 -v -1824 863 0 -v -1824 895 0 -v -1856 895 0 -v -1856 863 0 -v -1216 1599 0 -v -1216 1631 0 -v -1248 1631 0 -v -1248 1599 0 -v -416 767 0 -v -416 799 0 -v -448 799 0 -v -448 767 0 -v -672 511 0 -v -672 543 0 -v -704 543 0 -v -704 511 0 -v -384 735 0 -v -384 767 0 -v -416 767 0 -v -416 735 0 -v -928 1631 0 -v -928 1663 0 -v -960 1663 0 -v -960 1631 0 -v -800 1311 0 -v -800 1343 0 -v -832 1343 0 -v -832 1311 0 -v -1376 1343 0 -v -1376 1375 0 -v -1408 1375 0 -v -1408 1343 0 -v -1632 1183 0 -v -1632 1215 0 -v -1664 1215 0 -v -1664 1183 0 -v -864 1055 0 -v -864 1087 0 -v -896 1087 0 -v -896 1055 0 -v -640 1087 0 -v -640 1119 0 -v -672 1119 0 -v -672 1087 0 -v -1248 1535 0 -v -1248 1567 0 -v -1280 1567 0 -v -1280 1535 0 -v -992 1599 0 -v -992 1631 0 -v -1024 1631 0 -v -1024 1599 0 -v -1216 1503 0 -v -1216 1535 0 -v -1248 1535 0 -v -1248 1503 0 -v -1344 1375 0 -v -1344 1407 0 -v -1376 1407 0 -v -1376 1375 0 -v -896 1439 0 -v -896 1471 0 -v -928 1471 0 -v -928 1439 0 -vt 0.00048828125 0.00102460384 -vt 0.00048828125 0.689549208 -vt 0.141113281 0.689549208 -vt 0.141113281 0.00102460384 -vt 0.142089844 0.00102460384 -vt 0.142089844 0.656762302 -vt 0.282714844 0.656762302 -vt 0.282714844 0.00102460384 -vt 0.283691406 0.00102460384 -vt 0.283691406 0.328893423 -vt 0.439941406 0.328893423 -vt 0.439941406 0.00102460384 -vt 0.440917969 0.00102460384 -vt 0.440917969 0.328893423 -vt 0.597167969 0.328893423 -vt 0.597167969 0.00102460384 -vt 0.598144531 0.00102460384 -vt 0.598144531 0.296106577 -vt 0.754394531 0.296106577 -vt 0.754394531 0.00102460384 -vt 0.755371094 0.00102460384 -vt 0.755371094 0.296106577 -vt 0.895996094 0.296106577 -vt 0.895996094 0.00102460384 -vt 0.896972656 0.00102460384 -vt 0.896972656 0.296106577 -vt 0.990722656 0.296106577 -vt 0.990722656 0.00102460384 -vt 0.598144531 0.298155725 -vt 0.598144531 0.593237698 -vt 0.691894531 0.593237698 -vt 0.691894531 0.298155725 -vt 0.692871094 0.298155725 -vt 0.692871094 0.560450792 -vt 0.786621094 0.560450792 -vt 0.786621094 0.298155725 -vt 0.787597656 0.298155725 -vt 0.787597656 0.560450792 -vt 0.881347656 0.560450792 -vt 0.881347656 0.298155725 -vt 0.882324219 0.298155725 -vt 0.882324219 0.560450792 -vt 0.944824219 0.560450792 -vt 0.944824219 0.298155725 -vt 0.283691406 0.330942631 -vt 0.283691406 0.49487704 -vt 0.377441406 0.49487704 -vt 0.377441406 0.330942631 -vt 0.378417969 0.330942631 -vt 0.378417969 0.49487704 -vt 0.456542969 0.49487704 -vt 0.456542969 0.330942631 -vt 0.945800781 0.298155725 -vt 0.945800781 0.691598356 -vt 0.977050781 0.691598356 -vt 0.977050781 0.298155725 -vt 0.457519531 0.330942631 -vt 0.457519531 0.691598356 -vt 0.488769531 0.691598356 -vt 0.488769531 0.330942631 -vt 0.283691406 0.496926248 -vt 0.283691406 0.595286846 -vt 0.393066406 0.595286846 -vt 0.393066406 0.496926248 -vt 0.489746094 0.330942631 -vt 0.489746094 0.560450792 -vt 0.536621094 0.560450792 -vt 0.536621094 0.330942631 -vt 0.489746094 0.5625 -vt 0.489746094 0.693647504 -vt 0.567871094 0.693647504 -vt 0.567871094 0.5625 -vt 0.692871094 0.5625 -vt 0.692871094 0.693647504 -vt 0.770996094 0.693647504 -vt 0.770996094 0.5625 -vt 0.394042969 0.496926248 -vt 0.394042969 0.660860658 -vt 0.456542969 0.660860658 -vt 0.456542969 0.496926248 -vt 0.771972656 0.5625 -vt 0.771972656 0.759221315 -vt 0.818847656 0.759221315 -vt 0.818847656 0.5625 -vt 0.819824219 0.5625 -vt 0.819824219 0.628073812 -vt 0.944824219 0.628073812 -vt 0.944824219 0.5625 -vt 0.819824219 0.63012296 -vt 0.819824219 0.695696712 -vt 0.944824219 0.695696712 -vt 0.944824219 0.63012296 -vt 0.598144531 0.595286846 -vt 0.598144531 0.726434469 -vt 0.645019531 0.726434469 -vt 0.645019531 0.595286846 -vt 0.283691406 0.597336054 -vt 0.283691406 0.728483617 -vt 0.330566406 0.728483617 -vt 0.330566406 0.597336054 -vt 0.331542969 0.597336054 -vt 0.331542969 0.728483617 -vt 0.378417969 0.728483617 -vt 0.378417969 0.597336054 -vt 0.142089844 0.65881145 -vt 0.142089844 0.757172108 -vt 0.204589844 0.757172108 -vt 0.204589844 0.65881145 -vt 0.205566406 0.65881145 -vt 0.205566406 0.789959013 -vt 0.252441406 0.789959013 -vt 0.252441406 0.65881145 -vt 0.394042969 0.662909865 -vt 0.394042969 0.761270523 -vt 0.456542969 0.761270523 -vt 0.456542969 0.662909865 -vt 0.00048828125 0.691598356 -vt 0.00048828125 0.822745919 -vt 0.0473632812 0.822745919 -vt 0.0473632812 0.691598356 -vt 0.0483398438 0.691598356 -vt 0.0483398438 0.822745919 -vt 0.0952148438 0.822745919 -vt 0.0952148438 0.691598356 -vt 0.568847656 0.330942631 -vt 0.568847656 0.49487704 -vt 0.593261719 0.49487704 -vt 0.593261719 0.330942631 -vt 0.945800781 0.693647504 -vt 0.945800781 0.792008162 -vt 0.992675781 0.792008162 -vt 0.992675781 0.693647504 -vt 0.489746094 0.695696712 -vt 0.489746094 0.794057369 -vt 0.536621094 0.794057369 -vt 0.536621094 0.695696712 -vt 0.598144531 0.728483617 -vt 0.598144531 0.761270523 -vt 0.738769531 0.761270523 -vt 0.738769531 0.728483617 -vt 0.771972656 0.761270523 -vt 0.771972656 0.794057369 -vt 0.912597656 0.794057369 -vt 0.912597656 0.761270523 -vt 0.568847656 0.496926248 -vt 0.568847656 0.628073812 -vt 0.593261719 0.628073812 -vt 0.593261719 0.496926248 -vt 0.283691406 0.730532765 -vt 0.283691406 0.796106577 -vt 0.346191406 0.796106577 -vt 0.346191406 0.730532765 -vt 0.0961914062 0.691598356 -vt 0.0961914062 0.822745919 -vt 0.127441406 0.822745919 -vt 0.127441406 0.691598356 -vt 0.457519531 0.693647504 -vt 0.457519531 0.824795067 -vt 0.488769531 0.824795067 -vt 0.488769531 0.693647504 -vt 0.537597656 0.695696712 -vt 0.537597656 0.826844275 -vt 0.568847656 0.826844275 -vt 0.568847656 0.695696712 -vt 0.569824219 0.63012296 -vt 0.569824219 0.826844275 -vt 0.585449219 0.826844275 -vt 0.585449219 0.63012296 -vt 0.142089844 0.759221315 -vt 0.142089844 0.824795067 -vt 0.188964844 0.824795067 -vt 0.188964844 0.759221315 -vt 0.253417969 0.65881145 -vt 0.253417969 0.855532765 -vt 0.269042969 0.855532765 -vt 0.269042969 0.65881145 -vt 0.739746094 0.695696712 -vt 0.739746094 0.794057369 -vt 0.770996094 0.794057369 -vt 0.770996094 0.695696712 -vt 0.913574219 0.697745919 -vt 0.913574219 0.763319671 -vt 0.944824219 0.763319671 -vt 0.944824219 0.697745919 -vt 0.347167969 0.730532765 -vt 0.347167969 0.796106577 -vt 0.378417969 0.796106577 -vt 0.378417969 0.730532765 -vt 0.394042969 0.763319671 -vt 0.394042969 0.796106577 -vt 0.456542969 0.796106577 -vt 0.456542969 0.763319671 -vt 0.598144531 0.763319671 -vt 0.598144531 0.828893423 -vt 0.629394531 0.828893423 -vt 0.629394531 0.763319671 -vt 0.630371094 0.763319671 -vt 0.630371094 0.828893423 -vt 0.661621094 0.828893423 -vt 0.661621094 0.763319671 -vt 0.662597656 0.763319671 -vt 0.662597656 0.828893423 -vt 0.693847656 0.828893423 -vt 0.693847656 0.763319671 -vt 0.694824219 0.763319671 -vt 0.694824219 0.828893423 -vt 0.726074219 0.828893423 -vt 0.726074219 0.763319671 -vt 0.913574219 0.765368819 -vt 0.913574219 0.830942631 -vt 0.944824219 0.830942631 -vt 0.944824219 0.765368819 -vt 0.205566406 0.792008162 -vt 0.205566406 0.923155725 -vt 0.221191406 0.923155725 -vt 0.221191406 0.792008162 -vt 0.222167969 0.792008162 -vt 0.222167969 0.923155725 -vt 0.237792969 0.923155725 -vt 0.237792969 0.792008162 -vt 0.945800781 0.794057369 -vt 0.945800781 0.859631181 -vt 0.977050781 0.859631181 -vt 0.977050781 0.794057369 -vt 0.978027344 0.794057369 -vt 0.978027344 0.925204933 -vt 0.993652344 0.925204933 -vt 0.993652344 0.794057369 -vt 0.739746094 0.796106577 -vt 0.739746094 0.828893423 -vt 0.802246094 0.828893423 -vt 0.802246094 0.796106577 -vt 0.489746094 0.796106577 -vt 0.489746094 0.927254081 -vt 0.505371094 0.927254081 -vt 0.505371094 0.796106577 -vt 0.803222656 0.796106577 -vt 0.803222656 0.828893423 -vt 0.865722656 0.828893423 -vt 0.865722656 0.796106577 -vt 0.506347656 0.796106577 -vt 0.506347656 0.894467235 -vt 0.521972656 0.894467235 -vt 0.521972656 0.796106577 -vt 0.866699219 0.796106577 -vt 0.866699219 0.894467235 -vt 0.882324219 0.894467235 -vt 0.882324219 0.796106577 -vt 0.883300781 0.796106577 -vt 0.883300781 0.894467235 -vt 0.898925781 0.894467235 -vt 0.898925781 0.796106577 -vt 0.283691406 0.798155725 -vt 0.283691406 0.896516383 -vt 0.299316406 0.896516383 -vt 0.299316406 0.798155725 -vt 0.300292969 0.798155725 -vt 0.300292969 0.896516383 -vt 0.315917969 0.896516383 -vt 0.315917969 0.798155725 -vt 0.316894531 0.798155725 -vt 0.316894531 0.896516383 -vt 0.332519531 0.896516383 -vt 0.332519531 0.798155725 -vt 0.333496094 0.798155725 -vt 0.333496094 0.830942631 -vt 0.380371094 0.830942631 -vt 0.380371094 0.798155725 -vt 0.394042969 0.798155725 -vt 0.394042969 0.830942631 -vt 0.440917969 0.830942631 -vt 0.440917969 0.798155725 -vt 0.00048828125 0.824795067 -vt 0.00048828125 0.857581973 -vt 0.0473632812 0.857581973 -vt 0.0473632812 0.824795067 -vt 0.0483398438 0.824795067 -vt 0.0483398438 0.857581973 -vt 0.0952148438 0.857581973 -vt 0.0952148438 0.824795067 -vt 0.142089844 0.826844275 -vt 0.142089844 0.859631181 -vt 0.188964844 0.859631181 -vt 0.188964844 0.826844275 -vt 0.537597656 0.828893423 -vt 0.537597656 0.861680329 -vt 0.584472656 0.861680329 -vt 0.584472656 0.828893423 -vt 0.0961914062 0.824795067 -vt 0.0961914062 0.923155725 -vt 0.111816406 0.923155725 -vt 0.111816406 0.824795067 -vt 0.112792969 0.824795067 -vt 0.112792969 0.923155725 -vt 0.128417969 0.923155725 -vt 0.128417969 0.824795067 -vt 0.598144531 0.830942631 -vt 0.598144531 0.863729477 -vt 0.645019531 0.863729477 -vt 0.645019531 0.830942631 -vt 0.457519531 0.826844275 -vt 0.457519531 0.925204933 -vt 0.473144531 0.925204933 -vt 0.473144531 0.826844275 -vt 0.645996094 0.830942631 -vt 0.645996094 0.896516383 -vt 0.661621094 0.896516383 -vt 0.661621094 0.830942631 -vt 0.662597656 0.830942631 -vt 0.662597656 0.896516383 -vt 0.678222656 0.896516383 -vt 0.678222656 0.830942631 -vt 0.679199219 0.830942631 -vt 0.679199219 0.863729477 -vt 0.710449219 0.863729477 -vt 0.710449219 0.830942631 -vt 0.711425781 0.830942631 -vt 0.711425781 0.863729477 -vt 0.742675781 0.863729477 -vt 0.742675781 0.830942631 -vt 0.743652344 0.830942631 -vt 0.743652344 0.863729477 -vt 0.774902344 0.863729477 -vt 0.774902344 0.830942631 -vt 0.775878906 0.830942631 -vt 0.775878906 0.896516383 -vt 0.791503906 0.896516383 -vt 0.791503906 0.830942631 -vt 0.792480469 0.830942631 -vt 0.792480469 0.896516383 -vt 0.808105469 0.896516383 -vt 0.808105469 0.830942631 -vt 0.809082031 0.830942631 -vt 0.809082031 0.896516383 -vt 0.824707031 0.896516383 -vt 0.824707031 0.830942631 -vt 0.825683594 0.830942631 -vt 0.825683594 0.896516383 -vt 0.841308594 0.896516383 -vt 0.841308594 0.830942631 -vt 0.333496094 0.832991838 -vt 0.333496094 0.865778685 -vt 0.364746094 0.865778685 -vt 0.364746094 0.832991838 -vt 0.842285156 0.830942631 -vt 0.842285156 0.896516383 -vt 0.857910156 0.896516383 -vt 0.857910156 0.830942631 -vt 0.365722656 0.832991838 -vt 0.365722656 0.89856559 -vt 0.381347656 0.89856559 -vt 0.381347656 0.832991838 -vt 0.394042969 0.832991838 -vt 0.394042969 0.89856559 -vt 0.409667969 0.89856559 -vt 0.409667969 0.832991838 -vt 0.410644531 0.832991838 -vt 0.410644531 0.89856559 -vt 0.426269531 0.89856559 -vt 0.426269531 0.832991838 -vt 0.427246094 0.832991838 -vt 0.427246094 0.89856559 -vt 0.442871094 0.89856559 -vt 0.442871094 0.832991838 -vt 0.913574219 0.832991838 -vt 0.913574219 0.89856559 -vt 0.929199219 0.89856559 -vt 0.929199219 0.832991838 -vt 0.253417969 0.857581973 -vt 0.253417969 0.923155725 -vt 0.269042969 0.923155725 -vt 0.269042969 0.857581973 -vt 0.00048828125 0.859631181 -vt 0.00048828125 0.925204933 -vt 0.0161132812 0.925204933 -vt 0.0161132812 0.859631181 -vt 0.0170898438 0.859631181 -vt 0.0170898438 0.892418027 -vt 0.0483398438 0.892418027 -vt 0.0483398438 0.859631181 -vt 0.0493164062 0.859631181 -vt 0.0493164062 0.892418027 -vt 0.0805664062 0.892418027 -vt 0.0805664062 0.859631181 -vt 0.142089844 0.861680329 -vt 0.142089844 0.927254081 -vt 0.157714844 0.927254081 -vt 0.157714844 0.861680329 -vt 0.158691406 0.861680329 -vt 0.158691406 0.894467235 -vt 0.189941406 0.894467235 -vt 0.189941406 0.861680329 -vt 0.945800781 0.861680329 -vt 0.945800781 0.927254081 -vt 0.961425781 0.927254081 -vt 0.961425781 0.861680329 -vt 0.537597656 0.863729477 -vt 0.537597656 0.929303288 -vt 0.553222656 0.929303288 -vt 0.553222656 0.863729477 -vt 0.554199219 0.863729477 -vt 0.554199219 0.929303288 -vt 0.569824219 0.929303288 -vt 0.569824219 0.863729477 -vt 0.570800781 0.863729477 -vt 0.570800781 0.929303288 -vt 0.586425781 0.929303288 -vt 0.586425781 0.863729477 -vt 0.598144531 0.865778685 -vt 0.598144531 0.931352437 -vt 0.613769531 0.931352437 -vt 0.613769531 0.865778685 -vt 0.614746094 0.865778685 -vt 0.614746094 0.931352437 -vt 0.630371094 0.931352437 -vt 0.630371094 0.865778685 -vt 0.679199219 0.865778685 -vt 0.679199219 0.931352437 -vt 0.694824219 0.931352437 -vt 0.694824219 0.865778685 -vt 0.695800781 0.865778685 -vt 0.695800781 0.931352437 -vt 0.711425781 0.931352437 -vt 0.711425781 0.865778685 -vt 0.712402344 0.865778685 -vt 0.712402344 0.931352437 -vt 0.728027344 0.931352437 -vt 0.728027344 0.865778685 -vt 0.729003906 0.865778685 -vt 0.729003906 0.931352437 -vt 0.744628906 0.931352437 -vt 0.744628906 0.865778685 -vt 0.745605469 0.865778685 -vt 0.745605469 0.931352437 -vt 0.761230469 0.931352437 -vt 0.761230469 0.865778685 -vt 0.333496094 0.867827892 -vt 0.333496094 0.900614738 -vt 0.364746094 0.900614738 -vt 0.364746094 0.867827892 -vt 0.0170898438 0.894467235 -vt 0.0170898438 0.960040987 -vt 0.0327148438 0.960040987 -vt 0.0327148438 0.894467235 -vt 0.0336914062 0.894467235 -vt 0.0336914062 0.960040987 -vt 0.0493164062 0.960040987 -vt 0.0493164062 0.894467235 -vt 0.0502929688 0.894467235 -vt 0.0502929688 0.960040987 -vt 0.0659179688 0.960040987 -vt 0.0659179688 0.894467235 -vt 0.158691406 0.896516383 -vt 0.158691406 0.929303288 -vt 0.189941406 0.929303288 -vt 0.189941406 0.896516383 -vt 0.0668945312 0.894467235 -vt 0.0668945312 0.960040987 -vt 0.0825195312 0.960040987 -vt 0.0825195312 0.894467235 -vt 0.506347656 0.896516383 -vt 0.506347656 0.962090135 -vt 0.521972656 0.962090135 -vt 0.521972656 0.896516383 -vt 0.866699219 0.896516383 -vt 0.866699219 0.929303288 -vt 0.897949219 0.929303288 -vt 0.897949219 0.896516383 -vt 0.283691406 0.89856559 -vt 0.283691406 0.964139342 -vt 0.299316406 0.964139342 -vt 0.299316406 0.89856559 -vt 0.300292969 0.89856559 -vt 0.300292969 0.964139342 -vt 0.315917969 0.964139342 -vt 0.315917969 0.89856559 -vt 0.316894531 0.89856559 -vt 0.316894531 0.964139342 -vt 0.332519531 0.964139342 -vt 0.332519531 0.89856559 -vt 0.645996094 0.89856559 -vt 0.645996094 0.964139342 -vt 0.661621094 0.964139342 -vt 0.661621094 0.89856559 -vt 0.662597656 0.89856559 -vt 0.662597656 0.964139342 -vt 0.678222656 0.964139342 -vt 0.678222656 0.89856559 -vt 0.775878906 0.89856559 -vt 0.775878906 0.964139342 -vt 0.791503906 0.964139342 -vt 0.791503906 0.89856559 -vt 0.792480469 0.89856559 -vt 0.792480469 0.931352437 -vt 0.823730469 0.931352437 -vt 0.823730469 0.89856559 -vt 0.824707031 0.89856559 -vt 0.824707031 0.931352437 -vt 0.855957031 0.931352437 -vt 0.855957031 0.89856559 -vt 0.365722656 0.900614738 -vt 0.365722656 0.96618855 -vt 0.381347656 0.96618855 -vt 0.381347656 0.900614738 -vt 0.394042969 0.900614738 -vt 0.394042969 0.96618855 -vt 0.409667969 0.96618855 -vt 0.409667969 0.900614738 -vt 0.410644531 0.900614738 -vt 0.410644531 0.96618855 -vt 0.426269531 0.96618855 -vt 0.426269531 0.900614738 -vt 0.427246094 0.900614738 -vt 0.427246094 0.96618855 -vt 0.442871094 0.96618855 -vt 0.442871094 0.900614738 -vt 0.913574219 0.900614738 -vt 0.913574219 0.933401644 -vt 0.944824219 0.933401644 -vt 0.944824219 0.900614738 -vt 0.333496094 0.902663946 -vt 0.333496094 0.968237698 -vt 0.349121094 0.968237698 -vt 0.349121094 0.902663946 -vt 0.0961914062 0.925204933 -vt 0.0961914062 0.957991779 -vt 0.127441406 0.957991779 -vt 0.127441406 0.925204933 -vt 0.205566406 0.925204933 -vt 0.205566406 0.990778685 -vt 0.221191406 0.990778685 -vt 0.221191406 0.925204933 -vt 0.222167969 0.925204933 -vt 0.222167969 0.990778685 -vt 0.237792969 0.990778685 -vt 0.237792969 0.925204933 -vt 0.457519531 0.927254081 -vt 0.457519531 0.960040987 -vt 0.488769531 0.960040987 -vt 0.488769531 0.927254081 -vt 0.253417969 0.925204933 -vt 0.253417969 0.990778685 -vt 0.269042969 0.990778685 -vt 0.269042969 0.925204933 -vt 0.00048828125 0.927254081 -vt 0.00048828125 0.992827892 -vt 0.0161132812 0.992827892 -vt 0.0161132812 0.927254081 -vt 0.945800781 0.929303288 -vt 0.945800781 0.962090135 -vt 0.977050781 0.962090135 -vt 0.977050781 0.929303288 -vt 0.978027344 0.927254081 -vt 0.978027344 0.960040987 -vt 0.993652344 0.960040987 -vt 0.993652344 0.927254081 -vt 0.142089844 0.929303288 -vt 0.142089844 0.962090135 -vt 0.157714844 0.962090135 -vt 0.157714844 0.929303288 -vt 0.489746094 0.929303288 -vt 0.489746094 0.962090135 -vt 0.505371094 0.962090135 -vt 0.505371094 0.929303288 -vt 0.158691406 0.931352437 -vt 0.158691406 0.964139342 -vt 0.174316406 0.964139342 -vt 0.174316406 0.931352437 -vt 0.175292969 0.931352437 -vt 0.175292969 0.964139342 -vt 0.190917969 0.964139342 -vt 0.190917969 0.931352437 -vt 0.537597656 0.931352437 -vt 0.537597656 0.964139342 -vt 0.553222656 0.964139342 -vt 0.553222656 0.931352437 -vt 0.554199219 0.931352437 -vt 0.554199219 0.964139342 -vt 0.569824219 0.964139342 -vt 0.569824219 0.931352437 -vt 0.570800781 0.931352437 -vt 0.570800781 0.964139342 -vt 0.586425781 0.964139342 -vt 0.586425781 0.931352437 -vt 0.866699219 0.931352437 -vt 0.866699219 0.964139342 -vt 0.882324219 0.964139342 -vt 0.882324219 0.931352437 -vt 0.883300781 0.931352437 -vt 0.883300781 0.964139342 -vt 0.898925781 0.964139342 -vt 0.898925781 0.931352437 -vt 0.598144531 0.933401644 -vt 0.598144531 0.96618855 -vt 0.613769531 0.96618855 -vt 0.613769531 0.933401644 -vt 0.614746094 0.933401644 -vt 0.614746094 0.96618855 -vt 0.630371094 0.96618855 -vt 0.630371094 0.933401644 -vt 0.679199219 0.933401644 -vt 0.679199219 0.96618855 -vt 0.694824219 0.96618855 -vt 0.694824219 0.933401644 -vt 0.695800781 0.933401644 -vt 0.695800781 0.96618855 -vt 0.711425781 0.96618855 -vt 0.711425781 0.933401644 -vt 0.712402344 0.933401644 -vt 0.712402344 0.96618855 -vt 0.728027344 0.96618855 -vt 0.728027344 0.933401644 -vt 0.729003906 0.933401644 -vt 0.729003906 0.96618855 -vt 0.744628906 0.96618855 -vt 0.744628906 0.933401644 -vt 0.745605469 0.933401644 -vt 0.745605469 0.96618855 -vt 0.761230469 0.96618855 -vt 0.761230469 0.933401644 -vt 0.792480469 0.933401644 -vt 0.792480469 0.96618855 -vt 0.808105469 0.96618855 -vt 0.808105469 0.933401644 -vt 0.809082031 0.933401644 -vt 0.809082031 0.96618855 -vt 0.824707031 0.96618855 -vt 0.824707031 0.933401644 -vt 0.825683594 0.933401644 -vt 0.825683594 0.96618855 -vt 0.841308594 0.96618855 -vt 0.841308594 0.933401644 -vt 0.842285156 0.933401644 -vt 0.842285156 0.96618855 -vt 0.857910156 0.96618855 -vt 0.857910156 0.933401644 -vt 0.913574219 0.935450792 -vt 0.913574219 0.968237698 -vt 0.929199219 0.968237698 -vt 0.929199219 0.935450792 -vt 0.0961914062 0.960040987 -vt 0.0961914062 0.992827892 -vt 0.111816406 0.992827892 -vt 0.111816406 0.960040987 -vt 0.112792969 0.960040987 -vt 0.112792969 0.992827892 -vt 0.128417969 0.992827892 -vt 0.128417969 0.960040987 -vt 0.0170898438 0.962090135 -vt 0.0170898438 0.99487704 -vt 0.0327148438 0.99487704 -vt 0.0327148438 0.962090135 -vt 0.0336914062 0.962090135 -vt 0.0336914062 0.99487704 -vt 0.0493164062 0.99487704 -vt 0.0493164062 0.962090135 -vt 0.0502929688 0.962090135 -vt 0.0502929688 0.99487704 -vt 0.0659179688 0.99487704 -vt 0.0659179688 0.962090135 -vt 0.0668945312 0.962090135 -vt 0.0668945312 0.99487704 -vt 0.0825195312 0.99487704 -vt 0.0825195312 0.962090135 -vt 0.457519531 0.962090135 -vt 0.457519531 0.99487704 -vt 0.473144531 0.99487704 -vt 0.473144531 0.962090135 -vt 0.978027344 0.962090135 -vt 0.978027344 0.99487704 -vt 0.993652344 0.99487704 -vt 0.993652344 0.962090135 -vt 0.142089844 0.964139342 -vt 0.142089844 0.996926248 -vt 0.157714844 0.996926248 -vt 0.157714844 0.964139342 -vt 0.489746094 0.964139342 -vt 0.489746094 0.996926248 -vt 0.505371094 0.996926248 -vt 0.505371094 0.964139342 -vt 0.506347656 0.964139342 -vt 0.506347656 0.996926248 -vt 0.521972656 0.996926248 -vt 0.521972656 0.964139342 -vt 0.945800781 0.964139342 -vt 0.945800781 0.996926248 -vt 0.961425781 0.996926248 -vt 0.961425781 0.964139342 -vt 0.158691406 0.96618855 -vt 0.158691406 0.998975396 -vt 0.174316406 0.998975396 -vt 0.174316406 0.96618855 -vt 0.175292969 0.96618855 -vt 0.175292969 0.998975396 -vt 0.190917969 0.998975396 -vt 0.190917969 0.96618855 -vt 0.283691406 0.96618855 -vt 0.283691406 0.998975396 -vt 0.299316406 0.998975396 -vt 0.299316406 0.96618855 -vt 0.300292969 0.96618855 -vt 0.300292969 0.998975396 -vt 0.315917969 0.998975396 -vt 0.315917969 0.96618855 -vt 0.316894531 0.96618855 -vt 0.316894531 0.998975396 -vt 0.332519531 0.998975396 -vt 0.332519531 0.96618855 -vt 0.537597656 0.96618855 -vt 0.537597656 0.998975396 -vt 0.553222656 0.998975396 -vt 0.553222656 0.96618855 -vt 0.554199219 0.96618855 -vt 0.554199219 0.998975396 -vt 0.569824219 0.998975396 -vt 0.569824219 0.96618855 -vt 0.570800781 0.96618855 -vt 0.570800781 0.998975396 -vt 0.586425781 0.998975396 -vt 0.586425781 0.96618855 -vt 0.645996094 0.96618855 -vt 0.645996094 0.998975396 -vt 0.661621094 0.998975396 -vt 0.661621094 0.96618855 -g xinzexi_2_n-mesh_0 -f 3/3/3 2/2/2 1/1/1 -f 1/1/1 4/4/4 3/3/3 -f 7/7/7 6/6/6 5/5/5 -f 5/5/5 8/8/8 7/7/7 -f 11/11/11 10/10/10 9/9/9 -f 9/9/9 12/12/12 11/11/11 -f 15/15/15 14/14/14 13/13/13 -f 13/13/13 16/16/16 15/15/15 -f 19/19/19 18/18/18 17/17/17 -f 17/17/17 20/20/20 19/19/19 -f 23/23/23 22/22/22 21/21/21 -f 21/21/21 24/24/24 23/23/23 -f 27/27/27 26/26/26 25/25/25 -f 25/25/25 28/28/28 27/27/27 -f 31/31/31 30/30/30 29/29/29 -f 29/29/29 32/32/32 31/31/31 -f 35/35/35 34/34/34 33/33/33 -f 33/33/33 36/36/36 35/35/35 -f 39/39/39 38/38/38 37/37/37 -f 37/37/37 40/40/40 39/39/39 -f 43/43/43 42/42/42 41/41/41 -f 41/41/41 44/44/44 43/43/43 -f 47/47/47 46/46/46 45/45/45 -f 45/45/45 48/48/48 47/47/47 -f 51/51/51 50/50/50 49/49/49 -f 49/49/49 52/52/52 51/51/51 -f 55/55/55 54/54/54 53/53/53 -f 53/53/53 56/56/56 55/55/55 -f 59/59/59 58/58/58 57/57/57 -f 57/57/57 60/60/60 59/59/59 -f 63/63/63 62/62/62 61/61/61 -f 61/61/61 64/64/64 63/63/63 -f 67/67/67 66/66/66 65/65/65 -f 65/65/65 68/68/68 67/67/67 -f 71/71/71 70/70/70 69/69/69 -f 69/69/69 72/72/72 71/71/71 -f 75/75/75 74/74/74 73/73/73 -f 73/73/73 76/76/76 75/75/75 -f 79/79/79 78/78/78 77/77/77 -f 77/77/77 80/80/80 79/79/79 -f 83/83/83 82/82/82 81/81/81 -f 81/81/81 84/84/84 83/83/83 -f 87/87/87 86/86/86 85/85/85 -f 85/85/85 88/88/88 87/87/87 -f 91/91/91 90/90/90 89/89/89 -f 89/89/89 92/92/92 91/91/91 -f 95/95/95 94/94/94 93/93/93 -f 93/93/93 96/96/96 95/95/95 -f 99/99/99 98/98/98 97/97/97 -f 97/97/97 100/100/100 99/99/99 -f 103/103/103 102/102/102 101/101/101 -f 101/101/101 104/104/104 103/103/103 -f 107/107/107 106/106/106 105/105/105 -f 105/105/105 108/108/108 107/107/107 -f 111/111/111 110/110/110 109/109/109 -f 109/109/109 112/112/112 111/111/111 -f 115/115/115 114/114/114 113/113/113 -f 113/113/113 116/116/116 115/115/115 -f 119/119/119 118/118/118 117/117/117 -f 117/117/117 120/120/120 119/119/119 -f 123/123/123 122/122/122 121/121/121 -f 121/121/121 124/124/124 123/123/123 -f 127/127/127 126/126/126 125/125/125 -f 125/125/125 128/128/128 127/127/127 -f 131/131/131 130/130/130 129/129/129 -f 129/129/129 132/132/132 131/131/131 -f 135/135/135 134/134/134 133/133/133 -f 133/133/133 136/136/136 135/135/135 -f 139/139/139 138/138/138 137/137/137 -f 137/137/137 140/140/140 139/139/139 -f 143/143/143 142/142/142 141/141/141 -f 141/141/141 144/144/144 143/143/143 -f 147/147/147 146/146/146 145/145/145 -f 145/145/145 148/148/148 147/147/147 -f 151/151/151 150/150/150 149/149/149 -f 149/149/149 152/152/152 151/151/151 -f 155/155/155 154/154/154 153/153/153 -f 153/153/153 156/156/156 155/155/155 -f 159/159/159 158/158/158 157/157/157 -f 157/157/157 160/160/160 159/159/159 -f 163/163/163 162/162/162 161/161/161 -f 161/161/161 164/164/164 163/163/163 -f 167/167/167 166/166/166 165/165/165 -f 165/165/165 168/168/168 167/167/167 -f 171/171/171 170/170/170 169/169/169 -f 169/169/169 172/172/172 171/171/171 -f 175/175/175 174/174/174 173/173/173 -f 173/173/173 176/176/176 175/175/175 -f 179/179/179 178/178/178 177/177/177 -f 177/177/177 180/180/180 179/179/179 -f 183/183/183 182/182/182 181/181/181 -f 181/181/181 184/184/184 183/183/183 -f 187/187/187 186/186/186 185/185/185 -f 185/185/185 188/188/188 187/187/187 -f 191/191/191 190/190/190 189/189/189 -f 189/189/189 192/192/192 191/191/191 -f 195/195/195 194/194/194 193/193/193 -f 193/193/193 196/196/196 195/195/195 -f 199/199/199 198/198/198 197/197/197 -f 197/197/197 200/200/200 199/199/199 -f 203/203/203 202/202/202 201/201/201 -f 201/201/201 204/204/204 203/203/203 -f 207/207/207 206/206/206 205/205/205 -f 205/205/205 208/208/208 207/207/207 -f 211/211/211 210/210/210 209/209/209 -f 209/209/209 212/212/212 211/211/211 -f 215/215/215 214/214/214 213/213/213 -f 213/213/213 216/216/216 215/215/215 -f 219/219/219 218/218/218 217/217/217 -f 217/217/217 220/220/220 219/219/219 -f 223/223/223 222/222/222 221/221/221 -f 221/221/221 224/224/224 223/223/223 -f 227/227/227 226/226/226 225/225/225 -f 225/225/225 228/228/228 227/227/227 -f 231/231/231 230/230/230 229/229/229 -f 229/229/229 232/232/232 231/231/231 -f 235/235/235 234/234/234 233/233/233 -f 233/233/233 236/236/236 235/235/235 -f 239/239/239 238/238/238 237/237/237 -f 237/237/237 240/240/240 239/239/239 -f 243/243/243 242/242/242 241/241/241 -f 241/241/241 244/244/244 243/243/243 -f 247/247/247 246/246/246 245/245/245 -f 245/245/245 248/248/248 247/247/247 -f 251/251/251 250/250/250 249/249/249 -f 249/249/249 252/252/252 251/251/251 -f 255/255/255 254/254/254 253/253/253 -f 253/253/253 256/256/256 255/255/255 -f 259/259/259 258/258/258 257/257/257 -f 257/257/257 260/260/260 259/259/259 -f 263/263/263 262/262/262 261/261/261 -f 261/261/261 264/264/264 263/263/263 -f 267/267/267 266/266/266 265/265/265 -f 265/265/265 268/268/268 267/267/267 -f 271/271/271 270/270/270 269/269/269 -f 269/269/269 272/272/272 271/271/271 -f 275/275/275 274/274/274 273/273/273 -f 273/273/273 276/276/276 275/275/275 -f 279/279/279 278/278/278 277/277/277 -f 277/277/277 280/280/280 279/279/279 -f 283/283/283 282/282/282 281/281/281 -f 281/281/281 284/284/284 283/283/283 -f 287/287/287 286/286/286 285/285/285 -f 285/285/285 288/288/288 287/287/287 -f 291/291/291 290/290/290 289/289/289 -f 289/289/289 292/292/292 291/291/291 -f 295/295/295 294/294/294 293/293/293 -f 293/293/293 296/296/296 295/295/295 -f 299/299/299 298/298/298 297/297/297 -f 297/297/297 300/300/300 299/299/299 -f 303/303/303 302/302/302 301/301/301 -f 301/301/301 304/304/304 303/303/303 -f 307/307/307 306/306/306 305/305/305 -f 305/305/305 308/308/308 307/307/307 -f 311/311/311 310/310/310 309/309/309 -f 309/309/309 312/312/312 311/311/311 -f 315/315/315 314/314/314 313/313/313 -f 313/313/313 316/316/316 315/315/315 -f 319/319/319 318/318/318 317/317/317 -f 317/317/317 320/320/320 319/319/319 -f 323/323/323 322/322/322 321/321/321 -f 321/321/321 324/324/324 323/323/323 -f 327/327/327 326/326/326 325/325/325 -f 325/325/325 328/328/328 327/327/327 -f 331/331/331 330/330/330 329/329/329 -f 329/329/329 332/332/332 331/331/331 -f 335/335/335 334/334/334 333/333/333 -f 333/333/333 336/336/336 335/335/335 -f 339/339/339 338/338/338 337/337/337 -f 337/337/337 340/340/340 339/339/339 -f 343/343/343 342/342/342 341/341/341 -f 341/341/341 344/344/344 343/343/343 -f 347/347/347 346/346/346 345/345/345 -f 345/345/345 348/348/348 347/347/347 -f 351/351/351 350/350/350 349/349/349 -f 349/349/349 352/352/352 351/351/351 -f 355/355/355 354/354/354 353/353/353 -f 353/353/353 356/356/356 355/355/355 -f 359/359/359 358/358/358 357/357/357 -f 357/357/357 360/360/360 359/359/359 -f 363/363/363 362/362/362 361/361/361 -f 361/361/361 364/364/364 363/363/363 -f 367/367/367 366/366/366 365/365/365 -f 365/365/365 368/368/368 367/367/367 -f 371/371/371 370/370/370 369/369/369 -f 369/369/369 372/372/372 371/371/371 -f 375/375/375 374/374/374 373/373/373 -f 373/373/373 376/376/376 375/375/375 -f 379/379/379 378/378/378 377/377/377 -f 377/377/377 380/380/380 379/379/379 -f 383/383/383 382/382/382 381/381/381 -f 381/381/381 384/384/384 383/383/383 -f 387/387/387 386/386/386 385/385/385 -f 385/385/385 388/388/388 387/387/387 -f 391/391/391 390/390/390 389/389/389 -f 389/389/389 392/392/392 391/391/391 -f 395/395/395 394/394/394 393/393/393 -f 393/393/393 396/396/396 395/395/395 -f 399/399/399 398/398/398 397/397/397 -f 397/397/397 400/400/400 399/399/399 -f 403/403/403 402/402/402 401/401/401 -f 401/401/401 404/404/404 403/403/403 -f 407/407/407 406/406/406 405/405/405 -f 405/405/405 408/408/408 407/407/407 -f 411/411/411 410/410/410 409/409/409 -f 409/409/409 412/412/412 411/411/411 -f 415/415/415 414/414/414 413/413/413 -f 413/413/413 416/416/416 415/415/415 -f 419/419/419 418/418/418 417/417/417 -f 417/417/417 420/420/420 419/419/419 -f 423/423/423 422/422/422 421/421/421 -f 421/421/421 424/424/424 423/423/423 -f 427/427/427 426/426/426 425/425/425 -f 425/425/425 428/428/428 427/427/427 -f 431/431/431 430/430/430 429/429/429 -f 429/429/429 432/432/432 431/431/431 -f 435/435/435 434/434/434 433/433/433 -f 433/433/433 436/436/436 435/435/435 -f 439/439/439 438/438/438 437/437/437 -f 437/437/437 440/440/440 439/439/439 -f 443/443/443 442/442/442 441/441/441 -f 441/441/441 444/444/444 443/443/443 -f 447/447/447 446/446/446 445/445/445 -f 445/445/445 448/448/448 447/447/447 -f 451/451/451 450/450/450 449/449/449 -f 449/449/449 452/452/452 451/451/451 -f 455/455/455 454/454/454 453/453/453 -f 453/453/453 456/456/456 455/455/455 -f 459/459/459 458/458/458 457/457/457 -f 457/457/457 460/460/460 459/459/459 -f 463/463/463 462/462/462 461/461/461 -f 461/461/461 464/464/464 463/463/463 -f 467/467/467 466/466/466 465/465/465 -f 465/465/465 468/468/468 467/467/467 -f 471/471/471 470/470/470 469/469/469 -f 469/469/469 472/472/472 471/471/471 -f 475/475/475 474/474/474 473/473/473 -f 473/473/473 476/476/476 475/475/475 -f 479/479/479 478/478/478 477/477/477 -f 477/477/477 480/480/480 479/479/479 -f 483/483/483 482/482/482 481/481/481 -f 481/481/481 484/484/484 483/483/483 -f 487/487/487 486/486/486 485/485/485 -f 485/485/485 488/488/488 487/487/487 -f 491/491/491 490/490/490 489/489/489 -f 489/489/489 492/492/492 491/491/491 -f 495/495/495 494/494/494 493/493/493 -f 493/493/493 496/496/496 495/495/495 -f 499/499/499 498/498/498 497/497/497 -f 497/497/497 500/500/500 499/499/499 -f 503/503/503 502/502/502 501/501/501 -f 501/501/501 504/504/504 503/503/503 -f 507/507/507 506/506/506 505/505/505 -f 505/505/505 508/508/508 507/507/507 -f 511/511/511 510/510/510 509/509/509 -f 509/509/509 512/512/512 511/511/511 -f 515/515/515 514/514/514 513/513/513 -f 513/513/513 516/516/516 515/515/515 -f 519/519/519 518/518/518 517/517/517 -f 517/517/517 520/520/520 519/519/519 -f 523/523/523 522/522/522 521/521/521 -f 521/521/521 524/524/524 523/523/523 -f 527/527/527 526/526/526 525/525/525 -f 525/525/525 528/528/528 527/527/527 -f 531/531/531 530/530/530 529/529/529 -f 529/529/529 532/532/532 531/531/531 -f 535/535/535 534/534/534 533/533/533 -f 533/533/533 536/536/536 535/535/535 -f 539/539/539 538/538/538 537/537/537 -f 537/537/537 540/540/540 539/539/539 -f 543/543/543 542/542/542 541/541/541 -f 541/541/541 544/544/544 543/543/543 -f 547/547/547 546/546/546 545/545/545 -f 545/545/545 548/548/548 547/547/547 -f 551/551/551 550/550/550 549/549/549 -f 549/549/549 552/552/552 551/551/551 -f 555/555/555 554/554/554 553/553/553 -f 553/553/553 556/556/556 555/555/555 -f 559/559/559 558/558/558 557/557/557 -f 557/557/557 560/560/560 559/559/559 -f 563/563/563 562/562/562 561/561/561 -f 561/561/561 564/564/564 563/563/563 -f 567/567/567 566/566/566 565/565/565 -f 565/565/565 568/568/568 567/567/567 -f 571/571/571 570/570/570 569/569/569 -f 569/569/569 572/572/572 571/571/571 -f 575/575/575 574/574/574 573/573/573 -f 573/573/573 576/576/576 575/575/575 -f 579/579/579 578/578/578 577/577/577 -f 577/577/577 580/580/580 579/579/579 -f 583/583/583 582/582/582 581/581/581 -f 581/581/581 584/584/584 583/583/583 -f 587/587/587 586/586/586 585/585/585 -f 585/585/585 588/588/588 587/587/587 -f 591/591/591 590/590/590 589/589/589 -f 589/589/589 592/592/592 591/591/591 -f 595/595/595 594/594/594 593/593/593 -f 593/593/593 596/596/596 595/595/595 -f 599/599/599 598/598/598 597/597/597 -f 597/597/597 600/600/600 599/599/599 -f 603/603/603 602/602/602 601/601/601 -f 601/601/601 604/604/604 603/603/603 -f 607/607/607 606/606/606 605/605/605 -f 605/605/605 608/608/608 607/607/607 -f 611/611/611 610/610/610 609/609/609 -f 609/609/609 612/612/612 611/611/611 -f 615/615/615 614/614/614 613/613/613 -f 613/613/613 616/616/616 615/615/615 -f 619/619/619 618/618/618 617/617/617 -f 617/617/617 620/620/620 619/619/619 -f 623/623/623 622/622/622 621/621/621 -f 621/621/621 624/624/624 623/623/623 -f 627/627/627 626/626/626 625/625/625 -f 625/625/625 628/628/628 627/627/627 -f 631/631/631 630/630/630 629/629/629 -f 629/629/629 632/632/632 631/631/631 -f 635/635/635 634/634/634 633/633/633 -f 633/633/633 636/636/636 635/635/635 -f 639/639/639 638/638/638 637/637/637 -f 637/637/637 640/640/640 639/639/639 -f 643/643/643 642/642/642 641/641/641 -f 641/641/641 644/644/644 643/643/643 -f 647/647/647 646/646/646 645/645/645 -f 645/645/645 648/648/648 647/647/647 -f 651/651/651 650/650/650 649/649/649 -f 649/649/649 652/652/652 651/651/651 -f 655/655/655 654/654/654 653/653/653 -f 653/653/653 656/656/656 655/655/655 -f 659/659/659 658/658/658 657/657/657 -f 657/657/657 660/660/660 659/659/659 -f 663/663/663 662/662/662 661/661/661 -f 661/661/661 664/664/664 663/663/663 -f 667/667/667 666/666/666 665/665/665 -f 665/665/665 668/668/668 667/667/667 -f 671/671/671 670/670/670 669/669/669 -f 669/669/669 672/672/672 671/671/671 -f 675/675/675 674/674/674 673/673/673 -f 673/673/673 676/676/676 675/675/675 -f 679/679/679 678/678/678 677/677/677 -f 677/677/677 680/680/680 679/679/679 -f 683/683/683 682/682/682 681/681/681 -f 681/681/681 684/684/684 683/683/683 -f 687/687/687 686/686/686 685/685/685 -f 685/685/685 688/688/688 687/687/687 -f 691/691/691 690/690/690 689/689/689 -f 689/689/689 692/692/692 691/691/691 -f 695/695/695 694/694/694 693/693/693 -f 693/693/693 696/696/696 695/695/695 -f 699/699/699 698/698/698 697/697/697 -f 697/697/697 700/700/700 699/699/699 -f 703/703/703 702/702/702 701/701/701 -f 701/701/701 704/704/704 703/703/703 -f 707/707/707 706/706/706 705/705/705 -f 705/705/705 708/708/708 707/707/707 -f 711/711/711 710/710/710 709/709/709 -f 709/709/709 712/712/712 711/711/711 -f 715/715/715 714/714/714 713/713/713 -f 713/713/713 716/716/716 715/715/715 -f 719/719/719 718/718/718 717/717/717 -f 717/717/717 720/720/720 719/719/719 -f 723/723/723 722/722/722 721/721/721 -f 721/721/721 724/724/724 723/723/723 +version https://git-lfs.github.com/spec/v1 +oid sha256:8bb2082b9586b3f8f3bad2d22d33346ec0492053f2a76323aa8b4b4047368ca8 +size 44643 diff --git a/tests/test_UnityVersion.py b/tests/test_UnityVersion.py new file mode 100644 index 000000000..a01255633 --- /dev/null +++ b/tests/test_UnityVersion.py @@ -0,0 +1,74 @@ +import pytest + +from UnityPy.helpers.UnityVersion import UnityVersion, UnityVersionType + + +@pytest.mark.parametrize( + "version_str, expected_tuple", + [ + ("2018.1.1f2", (2018, 1, 1, UnityVersionType.f.value, 2)), + ("5.0.0", (5, 0, 0, UnityVersionType.f.value, 0)), + ("2020.3.12b1", (2020, 3, 12, UnityVersionType.b.value, 1)), + ("2019.4.28a3", (2019, 4, 28, UnityVersionType.a.value, 3)), + ("2017.2.0p1", (2017, 2, 0, UnityVersionType.p.value, 1)), + ("2021.1.0c1", (2021, 1, 0, UnityVersionType.c.value, 1)), + ("2022.2.0x1", (2022, 2, 0, UnityVersionType.x.value, 1)), + ("2018.1.1z2", (2018, 1, 1, UnityVersionType.u.value, 2)), # unknown type + ("2022.3.62f2\n2", (2022, 3, 62, UnityVersionType.f.value, 2)), + ], +) +def test_parse_unity_version(version_str, expected_tuple): + v = UnityVersion.from_str(version_str) + assert v.as_tuple() == expected_tuple + assert v.major == expected_tuple[0] + assert v.minor == expected_tuple[1] + assert v.build == expected_tuple[2] + assert v.type.value == expected_tuple[3] + assert v.type_number == expected_tuple[4] + assert UnityVersion.from_list(*expected_tuple) == v + + +@pytest.mark.parametrize( + "version_str, compare_tuple", + [ + ("2018.1.1f2", (2018, 1, 1, UnityVersionType.f.value, 2)), + ("2018.1.1f2", (2018, 1, 1, UnityVersionType.f.value, 1)), + ("2018.1.1f2", (2018, 1, 2, UnityVersionType.f.value, 2)), + ("2018.1.1f2", (2018, 2, 1, UnityVersionType.f.value, 2)), + ], +) +def test_comparison_with_tuple(version_str, compare_tuple): + v = UnityVersion.from_str(version_str) + # eq + assert (v == compare_tuple) == (v.as_tuple() == compare_tuple) + # ne + assert (v != compare_tuple) == (v.as_tuple() != compare_tuple) + # lt + assert (v < compare_tuple) == (v.as_tuple() < compare_tuple) + # le + assert (v <= compare_tuple) == (v.as_tuple() <= compare_tuple) + # gt + assert (v > compare_tuple) == (v.as_tuple() > compare_tuple) + # ge + assert (v >= compare_tuple) == (v.as_tuple() >= compare_tuple) + + +@pytest.mark.parametrize( + "version_str, other_str", + [ + ("2018.1.1f2", "2018.1.1f2"), + ("2018.1.1f2", "2018.1.1f1"), + ("2018.1.1f2", "2018.1.2f2"), + ("2018.1.1f2", "2018.2.1f2"), + ("2022.3.62f2\n2", "2022.3.62f2"), + ], +) +def test_comparison_with_unityversion(version_str, other_str): + v1 = UnityVersion.from_str(version_str) + v2 = UnityVersion.from_str(other_str) + assert (v1 == v2) == (v1.as_tuple() == v2.as_tuple()) + assert (v1 != v2) == (v1.as_tuple() != v2.as_tuple()) + assert (v1 < v2) == (v1.as_tuple() < v2.as_tuple()) + assert (v1 <= v2) == (v1.as_tuple() <= v2.as_tuple()) + assert (v1 > v2) == (v1.as_tuple() > v2.as_tuple()) + assert (v1 >= v2) == (v1.as_tuple() >= v2.as_tuple()) diff --git a/tests/test_main.py b/tests/test_main.py index 71fc0aa06..792e3626d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -5,6 +5,7 @@ from PIL import Image import UnityPy +from UnityPy.streams import EndianBinaryReader SAMPLES = os.path.join(os.path.dirname(os.path.abspath(__file__)), "samples") @@ -13,22 +14,24 @@ def test_read_single(): for f in os.listdir(SAMPLES): env = UnityPy.load(os.path.join(SAMPLES, f)) for obj in env.objects: - obj.read() + obj.parse_as_object() + obj.parse_as_dict() def test_read_batch(): env = UnityPy.load(SAMPLES) for obj in env.objects: - obj.read() + obj.parse_as_object() + obj.parse_as_dict() def test_save_dict(): env = UnityPy.load(SAMPLES) for obj in env.objects: data = obj.get_raw_data() - item = obj.read_typetree(wrap=False) + item = obj.parse_as_dict() assert isinstance(item, dict) - re_data = obj.save_typetree(item) + re_data = obj.patch(item) assert data == re_data @@ -36,9 +39,9 @@ def test_save_wrap(): env = UnityPy.load(SAMPLES) for obj in env.objects: data = obj.get_raw_data() - item = obj.read_typetree(wrap=True) + item = obj.parse_as_object() assert not isinstance(item, dict) - re_data = obj.save_typetree(item) + re_data = obj.patch(item) assert data == re_data @@ -47,7 +50,7 @@ def test_texture2d(): env = UnityPy.load(os.path.join(SAMPLES, f)) for obj in env.objects: if obj.type.name == "Texture2D": - data = obj.read() + data = obj.parse_as_object() data.image.save(io.BytesIO(), format="PNG") data.image = data.image.transpose(Image.ROTATE_90) data.save() @@ -58,7 +61,8 @@ def test_sprite(): env = UnityPy.load(os.path.join(SAMPLES, f)) for obj in env.objects: if obj.type.name == "Sprite": - obj.read().image.save(io.BytesIO(), format="PNG") + sprite = obj.parse_as_object() + sprite.image.save(io.BytesIO(), format="PNG") if platform.system() == "Darwin": @@ -66,27 +70,20 @@ def test_sprite(): del test_texture2d del test_sprite + def test_audioclip(): - # as not platforms are supported by FMOD - # we have to check if the platform is supported first - try: - from UnityPy.export import AudioClipConverter + from fmod_toolkit.importer import import_pyfmodex - AudioClipConverter.import_pyfmodex() - except NotImplementedError: - return - except OSError: - # cibuildwheel doesn't copy the .so files - # so we have to skip the test on it - print("Failed to load the fmod lib for your system.") - print("Skipping the audioclip test.") - return - if AudioClipConverter.pyfmodex is False: + try: + import_pyfmodex() + except ValueError: + print("FMOD toolkit not available, skipping AudioClip tests") return + env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) for obj in env.objects: if obj.type.name == "AudioClip": - clip = obj.read() + clip = obj.parse_as_object() assert len(clip.samples) == 1 @@ -96,7 +93,7 @@ def test_mesh(): wanted = f.read().replace(b"\r", b"") for obj in env.objects: if obj.type.name == "Mesh": - mesh = obj.read() + mesh = obj.parse_as_object() data = mesh.export() if isinstance(data, str): data = data.encode("utf8").replace(b"\r", b"") @@ -115,11 +112,11 @@ def test_save(): # this only makes sure # that the save function still produces a readable file for name, file in env.files.items(): - if isinstance(file, UnityPy.streams.EndianBinaryReader): + if isinstance(file, EndianBinaryReader): continue save1 = file.save() save2 = UnityPy.load(save1).file.save() - assert save1 == save2 + assert save1 == save2, f"Failed to save {name} correctly" if __name__ == "__main__": diff --git a/tests/test_typetree.py b/tests/test_typetree.py index 89bcf8ffc..f4a403e7b 100644 --- a/tests/test_typetree.py +++ b/tests/test_typetree.py @@ -2,7 +2,7 @@ import math import os import random -from typing import List, Tuple, TypeVar, Union, Type +from typing import List, Tuple, Type, TypeVar, Union import psutil @@ -10,6 +10,7 @@ from UnityPy.helpers.Tpk import get_typetree_node from UnityPy.helpers.TypeTreeHelper import read_typetree, write_typetree from UnityPy.helpers.TypeTreeNode import TypeTreeNode +from UnityPy.helpers.UnityVersion import UnityVersion from UnityPy.streams import EndianBinaryReader, EndianBinaryWriter PROCESS = psutil.Process(os.getpid()) @@ -38,9 +39,7 @@ def wrapper(*args, **kwargs): @check_leak def test_typetreenode(): - TypeTreeNode( - m_Level=0, m_Type=TEST_NODE_STR, m_Name=TEST_NODE_STR, m_ByteSize=0, m_Version=0 - ) + TypeTreeNode(m_Level=0, m_Type=TEST_NODE_STR, m_Name=TEST_NODE_STR, m_ByteSize=0, m_Version=0) def generate_dummy_node(typ: str, name: str = ""): @@ -145,9 +144,7 @@ def test_simple_nodes(): write_typetree(value, node, writer) raw = writer.bytes re_value = _test_read_typetree(node, raw, as_dict=True) - assert ( - abs(value - re_value) < 1e-5 - ), f"Failed on {typ}: {value} != {re_value}" + assert abs(value - re_value) < 1e-5, f"Failed on {typ}: {value} != {re_value}" @check_leak @@ -168,16 +165,13 @@ def generate_list_node(item_node: TypeTreeNode): write_typetree(values, array_node, writer) raw = writer.bytes re_values = _test_read_typetree(array_node, raw, as_dict=True) - assert all( - (abs(value - re_value) < 1e-5) - for value, re_value in zip(values, re_values) - ), f"Failed on {typ}: {values} != {re_values}" + assert all((abs(value - re_value) < 1e-5) for value, re_value in zip(values, re_values)), ( + f"Failed on {typ}: {values} != {re_values}" + ) -TEST_CLASS_NODE = get_typetree_node(1, (5, 0, 0, 0)) -TEST_CLASS_NODE_OBJ = GameObject( - m_Component=[], m_IsActive=True, m_Layer=0, m_Name="TestObject", m_Tag=0 -) +TEST_CLASS_NODE = get_typetree_node(1, UnityVersion.from_list(5, 0, 0, 0)) +TEST_CLASS_NODE_OBJ = GameObject(m_Component=[], m_IsActive=True, m_Layer=0, m_Name="TestObject", m_Tag=0) TEST_CLASS_NODE_DICT = TEST_CLASS_NODE_OBJ.__dict__