diff --git a/.gitignore b/.gitignore
index 8d5e3d43..b868b397 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,4 +76,26 @@ Recordings/
# Paid assets
/[Aa]ssets/Magic Light Probes/*
-/[Aa]ssets/[Bb]akery/*
\ No newline at end of file
+/[Aa]ssets/[Bb]akery/*
+
+
+
+#FMOD
+
+# Never ignore DLLs in the FMOD subfolder.
+!/[Aa]ssets/Plugins/FMOD/**/lib/*
+
+# Don't ignore images and gizmos used by FMOD in the Unity Editor.
+!/[Aa]ssets/Gizmos/FMOD/*
+!/[Aa]ssets/Editor Default Resources/FMOD/*
+
+# Ignore the Cache folder since it is updated locally.
+/[Aa]ssets/Plugins/FMOD/Cache/*
+
+# Ignore bank files in the StreamingAssets folder.
+/[Aa]ssets/StreamingAssets/**/*.bank
+/[Aa]ssets/StreamingAssets/**/*.bank.meta
+
+# If the source bank files are kept outside of the StreamingAssets folder then these can be ignored.
+# Log files can be ignored.
+fmod_editor.log
\ No newline at end of file
diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta
new file mode 100644
index 00000000..4b4b1aaa
--- /dev/null
+++ b/Assets/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7614f5c67d1ff3542beaf4fe57f2b011
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD.meta b/Assets/Plugins/FMOD.meta
new file mode 100644
index 00000000..73f856b7
--- /dev/null
+++ b/Assets/Plugins/FMOD.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 06ae579381df01a4a87bb149dec89954
+folderAsset: yes
+timeCreated: 1429061260
+licenseType: Pro
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/Cache.meta b/Assets/Plugins/FMOD/Cache.meta
new file mode 100644
index 00000000..07755680
--- /dev/null
+++ b/Assets/Plugins/FMOD/Cache.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 073efe56830e3114db9d15a0a53828e4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/FMODUnity.asmdef b/Assets/Plugins/FMOD/FMODUnity.asmdef
new file mode 100644
index 00000000..115fd817
--- /dev/null
+++ b/Assets/Plugins/FMOD/FMODUnity.asmdef
@@ -0,0 +1,47 @@
+{
+ "name": "FMODUnity",
+ "references": [
+ "Unity.Timeline",
+ "Unity.Addressables",
+ "Unity.ResourceManager",
+ "Unity.RenderPipelines.Universal.Runtime"
+
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [
+ "UNITY_2021_3_OR_NEWER"
+ ],
+ "versionDefines": [
+ {
+ "name": "com.unity.timeline",
+ "expression": "1.0.0",
+ "define": "UNITY_TIMELINE_EXIST"
+ },
+ {
+ "name": "com.unity.addressables",
+ "expression": "1.0.0",
+ "define": "UNITY_ADDRESSABLES_EXIST"
+ },
+ {
+ "name": "com.unity.modules.physics",
+ "expression": "1.0.0",
+ "define": "UNITY_PHYSICS_EXIST"
+ },
+ {
+ "name": "com.unity.modules.physics2d",
+ "expression": "1.0.0",
+ "define": "UNITY_PHYSICS2D_EXIST"
+ },
+ {
+ "name": "com.unity.urp",
+ "expression": "1.0.0",
+ "define": "UNITY_URP_EXIST"
+ }
+ ],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/FMODUnity.asmdef.meta b/Assets/Plugins/FMOD/FMODUnity.asmdef.meta
new file mode 100644
index 00000000..5f7fa24d
--- /dev/null
+++ b/Assets/Plugins/FMOD/FMODUnity.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0c752da273b17c547ae705acf0f2adf2
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/LICENSE.txt b/Assets/Plugins/FMOD/LICENSE.txt
new file mode 100644
index 00000000..2ce86fa4
--- /dev/null
+++ b/Assets/Plugins/FMOD/LICENSE.txt
@@ -0,0 +1,1053 @@
+ FMOD END USER LICENCE AGREEMENT
+ ===============================
+
+This End User Licence Agreement (EULA) is a legal agreement between you and
+Firelight Technologies Pty Ltd (ACN 099 182 448) (us or we) and governs your
+use of FMOD Studio and FMOD Engine, together the Software.
+
+1. GRANT OF LICENCE
+
+1.1 FMOD Studio
+
+This EULA grants you the right to use FMOD Studio, being the desktop
+application for adaptive audio content creation, for all use, including
+Commercial use, subject to the following:
+
+ i. FMOD Studio is used to create content for use with the FMOD Engine
+ only;
+ ii. FMOD Studio is not redistributed in any form.
+
+1.2 FMOD Engine
+
+This EULA grants you the right to use the FMOD Engine, 'FMOD Ex' or 'FMOD 3'
+being the run-time engines for adaptive audio playback, without payment, for
+personal (hobbyist), educational (students and teachers) or Non-Commercial use,
+subject to the following:
+
+ i. FMOD Engine is integrated and redistributed in a software application
+ (Product) only;
+ ii. FMOD Engine is not distributed as part of a game engine or tool set;
+ iii. FMOD Engine is not used in any Commercial enterprise or for any
+ Commercial production or subcontracting, except for the purposes of
+ Evaluation or Development of a Commercial Product;
+ iv. Non-Commercial use does not involve any form of monetisation,
+ sponsorship or promotion;
+ v. Product includes attribution in accordance with Clause 3.
+
+This EULA grants you the right to use FMOD Engine, for limited Commercial
+use, subject to the following:
+
+ i. Development budget of the project is less than $600k USD (Refer to
+ https://www.fmod.com/licensing#licensing-faq) for information);
+ ii. Total gross revenue / funding per year for the developer, before
+ expenses, is less than $200k USD (Refer to
+ https://www.fmod.com/licensing#licensing-faq for information);
+ iii. FMOD Engine is integrated and redistributed in a game application
+ (Product) only;
+ iv. FMOD Engine is not distributed as part of a game engine or tool set;
+ v. FMOD Engine is not distributed as part of a Product with the intent
+ to be commercially exploited by another business or institution;
+ vi. Project is registered in your profile page at
+ https://www.fmod.com/profile#projects;
+ vii. Product includes attribution in accordance with Clause 3.
+
+This EULA does not grant you the right to use 'FMOD Ex' or 'FMOD 3', for
+Commercial use. A custom commercial license must be acquired from Firelight
+Technologies by contacting sales@fmod.com.
+
+1.3 FMOD SDK
+
+This EULA grants you the right to use the FMOD SDK, interfacing either 'FMOD
+Engine', 'FMOD Ex' or 'FMOD 3', comprising the programming interface
+specification, documentation and examples subject to the following:
+
+ i. FMOD SDK is used to develop a software application using the FMOD
+ Engine;
+ ii. FMOD SDK is used to develop an external DSP, Output or Codec plugin;
+ iii. FMOD SDK files are not be distributed with the exception of the FMOD
+ Engine run-time libraries (.DLL, .SO for example).
+
+1.4 FMOD example code and media
+
+This EULA grants you the right to use FMOD example code, being all or snippets
+of source code files located in the FMOD API examples folder and scripting
+examples in the documentation, for all use, including Commercial use, subject
+to the following:
+
+ i. Media files included in FMOD examples, including wav, ogg, mp3, fsb
+ and bank files, are not to be redistributed.
+
+2.OTHER USE
+
+For all Commercial use, and any Non Commercial use not permitted by this
+license, a separate license is required. Refer to www.fmod.com/licensing for
+information.
+
+3. CREDITS
+
+All Products require an in game credit line which must include the words "FMOD"
+and "Firelight Technologies Pty Ltd." Refer to www.fmod.com/attribution for
+examples.
+
+4. INTELLECTUAL PROPERTY RIGHTS
+
+We are and remain at all times the owner of the Software (including all
+intellectual property rights in or to the Software). For the avoidance of doubt,
+nothing in this EULA may be deemed to grant or assign to you any proprietary or
+ownership interest or intellectual property rights in or to the Software other
+than the rights licensed pursuant to Clause 1.
+
+You acknowledge and agree that you have no right, title or interest in and to
+the intellectual property rights in the Software.
+
+5. SECURITY AND RISK
+
+You are responsible for protecting the Software and any related materials at all
+times from unauthorised access, use or damage.
+
+6. WARRANTY AND LIMITATION OF LIABILITY
+
+The Software is provided by us “as is” and, to the maximum extent permitted by
+law, any express or implied warranties of any kind, including (but not limited
+to) all implied warranties of merchantability and fitness for a particular
+purpose are disclaimed.
+
+In no event shall we (and our employees, contractors and subcontractors),
+developers and contributors be liable for any direct, special, indirect or
+consequential damages whatsoever resulting from loss of data or profits, whether
+in an action of contract, negligence or other tortious conduct, arising out of
+or in connection with the use or performance of the Software.
+
+7. OGG VORBIS CODEC
+
+FMOD uses the Ogg Vorbis codec © 2002, Xiph.Org Foundation.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ i. Redistributions of source code must retain the above copyright notice,
+ the list of conditions and the following disclaimer.
+
+ ii. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other material provided with the distribution.
+
+ iii. Neither the name of the Xiph.org Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+8. RESONANCE AUDIO SDK
+
+FMOD includes Resonance Audio SDK, licensed under the Apache Licence, Version
+2.0 (the Licence); you may not use this file except in compliance with the
+License. You may obtain a copy of the License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+8. ANDROID PLATFORM CODE
+
+Copyright (C) 2010 The Android Open Source Project All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+9. AUDIOMOTORS DEMO CONTENT
+
+The audiogaming_audiomotors_demo_engine.agp file is provided for evaluation
+purposes only and is not to be redistributed. AudioMotors V2 Pro is required to
+create your own engine content. Refer to https://lesound.io for information.
+
+10. Qt Toolkit
+
+FMOD uses Qt Toolkit Copyright (C) 2017 The Qt Company Ltd under the
+GNU Lesser General Public License version 3.
+
+FMOD dynamically links to the unmodified Qt libraries, as provided by
+The Qt Company in the pre-compiled binary format. If unable to obtain
+source code from The Qt Company, we offer to provide it via the support
+options available to all users outlined on our website.
+
+-------------------------------------------------------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
+
+
+-------------------------------------------------------------------------
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright © 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+0. Additional Definitions.
+
+ As used herein, “this License” refers to version 3 of the GNU Lesser
+General Public License, and the “GNU GPL” refers to version 3 of the
+GNU General Public License.
+
+ “The Library” refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An “Application” is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A “Combined Work” is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the “Linked
+Version”.
+
+ The “Minimal Corresponding Source” for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The “Corresponding Application Code” for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort
+ to ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this
+ license document.
+
+4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that, taken
+together, effectively do not restrict modification of the portions of
+the Library contained in the Combined Work and reverse engineering for
+debugging such modifications, if you also do each of the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this
+ license document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of
+ this License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with
+ the Library. A suitable mechanism is one that (a) uses at run
+ time a copy of the Library already present on the user's
+ computer system, and (b) will operate properly with a modified
+ version of the Library that is interface-compatible with the
+ Linked Version.
+
+ e) Provide Installation Information, but only if you would
+ otherwise be required to provide such information under section 6
+ of the GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the Application
+ with a modified version of the Linked Version. (If you use option
+ 4d0, the Installation Information must accompany the Minimal
+ Corresponding Source and Corresponding Application Code. If you
+ use option 4d1, you must provide the Installation Information in
+ the manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.)
+
+5. Combined Libraries.
+
+ You may place library facilities that are a work based on the Library
+side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities, conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of
+ it is a work based on the Library, and explaining where to find
+ the accompanying uncombined form of the same work.
+
+6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+as you received it specifies that a certain numbered version of the
+GNU Lesser General Public License “or any later version” applies to
+it, you have the option of following the terms and conditions either
+of that published version or of any later version published by the
+Free Software Foundation. If the Library as you received it does not
+specify a version number of the GNU Lesser General Public License,
+you may choose any version of the GNU Lesser General Public License
+ever published by the Free Software Foundation.
+
+If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the Library.
+
+---------------------------
+Last updated 17th Jun 2024.
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/LICENSE.txt.meta b/Assets/Plugins/FMOD/LICENSE.txt.meta
new file mode 100644
index 00000000..73f16cd7
--- /dev/null
+++ b/Assets/Plugins/FMOD/LICENSE.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fef88d5e0cfffab458ff59acc0d5a07a
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/README.txt b/Assets/Plugins/FMOD/README.txt
new file mode 100644
index 00000000..d84c967d
--- /dev/null
+++ b/Assets/Plugins/FMOD/README.txt
@@ -0,0 +1,14 @@
+Welcome to FMOD for Unity
+
+This package allows you to easily play back audio events created in FMOD Studio
+within your Unity project.
+
+The best place to start is with our online documentation:
+https://fmod.com/docs/2.03/unity
+
+If you prefer a more step-by-step guide, try our integration tutorial that
+builds on the familiar Karting Microgame:
+https://fmod.com/unity-integrate
+
+For support, join the conversation on our Unity forums:
+https://qa.fmod.com/c/unity
diff --git a/Assets/Plugins/FMOD/README.txt.meta b/Assets/Plugins/FMOD/README.txt.meta
new file mode 100644
index 00000000..aedadd8d
--- /dev/null
+++ b/Assets/Plugins/FMOD/README.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 081074d1d9d6ab448b88688c3730e8a1
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/Resources.meta b/Assets/Plugins/FMOD/Resources.meta
new file mode 100644
index 00000000..9d65e0be
--- /dev/null
+++ b/Assets/Plugins/FMOD/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7f2018ab6a44ad7458ee0938950d002e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset b/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset
new file mode 100644
index 00000000..960d2cc1
--- /dev/null
+++ b/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7ef795603174f1f6a2308d09011d5567051dc1eaf7b70754d1f39db7424f2f6
+size 20244
diff --git a/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset.meta b/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset.meta
new file mode 100644
index 00000000..a4bf79b0
--- /dev/null
+++ b/Assets/Plugins/FMOD/Resources/FMODStudioSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7fdd48378732dcd40822ad91167c82a3
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons.meta b/Assets/Plugins/FMOD/addons.meta
new file mode 100644
index 00000000..378c8d9c
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 850b7bf08237b964b8b005fe703774f9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio.meta
new file mode 100644
index 00000000..fdcef734
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ce39533effc93ba409e337ba540bf789
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor.meta
new file mode 100644
index 00000000..6cea53fe
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 93923a20291353a40809350917bab197
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef
new file mode 100644
index 00000000..5fec8976
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef
@@ -0,0 +1,19 @@
+{
+ "name": "FMODUnityResonanceEditor",
+ "references": [
+ "FMODUnityResonance"
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [
+ "UNITY_2021_3_OR_NEWER"
+ ],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef.meta
new file mode 100644
index 00000000..8b6366f9
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FMODUnityResonanceEditor.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 194213485063a984b98ce9410892267a
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs
new file mode 100644
index 00000000..d6a129f3
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs
@@ -0,0 +1,186 @@
+// Copyright 2017 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using UnityEngine;
+using UnityEditor;
+using System.Collections;
+using static FMODUnityResonance.FmodResonanceAudioRoom;
+
+namespace FMODUnityResonance
+{
+ /// A custom editor for properties on the FmodResonanceAudioRoom script. This appears in the
+ /// Inspector window of a FmodResonanceAudioRoom object.
+ [CustomEditor(typeof(FmodResonanceAudioRoom))]
+ [CanEditMultipleObjects]
+ public class FmodResonanceAudioRoomEditor : Editor
+ {
+ private SerializedProperty leftWall = null;
+ private SerializedProperty rightWall = null;
+ private SerializedProperty floor = null;
+ private SerializedProperty ceiling = null;
+ private SerializedProperty backWall = null;
+ private SerializedProperty frontWall = null;
+ private SerializedProperty reflectivity = null;
+ private SerializedProperty reverbGainDb = null;
+ private SerializedProperty reverbBrightness = null;
+ private SerializedProperty reverbTime = null;
+ private SerializedProperty size = null;
+
+ private GUIContent surfaceMaterialsLabel;
+ private GUIContent surfaceMaterialLabel;
+ private GUIContent reflectivityLabel;
+ private GUIContent reverbGainLabel;
+ private GUIContent reverbPropertiesLabel;
+ private GUIContent reverbBrightnessLabel;
+ private GUIContent reverbTimeLabel;
+ private GUIContent sizeLabel;
+
+ private static readonly string[] SurfaceMaterialDisplay = new string[] {
+ L10n.Tr("Transparent"),
+ L10n.Tr("Acoustic Ceiling Tiles"),
+ L10n.Tr("Brick Bare"),
+ L10n.Tr("Brick Painted"),
+ L10n.Tr("Concrete Block Coarse"),
+ L10n.Tr("Concrete Block Painted"),
+ L10n.Tr("Curtain Heavy"),
+ L10n.Tr("Fiberglass Insulation"),
+ L10n.Tr("Glass Thin"),
+ L10n.Tr("Glass Thick"),
+ L10n.Tr("Grass"),
+ L10n.Tr("Linoleum On Concrete"),
+ L10n.Tr("Marble"),
+ L10n.Tr("Metal"),
+ L10n.Tr("Parquet On Concrete"),
+ L10n.Tr("Plaster Rough"),
+ L10n.Tr("Plaster Smooth"),
+ L10n.Tr("Plywood Panel"),
+ L10n.Tr("Polished Concrete Or Tile"),
+ L10n.Tr("Sheetrock"),
+ L10n.Tr("Water Or Ice Surface"),
+ L10n.Tr("Wood Ceiling"),
+ L10n.Tr("Wood Panel"),
+ };
+
+ private static readonly int[] SurfaceMaterialValues = new int[] {
+ (int)SurfaceMaterial.Transparent,
+ (int)SurfaceMaterial.AcousticCeilingTiles,
+ (int)SurfaceMaterial.BrickBare,
+ (int)SurfaceMaterial.BrickPainted,
+ (int)SurfaceMaterial.ConcreteBlockCoarse,
+ (int)SurfaceMaterial.ConcreteBlockPainted,
+ (int)SurfaceMaterial.CurtainHeavy,
+ (int)SurfaceMaterial.FiberglassInsulation,
+ (int)SurfaceMaterial.GlassThin,
+ (int)SurfaceMaterial.GlassThick,
+ (int)SurfaceMaterial.Grass,
+ (int)SurfaceMaterial.LinoleumOnConcrete,
+ (int)SurfaceMaterial.Marble,
+ (int)SurfaceMaterial.Metal,
+ (int)SurfaceMaterial.ParquetOnConcrete,
+ (int)SurfaceMaterial.PlasterRough,
+ (int)SurfaceMaterial.PlasterSmooth,
+ (int)SurfaceMaterial.PlywoodPanel,
+ (int)SurfaceMaterial.PolishedConcreteOrTile,
+ (int)SurfaceMaterial.Sheetrock,
+ (int)SurfaceMaterial.WaterOrIceSurface,
+ (int)SurfaceMaterial.WoodCeiling,
+ (int)SurfaceMaterial.WoodPanel,
+ };
+
+ private void OnEnable()
+ {
+ surfaceMaterialsLabel = new GUIContent(L10n.Tr("Surface Materials"),
+ L10n.Tr("Room surface materials to calculate the acoustic properties of the room."));
+ surfaceMaterialLabel = new GUIContent(L10n.Tr("Surface Material"),
+ L10n.Tr("Surface material used to calculate the acoustic properties of the room."));
+ reflectivityLabel = new GUIContent(L10n.Tr("Reflectivity"),
+ L10n.Tr("Adjusts what proportion of the direct sound is reflected back by each surface, after an appropriate delay. Reverberation is unaffected by this setting."));
+ reverbGainLabel = new GUIContent(L10n.Tr("Gain (dB)"),
+ L10n.Tr("Applies a gain adjustment to the reverberation in the room. The default value will leave reverb unaffected."));
+ reverbPropertiesLabel = new GUIContent(L10n.Tr("Reverb Properties"),
+ L10n.Tr("Parameters to adjust the reverb properties of the room."));
+ reverbBrightnessLabel = new GUIContent(L10n.Tr("Brightness"),
+ L10n.Tr("Adjusts the balance between high and low frequencies in the reverb."));
+ reverbTimeLabel = new GUIContent(L10n.Tr("Time"),
+ L10n.Tr("Adjusts the overall duration of the reverb by a positive scaling factor."));
+ sizeLabel = new GUIContent(L10n.Tr("Size"), L10n.Tr("Sets the room dimensions."));
+ leftWall = serializedObject.FindProperty("LeftWall");
+ rightWall = serializedObject.FindProperty("RightWall");
+ floor = serializedObject.FindProperty("Floor");
+ ceiling = serializedObject.FindProperty("Ceiling");
+ backWall = serializedObject.FindProperty("BackWall");
+ frontWall = serializedObject.FindProperty("FrontWall");
+ reflectivity = serializedObject.FindProperty("Reflectivity");
+ reverbGainDb = serializedObject.FindProperty("ReverbGainDb");
+ reverbBrightness = serializedObject.FindProperty("ReverbBrightness");
+ reverbTime = serializedObject.FindProperty("ReverbTime");
+ size = serializedObject.FindProperty("Size");
+ }
+
+ /// @cond
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ // Add clickable script field, as would have been provided by DrawDefaultInspector()
+ MonoScript script = MonoScript.FromMonoBehaviour(target as MonoBehaviour);
+ EditorGUI.BeginDisabledGroup(true);
+ EditorGUILayout.ObjectField("Script", script, typeof(MonoScript), false);
+ EditorGUI.EndDisabledGroup();
+ EditorGUILayout.LabelField(surfaceMaterialsLabel);
+ ++EditorGUI.indentLevel;
+ DrawSurfaceMaterial(leftWall, L10n.Tr("Left Wall"));
+ DrawSurfaceMaterial(rightWall, L10n.Tr("Right Wall"));
+ DrawSurfaceMaterial(floor, L10n.Tr("Floor"));
+ DrawSurfaceMaterial(ceiling, L10n.Tr("Ceiling"));
+ DrawSurfaceMaterial(backWall, L10n.Tr("Back Wall"));
+ DrawSurfaceMaterial(frontWall, L10n.Tr("Front Wall"));
+ --EditorGUI.indentLevel;
+
+ EditorGUILayout.Separator();
+
+ EditorGUILayout.Slider(reflectivity, 0.0f, FmodResonanceAudio.MaxReflectivity, reflectivityLabel);
+
+ EditorGUILayout.Separator();
+
+ EditorGUILayout.LabelField(reverbPropertiesLabel);
+ ++EditorGUI.indentLevel;
+ EditorGUILayout.Slider(reverbGainDb, FmodResonanceAudio.MinGainDb, FmodResonanceAudio.MaxGainDb,
+ reverbGainLabel);
+ EditorGUILayout.Slider(reverbBrightness, FmodResonanceAudio.MinReverbBrightness,
+ FmodResonanceAudio.MaxReverbBrightness, reverbBrightnessLabel);
+ EditorGUILayout.Slider(reverbTime, 0.0f, FmodResonanceAudio.MaxReverbTime, reverbTimeLabel);
+ --EditorGUI.indentLevel;
+
+ EditorGUILayout.Separator();
+
+ EditorGUILayout.PropertyField(size, sizeLabel);
+
+ serializedObject.ApplyModifiedProperties();
+ }
+ /// @endcond
+
+ private void DrawSurfaceMaterial(SerializedProperty surfaceMaterial, string displayName)
+ {
+ EditorGUILayout.BeginHorizontal();
+
+ GUIContent labelContent = new GUIContent(displayName, surfaceMaterialLabel.tooltip);
+ EditorGUILayout.LabelField(labelContent, GUILayout.Width(150));
+ surfaceMaterial.intValue = EditorGUILayout.IntPopup(
+ surfaceMaterial.intValue, SurfaceMaterialDisplay, SurfaceMaterialValues);
+
+ EditorGUILayout.EndHorizontal();
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs.meta
new file mode 100644
index 00000000..b24704b4
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/FmodResonanceAudioRoomEditor.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 935c6716e27bd481e97897dd9e1de595
+timeCreated: 1511395157
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs
new file mode 100644
index 00000000..934bd587
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs
@@ -0,0 +1,3 @@
+#if UNITY_2020_2_OR_NEWER
+[assembly: UnityEditor.Localization]
+#endif
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs.meta
new file mode 100644
index 00000000..9aa2d6df
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/Localization.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6711f1f86af21644c897cc89748266f6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po
new file mode 100644
index 00000000..ec7b46b6
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po
@@ -0,0 +1,195 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: FMOD for Unity\n"
+"POT-Creation-Date: 2024-12-20 15:03+1100\n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.5\n"
+"X-Poedit-KeywordsList: ;L10n.Tr\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: FmodResonanceAudioRoomEditor.cs:51
+msgid "Transparent"
+msgstr "透明"
+
+#: FmodResonanceAudioRoomEditor.cs:52
+msgid "Acoustic Ceiling Tiles"
+msgstr "吸音天花板瓦"
+
+#: FmodResonanceAudioRoomEditor.cs:53
+msgid "Brick Bare"
+msgstr "裸砖"
+
+#: FmodResonanceAudioRoomEditor.cs:54
+msgid "Brick Painted"
+msgstr "涂漆砖"
+
+#: FmodResonanceAudioRoomEditor.cs:55
+msgid "Concrete Block Coarse"
+msgstr "粗糙混凝土块"
+
+#: FmodResonanceAudioRoomEditor.cs:56
+msgid "Concrete Block Painted"
+msgstr "涂漆混凝土块"
+
+#: FmodResonanceAudioRoomEditor.cs:57
+msgid "Curtain Heavy"
+msgstr "厚重窗帘"
+
+#: FmodResonanceAudioRoomEditor.cs:58
+msgid "Fiberglass Insulation"
+msgstr "玻璃纤维绝缘"
+
+#: FmodResonanceAudioRoomEditor.cs:59
+msgid "Glass Thin"
+msgstr "薄玻璃"
+
+#: FmodResonanceAudioRoomEditor.cs:60
+msgid "Glass Thick"
+msgstr "厚玻璃"
+
+#: FmodResonanceAudioRoomEditor.cs:61
+msgid "Grass"
+msgstr "草地"
+
+#: FmodResonanceAudioRoomEditor.cs:62
+msgid "Linoleum On Concrete"
+msgstr "沥青混凝土"
+
+#: FmodResonanceAudioRoomEditor.cs:63
+msgid "Marble"
+msgstr "大理石"
+
+#: FmodResonanceAudioRoomEditor.cs:64
+msgid "Metal"
+msgstr "金属"
+
+#: FmodResonanceAudioRoomEditor.cs:65
+msgid "Parquet On Concrete"
+msgstr "混凝土上的镶木地板"
+
+#: FmodResonanceAudioRoomEditor.cs:66
+msgid "Plaster Rough"
+msgstr "粗糙石膏"
+
+#: FmodResonanceAudioRoomEditor.cs:67
+msgid "Plaster Smooth"
+msgstr "光滑石膏"
+
+#: FmodResonanceAudioRoomEditor.cs:68
+msgid "Plywood Panel"
+msgstr "胶合板"
+
+#: FmodResonanceAudioRoomEditor.cs:69
+msgid "Polished Concrete Or Tile"
+msgstr "抛光混凝土或瓷砖"
+
+#: FmodResonanceAudioRoomEditor.cs:70
+msgid "Sheetrock"
+msgstr "石膏板"
+
+#: FmodResonanceAudioRoomEditor.cs:71
+msgid "Water Or Ice Surface"
+msgstr "水面或冰面"
+
+#: FmodResonanceAudioRoomEditor.cs:72
+msgid "Wood Ceiling"
+msgstr "木质天花板"
+
+#: FmodResonanceAudioRoomEditor.cs:73
+msgid "Wood Panel"
+msgstr "木板"
+
+#: FmodResonanceAudioRoomEditor.cs:104
+msgid "Surface Materials"
+msgstr "表面材质"
+
+#: FmodResonanceAudioRoomEditor.cs:105
+msgid "Room surface materials to calculate the acoustic properties of the room."
+msgstr "用于计算房间声学属性的房间表面材质。"
+
+#: FmodResonanceAudioRoomEditor.cs:106
+msgid "Surface Material"
+msgstr "表面材质"
+
+#: FmodResonanceAudioRoomEditor.cs:107
+msgid "Surface material used to calculate the acoustic properties of the room."
+msgstr "用于计算房间声学属性的表面材质。"
+
+#: FmodResonanceAudioRoomEditor.cs:108
+msgid "Reflectivity"
+msgstr "反射率"
+
+#: FmodResonanceAudioRoomEditor.cs:109
+msgid "Adjusts what proportion of the direct sound is reflected back by each surface, after an appropriate delay. Reverberation is unaffected by this setting."
+msgstr "调整每个表面在适当延迟后反射回直接声音的比例。混响效果不受此设置影响。"
+
+#: FmodResonanceAudioRoomEditor.cs:110
+msgid "Gain (dB)"
+msgstr "增加增益(分贝)"
+
+#: FmodResonanceAudioRoomEditor.cs:111
+msgid "Applies a gain adjustment to the reverberation in the room. The default value will leave reverb unaffected."
+msgstr "对房间中的混响应用增益调整。默认值将不影响混响效果。"
+
+#: FmodResonanceAudioRoomEditor.cs:112
+msgid "Reverb Properties"
+msgstr "混响属性"
+
+#: FmodResonanceAudioRoomEditor.cs:113
+msgid "Parameters to adjust the reverb properties of the room."
+msgstr "用于调整房间混响属性的参数。"
+
+#: FmodResonanceAudioRoomEditor.cs:114
+msgid "Brightness"
+msgstr "亮度"
+
+#: FmodResonanceAudioRoomEditor.cs:115
+msgid "Adjusts the balance between high and low frequencies in the reverb."
+msgstr "调整混响中高频和低频之间的平衡。"
+
+#: FmodResonanceAudioRoomEditor.cs:116
+msgid "Time"
+msgstr "时间"
+
+#: FmodResonanceAudioRoomEditor.cs:117
+msgid "Adjusts the overall duration of the reverb by a positive scaling factor."
+msgstr "通过正比例缩放因子调整混响的整体持续时间。"
+
+#: FmodResonanceAudioRoomEditor.cs:118
+msgid "Size"
+msgstr "尺寸"
+
+#: FmodResonanceAudioRoomEditor.cs:118
+msgid "Sets the room dimensions."
+msgstr "设置房间的尺寸。"
+
+#: FmodResonanceAudioRoomEditor.cs:144
+msgid "Left Wall"
+msgstr "左墙"
+
+#: FmodResonanceAudioRoomEditor.cs:145
+msgid "Right Wall"
+msgstr "右墙"
+
+#: FmodResonanceAudioRoomEditor.cs:146
+msgid "Floor"
+msgstr "地板"
+
+#: FmodResonanceAudioRoomEditor.cs:147
+msgid "Ceiling"
+msgstr "天花板"
+
+#: FmodResonanceAudioRoomEditor.cs:148
+msgid "Back Wall"
+msgstr "后墙"
+
+#: FmodResonanceAudioRoomEditor.cs:149
+msgid "Front Wall"
+msgstr "前墙"
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po.meta
new file mode 100644
index 00000000..7cc65a63
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Editor/zh_hans.po.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: df892acb3265e0043b3bb1b8981b5aeb
+LocalizationImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts.meta
new file mode 100644
index 00000000..3e4a6384
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 05a6a02c28ee77a49b6fcadf67aff3b7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef
new file mode 100644
index 00000000..94d9f828
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef
@@ -0,0 +1,17 @@
+{
+ "name": "FMODUnityResonance",
+ "references": [
+ "FMODUnity"
+ ],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [
+ "UNITY_2021_3_OR_NEWER"
+ ],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef.meta
new file mode 100644
index 00000000..25e9a501
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FMODUnityResonance.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 44d09cf463b68274884d8a3c8a94e528
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs
new file mode 100644
index 00000000..c7f47506
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs
@@ -0,0 +1,290 @@
+// Copyright 2017 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using UnityEngine;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using FMODUnity;
+
+namespace FMODUnityResonance
+{
+ /// This is the main Resonance Audio class that communicates with the FMOD Unity integration. Native
+ /// functions of the system can only be called through this class to preserve the internal system
+ /// functionality.
+ public static class FmodResonanceAudio
+ {
+ /// Maximum allowed gain value in decibels.
+ public const float MaxGainDb = 24.0f;
+
+ /// Minimum allowed gain value in decibels.
+ public const float MinGainDb = -24.0f;
+
+ /// Maximum allowed reverb brightness modifier value.
+ public const float MaxReverbBrightness = 1.0f;
+
+ /// Minimum allowed reverb brightness modifier value.
+ public const float MinReverbBrightness = -1.0f;
+
+ /// Maximum allowed reverb time modifier value.
+ public const float MaxReverbTime = 3.0f;
+
+ /// Maximum allowed reflectivity multiplier of a room surface material.
+ public const float MaxReflectivity = 2.0f;
+
+ // Right-handed to left-handed matrix converter (and vice versa).
+ private static readonly Matrix4x4 flipZ = Matrix4x4.Scale(new Vector3(1, 1, -1));
+
+ // Get a handle to the Resonance Audio Listener FMOD Plugin.
+ private static readonly string listenerPluginName = "Resonance Audio Listener";
+
+ // Size of |RoomProperties| struct in bytes.
+ private static readonly int roomPropertiesSize = Marshal.SizeOf();
+
+ // Plugin data parameter index for the room properties.
+ private static readonly int roomPropertiesIndex = 1;
+
+ // Boundaries instance to be used in room detection logic.
+ private static Bounds bounds = new Bounds(Vector3.zero, Vector3.zero);
+
+ // Container to store the currently active rooms in the scene.
+ private static List enabledRooms = new List();
+
+ // Current listener position.
+ private static FMOD.VECTOR listenerPositionFmod = new FMOD.VECTOR();
+
+ // FMOD Resonance Audio Listener Plugin.
+ private static FMOD.DSP listenerPlugin;
+
+ /// Updates the room effects of the environment with given |room| properties.
+ /// @note This should only be called from the main Unity thread.
+ public static void UpdateAudioRoom(FmodResonanceAudioRoom room, bool roomEnabled)
+ {
+ // Update the enabled rooms list.
+ if (roomEnabled)
+ {
+ if (!enabledRooms.Contains(room))
+ {
+ enabledRooms.Add(room);
+ }
+ }
+ else
+ {
+ enabledRooms.Remove(room);
+ }
+ // Update the current room effects to be applied.
+ if (enabledRooms.Count > 0)
+ {
+ FmodResonanceAudioRoom currentRoom = enabledRooms[enabledRooms.Count - 1];
+ RoomProperties roomProperties = GetRoomProperties(currentRoom);
+ // Pass the room properties into a pointer.
+ IntPtr roomPropertiesPtr = Marshal.AllocHGlobal(roomPropertiesSize);
+ Marshal.StructureToPtr(roomProperties, roomPropertiesPtr, false);
+ ListenerPlugin.setParameterData(roomPropertiesIndex, GetBytes(roomPropertiesPtr,
+ roomPropertiesSize));
+ Marshal.FreeHGlobal(roomPropertiesPtr);
+ }
+ else
+ {
+ // Set the room properties to a null room, which will effectively disable the room effects.
+ ListenerPlugin.setParameterData(roomPropertiesIndex, GetBytes(IntPtr.Zero, 0));
+ }
+ }
+
+ /// Returns whether the listener is currently inside the given |room| boundaries.
+ public static bool IsListenerInsideRoom(FmodResonanceAudioRoom room)
+ {
+ // Compute the room position relative to the listener.
+ FMOD.VECTOR unused;
+ RuntimeManager.CoreSystem.get3DListenerAttributes(0, out listenerPositionFmod, out unused,
+ out unused, out unused);
+ Vector3 listenerPosition = new Vector3(listenerPositionFmod.x, listenerPositionFmod.y,
+ listenerPositionFmod.z);
+ Vector3 relativePosition = listenerPosition - room.transform.position;
+ Quaternion rotationInverse = Quaternion.Inverse(room.transform.rotation);
+ // Set the size of the room as the boundary and return whether the listener is inside.
+ bounds.size = Vector3.Scale(room.transform.lossyScale, room.Size);
+ return bounds.Contains(rotationInverse * relativePosition);
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ private struct RoomProperties
+ {
+ // Center position of the room in world space.
+ public float PositionX;
+ public float PositionY;
+ public float PositionZ;
+
+ // Rotation (quaternion) of the room in world space.
+ public float RotationX;
+ public float RotationY;
+ public float RotationZ;
+ public float RotationW;
+
+ // Size of the shoebox room in world space.
+ public float DimensionsX;
+ public float DimensionsY;
+ public float DimensionsZ;
+
+ // Material name of each surface of the shoebox room.
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialLeft;
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialRight;
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialBottom;
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialTop;
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialFront;
+ public FmodResonanceAudioRoom.SurfaceMaterial MaterialBack;
+
+ // User defined uniform scaling factor for reflectivity. This parameter has no effect when set
+ // to 1.0f.
+ public float ReflectionScalar;
+
+ // User defined reverb tail gain multiplier. This parameter has no effect when set to 0.0f.
+ public float ReverbGain;
+
+ // Adjusts the reverberation time across all frequency bands. RT60 values are multiplied by this
+ // factor. Has no effect when set to 1.0f.
+ public float ReverbTime;
+
+ // Controls the slope of a line from the lowest to the highest RT60 values (increases high
+ // frequency RT60s when positive, decreases when negative). Has no effect when set to 0.0f.
+ public float ReverbBrightness;
+ };
+
+ // Returns the FMOD Resonance Audio Listener Plugin.
+ private static FMOD.DSP ListenerPlugin
+ {
+ get
+ {
+ if (!listenerPlugin.hasHandle())
+ {
+ listenerPlugin = Initialize();
+ }
+ return listenerPlugin;
+ }
+ }
+
+ // Converts given |db| value to its amplitude equivalent where 'dB = 20 * log10(amplitude)'.
+ private static float ConvertAmplitudeFromDb(float db)
+ {
+ return Mathf.Pow(10.0f, 0.05f * db);
+ }
+
+ // Converts given |position| and |rotation| from Unity space to audio space.
+ private static void ConvertAudioTransformFromUnity(ref Vector3 position,
+ ref Quaternion rotation)
+ {
+ // Compose the transformation matrix.
+ Matrix4x4 transformMatrix = Matrix4x4.TRS(position, rotation, Vector3.one);
+ // Convert the transformation matrix from left-handed to right-handed.
+ transformMatrix = flipZ * transformMatrix * flipZ;
+ // Update |position| and |rotation| respectively.
+ position = transformMatrix.GetColumn(3);
+ rotation = Quaternion.LookRotation(transformMatrix.GetColumn(2), transformMatrix.GetColumn(1));
+ }
+
+ // Returns a byte array of |length| created from |ptr|.
+ private static byte[] GetBytes(IntPtr ptr, int length)
+ {
+ if (ptr != IntPtr.Zero)
+ {
+ byte[] byteArray = new byte[length];
+ Marshal.Copy(ptr, byteArray, 0, length);
+ return byteArray;
+ }
+ // Return an empty array if the pointer is null.
+ return new byte[1];
+ }
+
+ // Returns room properties of the given |room|.
+ private static RoomProperties GetRoomProperties(FmodResonanceAudioRoom room)
+ {
+ RoomProperties roomProperties;
+ Vector3 position = room.transform.position;
+ Quaternion rotation = room.transform.rotation;
+ Vector3 scale = Vector3.Scale(room.transform.lossyScale, room.Size);
+ ConvertAudioTransformFromUnity(ref position, ref rotation);
+ roomProperties.PositionX = position.x;
+ roomProperties.PositionY = position.y;
+ roomProperties.PositionZ = position.z;
+ roomProperties.RotationX = rotation.x;
+ roomProperties.RotationY = rotation.y;
+ roomProperties.RotationZ = rotation.z;
+ roomProperties.RotationW = rotation.w;
+ roomProperties.DimensionsX = scale.x;
+ roomProperties.DimensionsY = scale.y;
+ roomProperties.DimensionsZ = scale.z;
+ roomProperties.MaterialLeft = room.LeftWall;
+ roomProperties.MaterialRight = room.RightWall;
+ roomProperties.MaterialBottom = room.Floor;
+ roomProperties.MaterialTop = room.Ceiling;
+ roomProperties.MaterialFront = room.FrontWall;
+ roomProperties.MaterialBack = room.BackWall;
+ roomProperties.ReverbGain = ConvertAmplitudeFromDb(room.ReverbGainDb);
+ roomProperties.ReverbTime = room.ReverbTime;
+ roomProperties.ReverbBrightness = room.ReverbBrightness;
+ roomProperties.ReflectionScalar = room.Reflectivity;
+ return roomProperties;
+ }
+
+ // Initializes and returns the FMOD Resonance Audio Listener Plugin.
+ private static FMOD.DSP Initialize()
+ {
+ // Search through all busses on in banks.
+ int numBanks = 0;
+ FMOD.DSP dsp = new FMOD.DSP();
+ FMOD.Studio.Bank[] banks = null;
+ RuntimeManager.StudioSystem.getBankCount(out numBanks);
+ RuntimeManager.StudioSystem.getBankList(out banks);
+ for (int currentBank = 0; currentBank < numBanks; ++currentBank)
+ {
+ int numBusses = 0;
+ FMOD.Studio.Bus[] busses = null;
+ banks[currentBank].getBusCount(out numBusses);
+ banks[currentBank].getBusList(out busses);
+ for (int currentBus = 0; currentBus < numBusses; ++currentBus)
+ {
+ // Make sure the channel group of the current bus is assigned properly.
+ string busPath = null;
+ busses[currentBus].getPath(out busPath);
+ RuntimeManager.StudioSystem.getBus(busPath, out busses[currentBus]);
+ busses[currentBus].lockChannelGroup();
+ RuntimeManager.StudioSystem.flushCommands();
+ FMOD.ChannelGroup channelGroup;
+ busses[currentBus].getChannelGroup(out channelGroup);
+ if (channelGroup.hasHandle())
+ {
+ int numDsps = 0;
+ channelGroup.getNumDSPs(out numDsps);
+ for (int currentDsp = 0; currentDsp < numDsps; ++currentDsp)
+ {
+ channelGroup.getDSP(currentDsp, out dsp);
+ string dspNameSb;
+ int unusedInt = 0;
+ uint unusedUint = 0;
+ dsp.getInfo(out dspNameSb, out unusedUint, out unusedInt, out unusedInt, out unusedInt);
+ if (dspNameSb.ToString().Equals(listenerPluginName) && dsp.hasHandle())
+ {
+ return dsp;
+ }
+ }
+ }
+ busses[currentBus].unlockChannelGroup();
+ }
+ }
+ RuntimeUtils.DebugLogError(listenerPluginName + " not found in the FMOD project.");
+ return dsp;
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs.meta
new file mode 100644
index 00000000..4c2e2f74
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudio.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6794e6301575a445d8588930a0752568
+timeCreated: 1511395157
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs
new file mode 100644
index 00000000..e74449c8
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs
@@ -0,0 +1,121 @@
+// Copyright 2017 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using UnityEngine;
+using UnityEngine.Serialization;
+using System.Collections;
+
+namespace FMODUnityResonance
+{
+ /// Resonance Audio room component that simulates environmental effects of a room with respect to
+ /// the properties of the attached game object.
+ [AddComponentMenu("ResonanceAudio/FmodResonanceAudioRoom")]
+ public class FmodResonanceAudioRoom : MonoBehaviour
+ {
+ /// Material type that determines the acoustic properties of a room surface.
+ public enum SurfaceMaterial
+ {
+ Transparent = 0, ///< Transparent
+ AcousticCeilingTiles = 1, ///< Acoustic ceiling tiles
+ BrickBare = 2, ///< Brick, bare
+ BrickPainted = 3, ///< Brick, painted
+ ConcreteBlockCoarse = 4, ///< Concrete block, coarse
+ ConcreteBlockPainted = 5, ///< Concrete block, painted
+ CurtainHeavy = 6, ///< Curtain, heavy
+ FiberglassInsulation = 7, ///< Fiberglass insulation
+ GlassThin = 8, ///< Glass, thin
+ GlassThick = 9, ///< Glass, thick
+ Grass = 10, ///< Grass
+ LinoleumOnConcrete = 11, ///< Linoleum on concrete
+ Marble = 12, ///< Marble
+ Metal = 13, ///< Galvanized sheet metal
+ ParquetOnConcrete = 14, ///< Parquet on concrete
+ PlasterRough = 15, ///< Plaster, rough
+ PlasterSmooth = 16, ///< Plaster, smooth
+ PlywoodPanel = 17, ///< Plywood panel
+ PolishedConcreteOrTile = 18, ///< Polished concrete or tile
+ Sheetrock = 19, ///< Sheetrock
+ WaterOrIceSurface = 20, ///< Water or ice surface
+ WoodCeiling = 21, ///< Wood ceiling
+ WoodPanel = 22 ///< Wood panel
+ }
+
+ /// Room surface material in negative x direction.
+ [FormerlySerializedAs("leftWall")]
+ public SurfaceMaterial LeftWall = SurfaceMaterial.ConcreteBlockCoarse;
+
+ /// Room surface material in positive x direction.
+ [FormerlySerializedAs("rightWall")]
+ public SurfaceMaterial RightWall = SurfaceMaterial.ConcreteBlockCoarse;
+
+ /// Room surface material in negative y direction.
+ [FormerlySerializedAs("floor")]
+ public SurfaceMaterial Floor = SurfaceMaterial.ParquetOnConcrete;
+
+ /// Room surface material in positive y direction.
+ [FormerlySerializedAs("ceiling")]
+ public SurfaceMaterial Ceiling = SurfaceMaterial.PlasterRough;
+
+ /// Room surface material in negative z direction.
+ [FormerlySerializedAs("backWall")]
+ public SurfaceMaterial BackWall = SurfaceMaterial.ConcreteBlockCoarse;
+
+ /// Room surface material in positive z direction.
+ [FormerlySerializedAs("frontWall")]
+ public SurfaceMaterial FrontWall = SurfaceMaterial.ConcreteBlockCoarse;
+
+ /// Reflectivity scalar for each surface of the room.
+ [FormerlySerializedAs("reflectivity")]
+ public float Reflectivity = 1.0f;
+
+ /// Reverb gain modifier in decibels.
+ [FormerlySerializedAs("reverbGainDb")]
+ public float ReverbGainDb = 0.0f;
+
+ /// Reverb brightness modifier.
+ [FormerlySerializedAs("reverbBrightness")]
+ public float ReverbBrightness = 0.0f;
+
+ /// Reverb time modifier.
+ [FormerlySerializedAs("reverbTime")]
+ public float ReverbTime = 1.0f;
+
+ /// Size of the room (normalized with respect to scale of the game object).
+ [FormerlySerializedAs("size")]
+ public Vector3 Size = Vector3.one;
+
+ private void OnEnable()
+ {
+ FmodResonanceAudio.UpdateAudioRoom(this, FmodResonanceAudio.IsListenerInsideRoom(this));
+ }
+
+ private void OnDisable()
+ {
+ FmodResonanceAudio.UpdateAudioRoom(this, false);
+ }
+
+ private void Update()
+ {
+ FmodResonanceAudio.UpdateAudioRoom(this, FmodResonanceAudio.IsListenerInsideRoom(this));
+ }
+
+ private void OnDrawGizmosSelected()
+ {
+ // Draw shoebox model wireframe of the room.
+ Gizmos.color = Color.yellow;
+ Gizmos.matrix = transform.localToWorldMatrix;
+ Gizmos.DrawWireCube(Vector3.zero, Size);
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs.meta b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs.meta
new file mode 100644
index 00000000..3ee062da
--- /dev/null
+++ b/Assets/Plugins/FMOD/addons/ResonanceAudio/Scripts/FmodResonanceAudioRoom.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6b0c5e63920ee4f55b7ec5248525af4b
+timeCreated: 1511395157
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images.meta b/Assets/Plugins/FMOD/images.meta
new file mode 100644
index 00000000..11207983
--- /dev/null
+++ b/Assets/Plugins/FMOD/images.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 27e5eef2bd66ffe429eebdc4579b7231
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/AddIcon.png b/Assets/Plugins/FMOD/images/AddIcon.png
new file mode 100644
index 00000000..62d6e58e
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/AddIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:860e3a60f97b4f9961eda80617e922ceffeb67aa145077ba0599863ca306a467
+size 380
diff --git a/Assets/Plugins/FMOD/images/AddIcon.png.meta b/Assets/Plugins/FMOD/images/AddIcon.png.meta
new file mode 100644
index 00000000..4b199427
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/AddIcon.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 3300e81f02e64924eb7cb7782713b126
+timeCreated: 1455151837
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/ArrowIcon.png b/Assets/Plugins/FMOD/images/ArrowIcon.png
new file mode 100644
index 00000000..d6184417
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/ArrowIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ad41545295b579cf3d262f069c5b9ec48b03bd5a1f64a465b7af44272f66cb7
+size 292
diff --git a/Assets/Plugins/FMOD/images/ArrowIcon.png.meta b/Assets/Plugins/FMOD/images/ArrowIcon.png.meta
new file mode 100644
index 00000000..423fb26f
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/ArrowIcon.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 01c0101f357b9da4ba78b8f58c290f86
+timeCreated: 1455161898
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/BankIcon.png b/Assets/Plugins/FMOD/images/BankIcon.png
new file mode 100644
index 00000000..2de820b0
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/BankIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:057c16f44a3725bb4228401150c905b384ce1e1dfde6902ab074b8405c05b7c7
+size 3699
diff --git a/Assets/Plugins/FMOD/images/BankIcon.png.meta b/Assets/Plugins/FMOD/images/BankIcon.png.meta
new file mode 100644
index 00000000..f53f3a79
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/BankIcon.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: a7e06068a7215854a84bf5ed8280ed15
+timeCreated: 1433208188
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/Border.png b/Assets/Plugins/FMOD/images/Border.png
new file mode 100644
index 00000000..4d9969ec
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Border.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe700034ded2e2586d707689971698310ce5964018d1a774fb6c6ed9f9060d27
+size 179
diff --git a/Assets/Plugins/FMOD/images/Border.png.meta b/Assets/Plugins/FMOD/images/Border.png.meta
new file mode 100644
index 00000000..92ec9078
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Border.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 40848578d1961334d820821bec6175a4
+timeCreated: 1455150446
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/BrowserIcon.png b/Assets/Plugins/FMOD/images/BrowserIcon.png
new file mode 100644
index 00000000..6e0acd4d
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/BrowserIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e45e42c47b7bf4214d50dcdca6ee7c7b47cce163eb948f8ffcdbf99837fe504c
+size 3194
diff --git a/Assets/Plugins/FMOD/images/BrowserIcon.png.meta b/Assets/Plugins/FMOD/images/BrowserIcon.png.meta
new file mode 100644
index 00000000..c8b42755
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/BrowserIcon.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: c783b763d12874147876e070661b66ab
+timeCreated: 1455688158
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png b/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png
new file mode 100644
index 00000000..e317c4ca
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:765322a24dd9be4feda19b5338f83cfdb4250a329c7ddd6e784b4205cb9e5f40
+size 3234
diff --git a/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png.meta b/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png.meta
new file mode 100644
index 00000000..e0177f1c
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/ContinuousParameterIcon.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: b92803770616fc747bc3c40ffaec0a42
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/CopyIcon.png b/Assets/Plugins/FMOD/images/CopyIcon.png
new file mode 100644
index 00000000..41013f26
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/CopyIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2b04ee62fd5d8072051bce97cf0edb1465ed43e71ac14485869297157ea05a9
+size 552
diff --git a/Assets/Plugins/FMOD/images/CopyIcon.png.meta b/Assets/Plugins/FMOD/images/CopyIcon.png.meta
new file mode 100644
index 00000000..792ff4b8
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/CopyIcon.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 6e164dcb85fc8ad4b9ab2f1e883862d2
+timeCreated: 1455688729
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ linearTexture: 0
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: -1
+ mipBias: -1
+ wrapMode: -1
+ nPOTScale: 1
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 0
+ textureType: -1
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/CrossYellow.png b/Assets/Plugins/FMOD/images/CrossYellow.png
new file mode 100644
index 00000000..ab9a2f69
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/CrossYellow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:76090493a60a8bf675e1ab27c5183fc0c1624c889ca6dfe64a703cde2187e88d
+size 278
diff --git a/Assets/Plugins/FMOD/images/CrossYellow.png.meta b/Assets/Plugins/FMOD/images/CrossYellow.png.meta
new file mode 100644
index 00000000..ef4e3561
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/CrossYellow.png.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: 348d2265b48c67342a4db2a7062813fa
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/Delete.png b/Assets/Plugins/FMOD/images/Delete.png
new file mode 100644
index 00000000..3bbc0943
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Delete.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ca01b263c0395dce602ba7ff5a836d7f461216d860427a0e3df55a7ab71efa6
+size 221
diff --git a/Assets/Plugins/FMOD/images/Delete.png.meta b/Assets/Plugins/FMOD/images/Delete.png.meta
new file mode 100644
index 00000000..40412c6f
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Delete.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 196080340db65c44883dd3f599556fb9
+timeCreated: 1434604329
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png b/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png
new file mode 100644
index 00000000..b5fd7a7c
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bae2b164cbe65ba21d1d509da1f6861c82256a1e8402a7d6d265e7f98d5ebc11
+size 3041
diff --git a/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png.meta b/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png.meta
new file mode 100644
index 00000000..81ee8697
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/DiscreteParameterIcon.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: 509563e7079a6ed4cbf3b3240327e702
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/EventIcon.png b/Assets/Plugins/FMOD/images/EventIcon.png
new file mode 100644
index 00000000..639d0357
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/EventIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:846f36969a9193bb47cde4c12d2b39c76d3eaa9db4d8ba8b16eb76d21225f24b
+size 705
diff --git a/Assets/Plugins/FMOD/images/EventIcon.png.meta b/Assets/Plugins/FMOD/images/EventIcon.png.meta
new file mode 100644
index 00000000..f680acd9
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/EventIcon.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: a602f206f9cb31f439c79a2fe23687c5
+timeCreated: 1432616010
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/FMODLogoBlack.png b/Assets/Plugins/FMOD/images/FMODLogoBlack.png
new file mode 100644
index 00000000..84f5bfc5
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FMODLogoBlack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5cece587e055d82ea2776b0ebff697ce32e024f301ed62077a573e851c75dcab
+size 9688
diff --git a/Assets/Plugins/FMOD/images/FMODLogoBlack.png.meta b/Assets/Plugins/FMOD/images/FMODLogoBlack.png.meta
new file mode 100644
index 00000000..8a39f85e
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FMODLogoBlack.png.meta
@@ -0,0 +1,144 @@
+fileFormatVersion: 2
+guid: 36e46b3c334e47e41a0b4ff2f26905ea
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: PS4
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/FMODLogoWhite.png b/Assets/Plugins/FMOD/images/FMODLogoWhite.png
new file mode 100644
index 00000000..7af7037a
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FMODLogoWhite.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b766d70460bfa442ede86dcdaeac016650552c511be711319c94b74554a7fd9f
+size 8803
diff --git a/Assets/Plugins/FMOD/images/FMODLogoWhite.png.meta b/Assets/Plugins/FMOD/images/FMODLogoWhite.png.meta
new file mode 100644
index 00000000..7b306ec8
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FMODLogoWhite.png.meta
@@ -0,0 +1,144 @@
+fileFormatVersion: 2
+guid: 8fd8ccb8d7e81d943b28ea7975c7185d
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: PS4
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 256
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 0
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/FolderIconClosed.png b/Assets/Plugins/FMOD/images/FolderIconClosed.png
new file mode 100644
index 00000000..014196bb
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FolderIconClosed.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e0e2cfe75a26e20382f957b843f704ce604a0b24e5152470ebd28208cfac212
+size 2963
diff --git a/Assets/Plugins/FMOD/images/FolderIconClosed.png.meta b/Assets/Plugins/FMOD/images/FolderIconClosed.png.meta
new file mode 100644
index 00000000..4b3bdbe4
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FolderIconClosed.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 70efeb6d97126f843b30b8ed62d18a4f
+timeCreated: 1432621560
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/FolderIconOpen.png b/Assets/Plugins/FMOD/images/FolderIconOpen.png
new file mode 100644
index 00000000..ffded31d
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FolderIconOpen.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a5f22962370823cae68458fcc089dd0759636aff6d1e2f45bd701d740aa5598
+size 3221
diff --git a/Assets/Plugins/FMOD/images/FolderIconOpen.png.meta b/Assets/Plugins/FMOD/images/FolderIconOpen.png.meta
new file mode 100644
index 00000000..1be40860
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/FolderIconOpen.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: d2b54e4f7f80b9448a41d3c5985f5672
+timeCreated: 1432621574
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/LabeledParameterIcon.png b/Assets/Plugins/FMOD/images/LabeledParameterIcon.png
new file mode 100644
index 00000000..bbc27572
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LabeledParameterIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:929ddbd86aad8bc5ae3b466bb2f5f36ed953da22b04cbf4dd8ab8166e4ef91b4
+size 3101
diff --git a/Assets/Plugins/FMOD/images/LabeledParameterIcon.png.meta b/Assets/Plugins/FMOD/images/LabeledParameterIcon.png.meta
new file mode 100644
index 00000000..0a824810
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LabeledParameterIcon.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: b4d696e5c0be6f44bb2f02aa41320656
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/LevelMeter.png b/Assets/Plugins/FMOD/images/LevelMeter.png
new file mode 100644
index 00000000..27ffcca4
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LevelMeter.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf765236491fd508c50e16b64a19b8f27e79f2174d94c61dd2399dd39ebf8d88
+size 2685
diff --git a/Assets/Plugins/FMOD/images/LevelMeter.png.meta b/Assets/Plugins/FMOD/images/LevelMeter.png.meta
new file mode 100644
index 00000000..4c7a36b7
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LevelMeter.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 21e7a3d41a926364a8b9a6704ebe80d8
+timeCreated: 1433917421
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/LevelMeterOff.png b/Assets/Plugins/FMOD/images/LevelMeterOff.png
new file mode 100644
index 00000000..81068bd5
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LevelMeterOff.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e162e74d2e9c71d12514bd3199c46cb79046e2e2df315aa8bf5587f61bbd6cd
+size 2194
diff --git a/Assets/Plugins/FMOD/images/LevelMeterOff.png.meta b/Assets/Plugins/FMOD/images/LevelMeterOff.png.meta
new file mode 100644
index 00000000..473c6cbe
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/LevelMeterOff.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 48dc5470d93f669419f294fcd33f7b7c
+timeCreated: 1434426551
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/NotFound.png b/Assets/Plugins/FMOD/images/NotFound.png
new file mode 100644
index 00000000..ca6e7b54
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/NotFound.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ae518102dd2ae8fab1a9bd2f526c8897de491f55f28ceb72ac3a4e0365d330d
+size 3139
diff --git a/Assets/Plugins/FMOD/images/NotFound.png.meta b/Assets/Plugins/FMOD/images/NotFound.png.meta
new file mode 100644
index 00000000..bd16a949
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/NotFound.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 1138ab068176f29499337d7a73dfecd9
+timeCreated: 1432798099
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/Preview.png b/Assets/Plugins/FMOD/images/Preview.png
new file mode 100644
index 00000000..b4416d39
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Preview.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5442882e67f6bd03f05d5cdaf38b12ab53099e2fc002c17ff9d75fe74d917ad1
+size 17576
diff --git a/Assets/Plugins/FMOD/images/Preview.png.meta b/Assets/Plugins/FMOD/images/Preview.png.meta
new file mode 100644
index 00000000..b9fc668d
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Preview.png.meta
@@ -0,0 +1,56 @@
+fileFormatVersion: 2
+guid: 0793eda432fc5df4ab1291e6baacd771
+timeCreated: 1434430906
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: 1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/PreviewEmitter.png b/Assets/Plugins/FMOD/images/PreviewEmitter.png
new file mode 100644
index 00000000..bbbbe102
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/PreviewEmitter.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d555a49c7381486bc846b226dbaedf52ae4bf3206e7f150c07756641b3228e88
+size 278
diff --git a/Assets/Plugins/FMOD/images/PreviewEmitter.png.meta b/Assets/Plugins/FMOD/images/PreviewEmitter.png.meta
new file mode 100644
index 00000000..7e74c5d7
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/PreviewEmitter.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 9519043db3741934fa01455c47683e8c
+timeCreated: 1434431177
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ linearTexture: 0
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: -1
+ mipBias: -1
+ wrapMode: -1
+ nPOTScale: 1
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 0
+ textureType: -1
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/SearchIconBlack.png b/Assets/Plugins/FMOD/images/SearchIconBlack.png
new file mode 100644
index 00000000..4118e535
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SearchIconBlack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17a08ec9844a6c30a78346c21d4ea627645fa217d8e1e6ef8225885e80c663ef
+size 3025
diff --git a/Assets/Plugins/FMOD/images/SearchIconBlack.png.meta b/Assets/Plugins/FMOD/images/SearchIconBlack.png.meta
new file mode 100644
index 00000000..aaa1c13b
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SearchIconBlack.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: 99471facfde9fb84dbe4a81ad570ebce
+timeCreated: 1434602090
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/SelectedAlt.png b/Assets/Plugins/FMOD/images/SelectedAlt.png
new file mode 100644
index 00000000..b39f1633
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SelectedAlt.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9450a6d1836697cc7b196df8d9b829c66dc9e38400cd00e78abc0fa0d4290b84
+size 170
diff --git a/Assets/Plugins/FMOD/images/SelectedAlt.png.meta b/Assets/Plugins/FMOD/images/SelectedAlt.png.meta
new file mode 100644
index 00000000..0ddcc1f8
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SelectedAlt.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 8ce9b717b1bc7564cbe35664f2f178a7
+timeCreated: 1455161898
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/SnapshotIcon.png b/Assets/Plugins/FMOD/images/SnapshotIcon.png
new file mode 100644
index 00000000..86ac78db
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SnapshotIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a64f883f76eec0a308b9af0607394b4030b3c0b25e22afaae48779b7525c2ef9
+size 737
diff --git a/Assets/Plugins/FMOD/images/SnapshotIcon.png.meta b/Assets/Plugins/FMOD/images/SnapshotIcon.png.meta
new file mode 100644
index 00000000..4755690c
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/SnapshotIcon.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: cf2bba5fb8be7e64ca39979f18eb372a
+timeCreated: 1434600422
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/StudioIcon.png b/Assets/Plugins/FMOD/images/StudioIcon.png
new file mode 100644
index 00000000..d5b631b9
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/StudioIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:adb4854cc54817bc18bab8f51b6b9f5dd49220f7019877e596cb02fddf009dd8
+size 3581
diff --git a/Assets/Plugins/FMOD/images/StudioIcon.png.meta b/Assets/Plugins/FMOD/images/StudioIcon.png.meta
new file mode 100644
index 00000000..2f7dae74
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/StudioIcon.png.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: a4edfa5854cdec34b98b1c55f0562bdd
+timeCreated: 1434601223
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: .25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 8
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -1
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: .5, y: .5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TickGreen.png b/Assets/Plugins/FMOD/images/TickGreen.png
new file mode 100644
index 00000000..67a6b133
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TickGreen.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e6d253361b6878408e62b8aa8da4edb6167fa97c038748f18ebad22292cb6e65
+size 244
diff --git a/Assets/Plugins/FMOD/images/TickGreen.png.meta b/Assets/Plugins/FMOD/images/TickGreen.png.meta
new file mode 100644
index 00000000..0f39bc16
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TickGreen.png.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: 27533226416c4f549b9bec9c024100f7
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TransportOpen.png b/Assets/Plugins/FMOD/images/TransportOpen.png
new file mode 100644
index 00000000..cd382e12
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportOpen.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09901dc10713d986ef1df3b28d6d637d978263f86eebd18fddb57b8d7d3cf472
+size 4234
diff --git a/Assets/Plugins/FMOD/images/TransportOpen.png.meta b/Assets/Plugins/FMOD/images/TransportOpen.png.meta
new file mode 100644
index 00000000..c06cc4e7
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportOpen.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: b0fb832e401d1514a9611735d8d340b1
+timeCreated: 1453178387
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: -1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png b/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png
new file mode 100644
index 00000000..382eaf77
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7235df4b7a8cc331595984bae5f2f11f18a2da8808a92cbc268454ad7836999d
+size 3525
diff --git a/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png.meta b/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png.meta
new file mode 100644
index 00000000..48014c58
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportPlayButtonOff.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 29258b1336a580946bc144df00b74ac1
+timeCreated: 1453177025
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: 1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png b/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png
new file mode 100644
index 00000000..71dc6f0e
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b3ef1497d5583fc59777d3e32b7f0841a1b40cad462f6c7b76e02b600cbe7d2
+size 3715
diff --git a/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png.meta b/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png.meta
new file mode 100644
index 00000000..7d4553fd
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportPlayButtonOn.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: 2d777c9a14189d241aea1afeeeff448c
+timeCreated: 1453177025
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: 1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TransportStopButtonOff.png b/Assets/Plugins/FMOD/images/TransportStopButtonOff.png
new file mode 100644
index 00000000..7cb939f8
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportStopButtonOff.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3813b737ddf9a4c4ccbad813498d029e168f5d2bdb55ac4940f380f0ef34b9b
+size 3290
diff --git a/Assets/Plugins/FMOD/images/TransportStopButtonOff.png.meta b/Assets/Plugins/FMOD/images/TransportStopButtonOff.png.meta
new file mode 100644
index 00000000..9f592a1b
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportStopButtonOff.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: cafa069c15865d543a07375373f0a18e
+timeCreated: 1453177025
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: 1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/TransportStopButtonOn.png b/Assets/Plugins/FMOD/images/TransportStopButtonOn.png
new file mode 100644
index 00000000..d913100c
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportStopButtonOn.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b575ed82986cacca2633358315b4ff642d81fd277825afd54f4ddc5d97880b32
+size 3463
diff --git a/Assets/Plugins/FMOD/images/TransportStopButtonOn.png.meta b/Assets/Plugins/FMOD/images/TransportStopButtonOn.png.meta
new file mode 100644
index 00000000..7ebdb4f6
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/TransportStopButtonOn.png.meta
@@ -0,0 +1,57 @@
+fileFormatVersion: 2
+guid: eab53cb0959d1244aadeacf8b76c755c
+timeCreated: 1453177025
+licenseType: Free
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 2
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ linearTexture: 1
+ correctGamma: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 0
+ cubemapConvolution: 0
+ cubemapConvolutionSteps: 7
+ cubemapConvolutionExponent: 1.5
+ seamlessCubemap: 0
+ textureFormat: -3
+ maxTextureSize: 2048
+ textureSettings:
+ filterMode: 1
+ aniso: 1
+ mipBias: -1
+ wrapMode: 1
+ nPOTScale: 0
+ lightmap: 0
+ rGBM: 0
+ compressionQuality: 50
+ allowsAlphaSplitting: 0
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spritePixelsToUnits: 100
+ alphaIsTransparency: 1
+ textureType: 2
+ buildTargetSettings: []
+ spriteSheet:
+ sprites: []
+ outline: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/images/Wrench.png b/Assets/Plugins/FMOD/images/Wrench.png
new file mode 100644
index 00000000..196c857d
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Wrench.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4d6b8c5858c1ee781c129bd611fe94412088d7198285766ce88433901f85a22f
+size 521
diff --git a/Assets/Plugins/FMOD/images/Wrench.png.meta b/Assets/Plugins/FMOD/images/Wrench.png.meta
new file mode 100644
index 00000000..294315a6
--- /dev/null
+++ b/Assets/Plugins/FMOD/images/Wrench.png.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: 507cd805ad331e54cb9e9cab5a9270b5
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: 1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: -1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 2
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platform_ios.mm b/Assets/Plugins/FMOD/platform_ios.mm
new file mode 100644
index 00000000..3828a8a0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platform_ios.mm
@@ -0,0 +1,128 @@
+#import
+#import
+
+static void (*gSuspendCallback)(bool suspend) = nullptr;
+static bool gIsSuspended = false;
+static bool gNeedsReset = false;
+
+extern "C" void RegisterSuspendCallback(void (*callback)(bool))
+{
+ if (gSuspendCallback || !callback)
+ {
+ return;
+ }
+ gSuspendCallback = callback;
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+ {
+ AVAudioSessionInterruptionType type = (AVAudioSessionInterruptionType)[[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
+ if (type == AVAudioSessionInterruptionTypeBegan)
+ {
+ NSLog(@"Interruption Began");
+ // Ignore deprecated warnings regarding AVAudioSessionInterruptionReasonAppWasSuspended and
+ // AVAudioSessionInterruptionWasSuspendedKey, we protect usage for the versions where they are available
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+ // If the audio session was deactivated while the app was in the background, the app receives the
+ // notification when relaunched. Identify this reason for interruption and ignore it.
+ if (@available(iOS 16.0, tvOS 14.5, *))
+ {
+ // Delayed suspend-in-background notifications no longer exist, this must be a real interruption
+ }
+ #if !TARGET_OS_TV // tvOS never supported "AVAudioSessionInterruptionReasonAppWasSuspended"
+ else if (@available(iOS 14.5, *))
+ {
+ if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionReasonKey] intValue] == AVAudioSessionInterruptionReasonAppWasSuspended)
+ {
+ return; // Ignore delayed suspend-in-background notification
+ }
+ }
+ #endif
+ else
+ {
+ if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionWasSuspendedKey] boolValue])
+ {
+ return; // Ignore delayed suspend-in-background notification
+ }
+ }
+
+ gSuspendCallback(true);
+ gIsSuspended = true;
+
+ #pragma clang diagnostic pop
+ }
+ else if (type == AVAudioSessionInterruptionTypeEnded)
+ {
+ NSLog(@"Interruption Ended");
+ NSError *errorMessage = nullptr;
+ if (![[AVAudioSession sharedInstance] setActive:TRUE error:&errorMessage])
+ {
+ // Interruption like Siri can prevent session activation, wait for did-become-active notification
+ NSLog(@"AVAudioSessionInterruptionNotification: AVAudioSession.setActive() failed: %@", errorMessage);
+ return;
+ }
+
+ gSuspendCallback(false);
+ gIsSuspended = false;
+ }
+ }];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+ {
+ // Unity video playback prior to 2022.3 on tvOS breaks FMOD audio, so force a reset
+ #if TARGET_OS_TV && !UNITY_2022_3_OR_NEWER
+ gNeedsReset = true;
+ #endif
+
+ if (gNeedsReset)
+ {
+ gSuspendCallback(true);
+ gIsSuspended = true;
+ }
+
+ NSError *errorMessage = nullptr;
+ if (![[AVAudioSession sharedInstance] setActive:TRUE error:&errorMessage])
+ {
+ if ([errorMessage code] == AVAudioSessionErrorCodeCannotStartPlaying)
+ {
+ // Interruption like Screen Time can prevent session activation, but will not trigger an interruption-ended notification.
+ // There is no other callback or trigger to hook into after this point, we are not in the background and there is no other audio playing.
+ // Our only option is to have a sleep loop until the Audio Session can be activated again.
+ while (![[AVAudioSession sharedInstance] setActive:TRUE error:nil])
+ {
+ usleep(20000);
+ }
+ }
+ else
+ {
+ // Interruption like Siri can prevent session activation, wait for interruption-ended notification.
+ NSLog(@"UIApplicationDidBecomeActiveNotification: AVAudioSession.setActive() failed: %@", errorMessage);
+ return;
+ }
+ }
+
+ // It's possible the system missed sending us an interruption end, so recover here
+ if (gIsSuspended)
+ {
+ gSuspendCallback(false);
+ gNeedsReset = false;
+ gIsSuspended = false;
+ }
+ }];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionMediaServicesWereResetNotification object:nil queue:nil usingBlock:^(NSNotification *notification)
+ {
+ if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || gIsSuspended)
+ {
+ // Received the reset notification while in the background, need to reset the AudioUnit when we come back to foreground.
+ gNeedsReset = true;
+ }
+ else
+ {
+ // In the foregound but something chopped the media services, need to do a reset.
+ gSuspendCallback(true);
+ gSuspendCallback(false);
+ }
+ }];
+}
diff --git a/Assets/Plugins/FMOD/platform_ios.mm.meta b/Assets/Plugins/FMOD/platform_ios.mm.meta
new file mode 100644
index 00000000..53d926f3
--- /dev/null
+++ b/Assets/Plugins/FMOD/platform_ios.mm.meta
@@ -0,0 +1,112 @@
+fileFormatVersion: 2
+guid: fc7eb3c9194584004bdf04921e5cb057
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 0
+ Exclude WebGL: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 0
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 1
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ CPU: AnyCPU
+ FrameworkDependencies:
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: AnyCPU
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms.meta b/Assets/Plugins/FMOD/platforms.meta
new file mode 100644
index 00000000..d6fd5949
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8b617f082dd1f0645bde3b4ff3cbc25a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android.meta b/Assets/Plugins/FMOD/platforms/android.meta
new file mode 100644
index 00000000..67a97add
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ca9461535f8115a4fb8293c748bcd2e1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib.meta b/Assets/Plugins/FMOD/platforms/android/lib.meta
new file mode 100644
index 00000000..bce0b766
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 328160e4bc4e8b74296f830386ae016b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a.meta
new file mode 100644
index 00000000..a37fe476
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 54305e5cd6046514181f9b21fb0c44ed
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so
new file mode 100644
index 00000000..16fd6fe4
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta
new file mode 100644
index 00000000..d701741c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 1
+guid: 159cb3726937c6c498fa49eb627b0d96
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so
new file mode 100644
index 00000000..75ad5843
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta
new file mode 100644
index 00000000..9606d428
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 1
+guid: 6f74d8321b529d948a7672da4ca54356
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so
new file mode 100644
index 00000000..d76d968c
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta
new file mode 100644
index 00000000..fe3f6394
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 1
+guid: e4d6c68823f34e440bfe4e4ecba4c113
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so
new file mode 100644
index 00000000..58b7e964
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta
new file mode 100644
index 00000000..2aeaca18
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 1
+guid: 85af50ee41bfd9c4fbd8107aee814c50
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so
new file mode 100644
index 00000000..7dd19af6
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so.meta
new file mode 100644
index 00000000..7f2ce707
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libresonanceaudio.so.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 2bd9aca31d63ca248bf159e7562a3609
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a.meta
new file mode 100644
index 00000000..b1124ede
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 49cc70c20e469a541a7974182c9f588a
+folderAsset: yes
+timeCreated: 1447698325
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so
new file mode 100644
index 00000000..091859c0
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta
new file mode 100644
index 00000000..a5d9796d
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: f71c8f89be7646142baed6d482d5e89c
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so
new file mode 100644
index 00000000..57262b31
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta
new file mode 100644
index 00000000..e65ac8cb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 0e95029f987dfa248934eaa63745b504
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so
new file mode 100644
index 00000000..cfa6dcd9
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta
new file mode 100644
index 00000000..32a556f8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: cf01ad74bd6e5df46996c61b81ba590c
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so
new file mode 100644
index 00000000..c0e2042b
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta
new file mode 100644
index 00000000..dc7579cb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 8de47c7524234f64fb6a7d661154b1a3
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so
new file mode 100644
index 00000000..162d4391
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so.meta
new file mode 100644
index 00000000..1a47aaab
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libresonanceaudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: fb0aabfc61c4c1548ac6990286c84327
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar b/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar
new file mode 100644
index 00000000..76d5b46f
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar.meta b/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar.meta
new file mode 100644
index 00000000..19efd70c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/fmod.jar.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: cba124c31f7e10640bc2ff9464f8ac15
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86.meta
new file mode 100644
index 00000000..c925ac6b
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 95bcdcdca315ef640bec049de80ee3eb
+folderAsset: yes
+timeCreated: 1447698325
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so
new file mode 100644
index 00000000..2b7b8c11
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta
new file mode 100644
index 00000000..01a0984d
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 099e80baee62d0c439475fae45e69f4e
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so
new file mode 100644
index 00000000..a0078515
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta
new file mode 100644
index 00000000..b99f6cc0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 54236e4c5b88f494598efb4d226b44f0
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so
new file mode 100644
index 00000000..60c8233d
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta
new file mode 100644
index 00000000..6845b419
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: a20d361b085100b4997c4e5b0b83af31
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so
new file mode 100644
index 00000000..473b65f8
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta
new file mode 100644
index 00000000..1df26b1e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 0975b093811db4e4e9e67bc483ad2299
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so b/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so
new file mode 100644
index 00000000..f85f8fa2
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so.meta
new file mode 100644
index 00000000..275946e8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libresonanceaudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 5c35d7fa6769b114aa63172aaf1fd782
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64.meta
new file mode 100644
index 00000000..862ec7d9
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f5986fa1e569b7246ae8249e5d8de1c0
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so
new file mode 100644
index 00000000..8f26abb0
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta
new file mode 100644
index 00000000..bb9b46ec
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 7b1a5b0e7617bcf49885fb2dd09d7085
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so
new file mode 100644
index 00000000..9c13e0cd
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta
new file mode 100644
index 00000000..96e79ffd
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 51dea0d403c47f345a6efe70b23fe6e3
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so
new file mode 100644
index 00000000..227ccbec
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta
new file mode 100644
index 00000000..959af8cb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 8c078c4748d95c2489bb3b82aa144194
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so
new file mode 100644
index 00000000..7a1c481d
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta
new file mode 100644
index 00000000..0ae12cc8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 9a5fc9953c8c261488bf0cb6c202e04b
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so
new file mode 100644
index 00000000..d4f95bc1
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so.meta
new file mode 100644
index 00000000..fa3c00d6
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libresonanceaudio.so.meta
@@ -0,0 +1,23 @@
+fileFormatVersion: 2
+guid: 295b4c80a560c81409d44c273128b743
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/src.meta b/Assets/Plugins/FMOD/platforms/android/src.meta
new file mode 100644
index 00000000..c06295cb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 03be3f097a522854dbe1d585023925fb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs b/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs
new file mode 100644
index 00000000..edbf9789
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs
@@ -0,0 +1,127 @@
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_ANDROID && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "fmod" + dllSuffix;
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "fmodstudio" + dllSuffix;
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformAndroid : Platform
+ {
+ static PlatformAndroid()
+ {
+ Settings.AddPlatformTemplate("2fea114e74ecf3c4f920e1d5cc1c4c40");
+ }
+
+ internal override string DisplayName { get { return "Android"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.Android, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.Android;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.Android; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("android", "Plugins/Android/libs");
+ }
+
+ private static readonly string[] Architectures = { "arm64-v8a", "armeabi-v7a", "x86", "x86_64" };
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ yield return new FileRecord("fmod.jar")
+ .WithAbsoluteVersion(FileLayout.Release_1_10, "Plugins/Android/fmod.jar");
+
+ foreach (string architecture in Architectures)
+ {
+ yield return new FileRecord(string.Format("{0}/libfmod{1}.so", architecture, suffix));
+ yield return new FileRecord(string.Format("{0}/libfmodstudio{1}.so", architecture, suffix));
+ }
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ foreach (string architecture in Architectures)
+ {
+ yield return new FileRecord(string.Format("{0}/libgvraudio.so", architecture));
+ yield return new FileRecord(string.Format("{0}/libresonanceaudio.so", architecture));
+ }
+ }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ // Unity parses --additional-cpp arguments specified via
+ // PlayerSettings.SetAdditionalIl2CppArgs() incorrectly when the Android
+ // Export Project option is set.
+ return false;
+ }
+#endif
+
+ internal override string GetBankFolder()
+ {
+ return StaticGetBankFolder();
+ }
+
+ internal static string StaticGetBankFolder()
+ {
+ return (Settings.Instance.AndroidUseOBB || Settings.Instance.AndroidPatchBuild)
+ ? Application.streamingAssetsPath : "file:///android_asset";
+ }
+
+ internal override string GetPluginPath(string pluginName)
+ {
+ return StaticGetPluginPath(pluginName);
+ }
+
+ internal static string StaticGetPluginPath(string pluginName)
+ {
+ return string.Format("lib{0}.so", pluginName);
+ }
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Java Audio Track", outputType = FMOD.OUTPUTTYPE.AUDIOTRACK },
+ new OutputType() { displayName = "OpenSL ES", outputType = FMOD.OUTPUTTYPE.OPENSL },
+ new OutputType() { displayName = "AAudio", outputType = FMOD.OUTPUTTYPE.AAUDIO },
+ };
+
+ internal override int CoreCount { get { return MaximumCoreCount; } }
+#endif
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs.meta b/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs.meta
new file mode 100644
index 00000000..ea893098
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/android/src/PlatformAndroid.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 97ba6cc2660c0ca498540d254701057a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5.meta b/Assets/Plugins/FMOD/platforms/html5.meta
new file mode 100644
index 00000000..82517eb7
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2e8b0cce3730fcf4e996e9cd562a9858
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib.meta b/Assets/Plugins/FMOD/platforms/html5/lib.meta
new file mode 100644
index 00000000..7e944c8a
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b177b3448f6e68e4b9f8c04bee3914aa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19.meta b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19.meta
new file mode 100644
index 00000000..8c7ea11e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 54847690d6c23734ca89652cb5ad8efb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a
new file mode 100644
index 00000000..7877081a
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a.meta
new file mode 100644
index 00000000..5187cc79
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudio.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 18569240b868e8b44a20d32b2df12f5c
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a
new file mode 100644
index 00000000..7388dc7d
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a.meta
new file mode 100644
index 00000000..0f5921f3
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/2.0.19/libfmodstudioL.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 072de5b62d53c944fa2bae4cc3cd1754
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39.meta
new file mode 100644
index 00000000..19a5b914
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7959e64b0c3130b46bf491f58fdfd6c7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a
new file mode 100644
index 00000000..376397cd
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a.meta
new file mode 100644
index 00000000..44f4f362
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudio.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: c74d44e6ba102764fb85c6dc1e6d4168
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a
new file mode 100644
index 00000000..81cf58d5
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a.meta
new file mode 100644
index 00000000..da7e3108
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.39/libfmodstudioL.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: aa0ee2b898faebd44b3b1def99fb7ab4
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8.meta
new file mode 100644
index 00000000..47e55fdb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 76b6a358cc688fb4eb30cf7da58ae388
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a
new file mode 100644
index 00000000..066e198d
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a.meta
new file mode 100644
index 00000000..a7abc354
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudio.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: e52d91a08688cb04695051b8a87a82bd
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a
new file mode 100644
index 00000000..4c2be878
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a.meta b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a.meta
new file mode 100644
index 00000000..6f6fc7f1
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/lib/3.1.8/libfmodstudioL.a.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 8ba5025cbb9d0bf499e12351728e7679
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ WebGL: WebGL
+ second:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/src.meta b/Assets/Plugins/FMOD/platforms/html5/src.meta
new file mode 100644
index 00000000..934cfff3
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 21a9406360b210946b0f52e8bf5ca333
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs b/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs
new file mode 100644
index 00000000..01a0ca38
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs
@@ -0,0 +1,107 @@
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_WEBGL && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformWebGL : Platform
+ {
+ static PlatformWebGL()
+ {
+ Settings.AddPlatformTemplate("46fbfdf3fc43db0458918377fd40293e");
+ }
+
+ internal override string DisplayName { get { return "WebGL"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.WebGLPlayer, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.WebGL;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.WebGL; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("html5", "Plugins/WebGL");
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ bool emVer_2_0_19 = false;
+ bool emVer_3_1_8 = false;
+ bool emVer_3_1_39 = false;
+
+#if UNITY_6000_0_OR_NEWER
+ emVer_3_1_39 = true;
+#elif UNITY_2022_3_OR_NEWER
+ emVer_3_1_8 = true;
+#else
+ emVer_2_0_19 = true;
+#endif
+
+ if (allVariants || emVer_3_1_39)
+ {
+ yield return new FileRecord(string.Format("3.1.39/libfmodstudio{0}.a", suffix));
+ }
+
+ if (allVariants || emVer_3_1_8)
+ {
+ yield return new FileRecord(string.Format("3.1.8/libfmodstudio{0}.a", suffix));
+ }
+
+ if (allVariants || emVer_2_0_19)
+ {
+ yield return new FileRecord(string.Format("2.0.19/libfmodstudio{0}.a", suffix));
+ }
+ }
+
+ internal override bool IsFMODStaticallyLinked { get { return true; } }
+#endif
+
+ internal override string GetPluginPath(string pluginName)
+ {
+ return string.Format("{0}/{1}.a", GetPluginBasePath(), pluginName);
+ }
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "JavaScript webaudio output", outputType = FMOD.OUTPUTTYPE.WEBAUDIO },
+ };
+#endif
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs.meta b/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs.meta
new file mode 100644
index 00000000..ff186e1e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/html5/src/PlatformWebGL.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b87314b32fbe18943af496e4b47136c6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios.meta b/Assets/Plugins/FMOD/platforms/ios.meta
new file mode 100644
index 00000000..db1a7b92
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 56ef07f8e7caf5f4589a020791b532cd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib.meta b/Assets/Plugins/FMOD/platforms/ios/lib.meta
new file mode 100644
index 00000000..957cdc9c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bf8c331b8ccdb944fa925884d9ffa69c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a
new file mode 100644
index 00000000..3b829a33
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a.meta
new file mode 100644
index 00000000..3873ef3e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounityplugin.a.meta
@@ -0,0 +1,21 @@
+fileFormatVersion: 2
+guid: 79c89db1833831740aee981c0d90d2d4
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ iOS:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a
new file mode 100644
index 00000000..296bf3d1
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a.meta
new file mode 100644
index 00000000..1b101428
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginL.a.meta
@@ -0,0 +1,21 @@
+fileFormatVersion: 2
+guid: 5aa4057a8deee1c45a69677125e2c241
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ iOS:
+ enabled: 0
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a
new file mode 100644
index 00000000..3d88b3e0
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a.meta
new file mode 100644
index 00000000..8f575c77
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulator.a.meta
@@ -0,0 +1,113 @@
+fileFormatVersion: 2
+guid: 26235204f425d41479c8e41c99e96f50
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a
new file mode 100644
index 00000000..70e093c4
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a.meta
new file mode 100644
index 00000000..5ecf6863
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libfmodstudiounitypluginsimulatorL.a.meta
@@ -0,0 +1,113 @@
+fileFormatVersion: 2
+guid: 9aed261b7fbc24099a9b58cbbf374583
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a
new file mode 100644
index 00000000..38065526
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a.meta
new file mode 100644
index 00000000..f5899986
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudio.a.meta
@@ -0,0 +1,61 @@
+fileFormatVersion: 2
+guid: bc5d15d8f7607af478126b815040cbd2
+timeCreated: 1511469552
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a
new file mode 100644
index 00000000..7573706e
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a.meta b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a.meta
new file mode 100644
index 00000000..ec712019
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/lib/libresonanceaudiosimulator.a.meta
@@ -0,0 +1,113 @@
+fileFormatVersion: 2
+guid: 5ad1791b3b48a4ba39c30a2b4f438486
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/src.meta b/Assets/Plugins/FMOD/platforms/ios/src.meta
new file mode 100644
index 00000000..7dd91fde
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eb7a0bd9281687744b74c40dd220a50f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs b/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs
new file mode 100644
index 00000000..11b837da
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs
@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_IPHONE && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformIOS : Platform
+ {
+ static PlatformIOS()
+ {
+ Settings.AddPlatformTemplate("0f8eb3f400726694eb47beb1a9f94ce8");
+ }
+
+ internal override string DisplayName { get { return "iOS"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.IPhonePlayer, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.iOS;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.iOS; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("ios", "Plugins/iOS");
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ if (allVariants || PlayerSettings.iOS.sdkVersion == iOSSdkVersion.DeviceSDK)
+ {
+ yield return new FileRecord(string.Format("libfmodstudiounityplugin{0}.a", suffix));
+ }
+
+ if (allVariants || PlayerSettings.iOS.sdkVersion == iOSSdkVersion.SimulatorSDK)
+ {
+ yield return new FileRecord(string.Format("libfmodstudiounitypluginsimulator{0}.a", suffix));
+ }
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ if (allVariants || PlayerSettings.iOS.sdkVersion == iOSSdkVersion.DeviceSDK)
+ {
+ yield return new FileRecord("libgvraudio.a");
+ yield return new FileRecord("libresonanceaudio.a");
+ }
+
+ if (allVariants || PlayerSettings.iOS.sdkVersion == iOSSdkVersion.SimulatorSDK)
+ {
+ yield return new FileRecord("libresonanceaudiosimulator.a");
+ }
+ }
+
+ internal override bool IsFMODStaticallyLinked { get { return true; } }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ return StaticSupportsAdditionalCpp();
+ }
+
+ public static bool StaticSupportsAdditionalCpp()
+ {
+ return false;
+ }
+#endif
+
+ internal override void LoadPlugins(FMOD.System coreSystem, Action reportResult)
+ {
+ StaticLoadPlugins(this, coreSystem, reportResult);
+ }
+
+ public static void StaticLoadPlugins(Platform platform, FMOD.System coreSystem,
+ Action reportResult)
+ {
+ platform.LoadStaticPlugins(coreSystem, reportResult);
+
+ }
+
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Core Audio", outputType = FMOD.OUTPUTTYPE.COREAUDIO },
+ };
+#endif
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs.meta b/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs.meta
new file mode 100644
index 00000000..41fa2dfe
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/ios/src/PlatformIOS.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bc1f51bc35d549941904cf062bae93a3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux.meta b/Assets/Plugins/FMOD/platforms/linux.meta
new file mode 100644
index 00000000..1d182ec9
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 127a9ee57a2a27a439bf9e6b2d5731b6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib.meta b/Assets/Plugins/FMOD/platforms/linux/lib.meta
new file mode 100644
index 00000000..6da4e802
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b28687fd18577ce4c838b916a4ed5c54
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64.meta b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64.meta
new file mode 100644
index 00000000..265b71a8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f99f1bb123ca3b6449fc49fc745c0fed
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so
new file mode 100644
index 00000000..341ee95c
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so.meta
new file mode 100644
index 00000000..67f8f9a2
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudio.so.meta
@@ -0,0 +1,65 @@
+fileFormatVersion: 2
+guid: 9063aa11b1fcfcf4cb6030a076d14a30
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ SamsungTV:
+ enabled: 0
+ settings:
+ STV_MODEL: STANDARD_15
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so
new file mode 100644
index 00000000..c776017e
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so differ
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so.meta
new file mode 100644
index 00000000..d5e20a9e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libfmodstudioL.so.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 8fddc6064073f794ca855a1e70613a66
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OS: Linux
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so
new file mode 100644
index 00000000..1724bd33
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so differ
diff --git a/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so.meta b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so.meta
new file mode 100644
index 00000000..6f3803ca
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/lib/x86_64/libresonanceaudio.so.meta
@@ -0,0 +1,69 @@
+fileFormatVersion: 2
+guid: bca6f630c310b4945b52486d2ed1da0a
+timeCreated: 1511469552
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ Any:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Linux
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ SamsungTV:
+ enabled: 0
+ settings:
+ STV_MODEL: STANDARD_15
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
\ No newline at end of file
diff --git a/Assets/Plugins/FMOD/platforms/linux/src.meta b/Assets/Plugins/FMOD/platforms/linux/src.meta
new file mode 100644
index 00000000..2625b93c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fb8b6c816014ed44ebc2db5f8dc5e03e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs b/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs
new file mode 100644
index 00000000..7438767a
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs
@@ -0,0 +1,110 @@
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_STANDALONE_LINUX && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "fmodstudio" + dllSuffix;
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "fmodstudio" + dllSuffix;
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformLinux : Platform
+ {
+ static PlatformLinux()
+ {
+ Settings.AddPlatformTemplate("b7716510a1f36934c87976f3a81dbf3d");
+ }
+
+ internal override string DisplayName { get { return "Linux"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.LinuxPlayer, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.StandaloneLinux64;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.Linux; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("linux", "Plugins");
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ yield return new FileRecord(string.Format("x86_64/libfmodstudio{0}.so", suffix));
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ if (allVariants)
+ {
+ yield return new FileRecord("x86_64/libfmod.so");
+ yield return new FileRecord("x86_64/libfmodL.so");
+ }
+
+ yield return new FileRecord("x86_64/libgvraudio.so");
+ yield return new FileRecord("x86_64/libresonanceaudio.so");
+ }
+
+ protected override IEnumerable GetObsoleteFiles()
+ {
+ yield return "lib/linux/x86/libfmodstudio.so";
+ yield return "platforms/linux/lib/x86/libfmodstudio.so";
+ yield return "lib/linux/x86/libfmodstudioL.so";
+ yield return "platforms/linux/lib/x86/libfmodstudioL.so";
+ }
+#endif
+
+ internal override string GetPluginPath(string pluginName)
+ {
+ return string.Format("{0}/lib{1}.so", GetPluginBasePath(), pluginName);
+ }
+
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Pulse Audio", outputType = FMOD.OUTPUTTYPE.PULSEAUDIO },
+ new OutputType() { displayName = "Advanced Linux Sound Architecture", outputType = FMOD.OUTPUTTYPE.ALSA },
+ };
+#endif
+
+ internal override List DefaultCodecChannels { get { return staticCodecChannels; } }
+
+ private static List staticCodecChannels = new List()
+ {
+ new CodecChannelCount { format = CodecType.FADPCM, channels = 0 },
+ new CodecChannelCount { format = CodecType.Vorbis, channels = 32 },
+ };
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs.meta b/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs.meta
new file mode 100644
index 00000000..f9b88e1e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/linux/src/PlatformLinux.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 73549a74f689f0849a8271d9e908c514
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac.meta b/Assets/Plugins/FMOD/platforms/mac.meta
new file mode 100644
index 00000000..3bf1fba1
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5dd2bfa8b9eb6874b9e50b79490891a7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib.meta b/Assets/Plugins/FMOD/platforms/mac/lib.meta
new file mode 100644
index 00000000..d4b4fb8d
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 98f2ca7007fe2074d953e949a6fdf971
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle.meta
new file mode 100644
index 00000000..5ab94eb0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle.meta
@@ -0,0 +1,68 @@
+fileFormatVersion: 2
+guid: 4f94b6752a0d5ad489274786cbfbc6e5
+folderAsset: yes
+timeCreated: 1442816865
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: OSX
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ SamsungTV:
+ enabled: 0
+ settings:
+ STV_MODEL: STANDARD_13
+ Win:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents.meta
new file mode 100644
index 00000000..22a63533
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 2879b055c8551c44caa264ce7208ea17
+folderAsset: yes
+timeCreated: 1432606678
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist
new file mode 100644
index 00000000..98befae9
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ BuildMachineOSBuild
+ 17G4015
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ fmodstudio
+ CFBundleIdentifier
+ com.fmod.fmodstudio
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ BNDL
+ CFBundleSignature
+ ????
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0
+ CSResourcesFileMapped
+ no
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 10.7
+ NSHighResolutionCapable
+
+ NSSupportsAutomaticGraphicsSwitching
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist.meta
new file mode 100644
index 00000000..8434f925
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/Info.plist.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fdf09afde87e8e440a6e331d1850add6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS.meta
new file mode 100644
index 00000000..c0faa7ba
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 4c7ef954631945d4981884adcc603e81
+folderAsset: yes
+timeCreated: 1432606678
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio
new file mode 100644
index 00000000..ef5cd5fb
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio differ
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio.meta
new file mode 100644
index 00000000..c9f7db92
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/MacOS/fmodstudio.meta
@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: c5e926e235023354fb6b94bc154a8d2c
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature.meta
new file mode 100644
index 00000000..b0d36f87
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0731b3df0eb593f4ebe376b7a4fe7b96
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources
new file mode 100644
index 00000000..d5d0fd74
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources
@@ -0,0 +1,115 @@
+
+
+
+
+ files
+
+ files2
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/
+
+ nested
+
+ weight
+ 10
+
+ ^.*
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^Resources/
+
+ weight
+ 20
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^[^/]+$
+
+ nested
+
+ weight
+ 10
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources.meta
new file mode 100644
index 00000000..ecde5de3
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudio.bundle/Contents/_CodeSignature/CodeResources.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a7e866ce49bf582479f3675646324389
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle.meta
new file mode 100644
index 00000000..84b5498e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: fecc2c28e945bbb4da3aca8a2f07dfb0
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OS: OSX
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents.meta
new file mode 100644
index 00000000..b93a3b44
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 99d82b6758d211244a26db33da5df6ae
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist
new file mode 100644
index 00000000..2760ee7f
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ BuildMachineOSBuild
+ 17G4015
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ fmodstudioL
+ CFBundleIdentifier
+ com.fmod.fmodstudioL
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ BNDL
+ CFBundleSignature
+ ????
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0
+ CSResourcesFileMapped
+ no
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 10.7
+ NSHighResolutionCapable
+
+ NSSupportsAutomaticGraphicsSwitching
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist.meta
new file mode 100644
index 00000000..a59b05ce
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/Info.plist.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 28bc99f6ddbcf4149a24dfd29409a5cc
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS.meta
new file mode 100644
index 00000000..9946415d
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5bcb432be37dff04297a06a32bdaf5a8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL
new file mode 100644
index 00000000..3b3a2ed9
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL differ
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL.meta
new file mode 100644
index 00000000..71c84f61
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/MacOS/fmodstudioL.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a298d76594bb27a4b839b827b7ccc56b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature.meta
new file mode 100644
index 00000000..affd343e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7d1a5963d0d6bca41983f249e84c6d82
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources
new file mode 100644
index 00000000..d5d0fd74
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources
@@ -0,0 +1,115 @@
+
+
+
+
+ files
+
+ files2
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/
+
+ nested
+
+ weight
+ 10
+
+ ^.*
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^Resources/
+
+ weight
+ 20
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^[^/]+$
+
+ nested
+
+ weight
+ 10
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources.meta b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources.meta
new file mode 100644
index 00000000..a01fc2e6
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/fmodstudioL.bundle/Contents/_CodeSignature/CodeResources.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6f4387888d43e8e459737087caf63eeb
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle.meta
new file mode 100644
index 00000000..2a46a150
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle.meta
@@ -0,0 +1,59 @@
+fileFormatVersion: 2
+guid: 04e20ff877bea8747ae257229c720dcc
+folderAsset: yes
+timeCreated: 1511469544
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents.meta
new file mode 100644
index 00000000..e8297a79
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a5e43a852000e2443a14695f63ceffd7
+folderAsset: yes
+timeCreated: 1511469545
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist
new file mode 100644
index 00000000..95ee74ac
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ BuildMachineOSBuild
+ 17G4015
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ resonanceaudio
+ CFBundleIdentifier
+ com.fmod.resonanceaudio
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ BNDL
+ CFBundleSignature
+ ????
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0
+ CSResourcesFileMapped
+ no
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 10.7
+ NSHighResolutionCapable
+
+ NSSupportsAutomaticGraphicsSwitching
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist.meta
new file mode 100644
index 00000000..b2bd0fa5
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/Info.plist.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ea043299abb5407419ae750dbbee6564
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS.meta
new file mode 100644
index 00000000..70f53e65
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 242a6e2e6d91dcf45a7ef7bdd7bfe227
+folderAsset: yes
+timeCreated: 1511469545
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio
new file mode 100644
index 00000000..43243e0e
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio differ
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio.meta
new file mode 100644
index 00000000..bdd97486
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/MacOS/resonanceaudio.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2e2968e9faea7be4ea2b24d5bd144749
+timeCreated: 1511469545
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature.meta
new file mode 100644
index 00000000..b5fc209e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5ff1efee5fe0cee4d969f44cbce4294f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources
new file mode 100644
index 00000000..d5d0fd74
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources
@@ -0,0 +1,115 @@
+
+
+
+
+ files
+
+ files2
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/
+
+ nested
+
+ weight
+ 10
+
+ ^.*
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^Resources/
+
+ weight
+ 20
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^[^/]+$
+
+ nested
+
+ weight
+ 10
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources.meta b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources.meta
new file mode 100644
index 00000000..78599bd1
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/lib/resonanceaudio.bundle/Contents/_CodeSignature/CodeResources.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e84a173ce5cfbbe4b8d3cf667e97df31
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/src.meta b/Assets/Plugins/FMOD/platforms/mac/src.meta
new file mode 100644
index 00000000..d51d5c9a
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 29af24c23c3906b44bbaeaa0c832f235
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs b/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs
new file mode 100644
index 00000000..66802d8b
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs
@@ -0,0 +1,108 @@
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_STANDALONE_OSX && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "fmodstudio" + dllSuffix;
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "fmodstudio" + dllSuffix;
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformMac : Platform
+ {
+ static PlatformMac()
+ {
+ Settings.AddPlatformTemplate("52eb9df5db46521439908db3a29a1bbb");
+ }
+
+ internal override string DisplayName { get { return "macOS"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.OSXPlayer, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.StandaloneOSX;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.Mac; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("mac", "Plugins");
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ yield return new FileRecord(string.Format("fmodstudio{0}.bundle", suffix));
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ yield return new FileRecord("gvraudio.bundle");
+ yield return new FileRecord("resonanceaudio.bundle");
+ }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ return false;
+ }
+#endif
+
+ internal override string GetPluginPath(string pluginName)
+ {
+ string pluginPath = string.Format("{0}/{1}.bundle", GetPluginBasePath(), pluginName);
+ if (System.IO.Directory.Exists((pluginPath)))
+ {
+ return pluginPath;
+ }
+ else
+ {
+ return string.Format("{0}/{1}.dylib", GetPluginBasePath(), pluginName);
+ }
+ }
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Core Audio", outputType = FMOD.OUTPUTTYPE.COREAUDIO },
+ };
+#endif
+
+ internal override List DefaultCodecChannels { get { return staticCodecChannels; } }
+
+ private static List staticCodecChannels = new List()
+ {
+ new CodecChannelCount { format = CodecType.FADPCM, channels = 0 },
+ new CodecChannelCount { format = CodecType.Vorbis, channels = 32 },
+ };
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs.meta b/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs.meta
new file mode 100644
index 00000000..68dbe885
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/mac/src/PlatformMac.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d92d0baf34dae0e4ea032a42bd6107c0
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos.meta b/Assets/Plugins/FMOD/platforms/tvos.meta
new file mode 100644
index 00000000..7ddd670d
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b878fb13ea2d16a40b79b4400b5149ba
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib.meta b/Assets/Plugins/FMOD/platforms/tvos/lib.meta
new file mode 100644
index 00000000..c767ae4f
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3ba8f748d2f09ff46a33e76a54eb551f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a
new file mode 100644
index 00000000..06f8ef3f
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a differ
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a.meta b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a.meta
new file mode 100644
index 00000000..856dcf38
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounityplugin.a.meta
@@ -0,0 +1,18 @@
+fileFormatVersion: 2
+guid: 4abc247d0f34143ec95396c7b6bec6a8
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ tvOS:
+ enabled: 1
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a
new file mode 100644
index 00000000..d6b405ac
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a.meta b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a.meta
new file mode 100644
index 00000000..ba7ba805
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginL.a.meta
@@ -0,0 +1,20 @@
+fileFormatVersion: 2
+guid: 982978af662f9ea43b7979c7f61bbad3
+timeCreated: 1507179416
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a
new file mode 100644
index 00000000..37f95cec
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a.meta b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a.meta
new file mode 100644
index 00000000..c38a112c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulator.a.meta
@@ -0,0 +1,113 @@
+fileFormatVersion: 2
+guid: 86d28a38815714041bf19dc4cc59ce65
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a
new file mode 100644
index 00000000..8922721b
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a differ
diff --git a/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a.meta b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a.meta
new file mode 100644
index 00000000..af33c6b1
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/lib/libfmodstudiounitypluginsimulatorL.a.meta
@@ -0,0 +1,113 @@
+fileFormatVersion: 2
+guid: 649598f6abf894e128aa33102756da99
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/src.meta b/Assets/Plugins/FMOD/platforms/tvos/src.meta
new file mode 100644
index 00000000..88418f41
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a36cddbc75870b64e98ebaac7424553e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs b/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs
new file mode 100644
index 00000000..71a25a8b
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_TVOS && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformAppleTV : Platform
+ {
+ static PlatformAppleTV()
+ {
+ Settings.AddPlatformTemplate("e7a046c753c3c3d4aacc91f6597f310d");
+ }
+
+ internal override string DisplayName { get { return "Apple TV"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.tvOS, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.tvOS;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.AppleTV; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("tvos", "Plugins/tvOS");
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ if (allVariants || PlayerSettings.tvOS.sdkVersion == tvOSSdkVersion.Device)
+ {
+ yield return new FileRecord(string.Format("libfmodstudiounityplugin{0}.a", suffix));
+ }
+
+ if (allVariants || PlayerSettings.tvOS.sdkVersion == tvOSSdkVersion.Simulator)
+ {
+ yield return new FileRecord(string.Format("libfmodstudiounitypluginsimulator{0}.a", suffix));
+ }
+ }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ return PlatformIOS.StaticSupportsAdditionalCpp();
+ }
+#endif
+
+#if !UNITY_EDITOR
+ internal override void LoadPlugins(FMOD.System coreSystem, Action reportResult)
+ {
+ PlatformIOS.StaticLoadPlugins(this, coreSystem, reportResult);
+ }
+#endif
+
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Core Audio", outputType = FMOD.OUTPUTTYPE.COREAUDIO },
+ };
+#endif
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs.meta b/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs.meta
new file mode 100644
index 00000000..a49dadf8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/tvos/src/PlatformAppleTV.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 17eea195bdfbf014e91ba7620ee491f8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp.meta b/Assets/Plugins/FMOD/platforms/uwp.meta
new file mode 100644
index 00000000..797ac196
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 76cc08b21e1f3d04e9cc8fdf3cef9eda
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib.meta b/Assets/Plugins/FMOD/platforms/uwp/lib.meta
new file mode 100644
index 00000000..cfc2439e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: faacb4351a5f83845b1cea9370b4d244
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/arm.meta
new file mode 100644
index 00000000..7e0ebdbe
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 0cddbb9418c24f44d87fc49581769340
+folderAsset: yes
+timeCreated: 1457408139
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll
new file mode 100644
index 00000000..31640290
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:631b4bf9ee5bdc873983e1bb6c535c8035d8769ec9be0847f14ba1bc3ea62848
+size 1125888
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll.meta
new file mode 100644
index 00000000..1d7a3dbe
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmod.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 907f4331811d73442b58d50627a775d4
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll
new file mode 100644
index 00000000..9470d5ad
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6afed3986a3d0e5b77379754e53c635891fac73cf903950b71d43374b83bb18d
+size 1321984
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll.meta
new file mode 100644
index 00000000..3c490d84
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 82bacb4b0f3cc85418d2a1aa2ca57df6
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll
new file mode 100644
index 00000000..92d9c147
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58e0c6ed6cc8e2a13603b719dbcb7560c08e5a0c0368edeab3fdeb23062a27d7
+size 728576
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll.meta
new file mode 100644
index 00000000..0a1de25e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudio.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: a7c1eb40b6cc0b8468c161b5ba9a6df6
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll
new file mode 100644
index 00000000..72aff853
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e530bfd3fa2b97d9ce0b3222ccbe253661601140102364a9501d08e2f2043dca
+size 1276928
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll.meta
new file mode 100644
index 00000000..af4f20b1
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/arm/fmodstudioL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 5476dd86ee3260f4bb2283aef1d9a883
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: ARM
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x64.meta
new file mode 100644
index 00000000..3a6641e0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 81189b2e21a815647a28e3437c86beb2
+folderAsset: yes
+timeCreated: 1457064777
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll
new file mode 100644
index 00000000..467432cb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dfc69054c04588f93b2ae2df1f57d9cb7dc2757d282dd8ade2c73143e5e9772b
+size 1631232
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll.meta
new file mode 100644
index 00000000..0822901f
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmod.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 68f9a982a926833498d438319388a455
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll
new file mode 100644
index 00000000..176247f9
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4aaf7070c56383f24ee3a8736b63a33ae6a039e0b93baccc28c15665d9305686
+size 1853440
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll.meta
new file mode 100644
index 00000000..233512d3
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: d15f9d3e1089b114a8f625e994fea839
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll
new file mode 100644
index 00000000..a7077f45
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b94d5d164cf7ddccfbd1a7107c081fb42e3ce5cb6acdfce9cc8f184fba6d6c0c
+size 1063424
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll.meta
new file mode 100644
index 00000000..3412da57
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudio.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 29800d7cce1a5fc46ae163c8a68d8346
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll
new file mode 100644
index 00000000..1e3daa1f
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8801c4225d9f901b2de14d1b7f08519a73341d25957642f54eaca1ff93a3b777
+size 1658368
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll.meta
new file mode 100644
index 00000000..0bbdb23c
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x64/fmodstudioL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 813ca429588de5d40b5c8a184a15bcd9
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X64
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x86.meta
new file mode 100644
index 00000000..d4dbed4a
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fa5c1a42d40246b4a83af1e8192b6bdf
+folderAsset: yes
+timeCreated: 1457063023
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll
new file mode 100644
index 00000000..95bbaf03
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efbce53bf6b4d503e81ead528d2245a91977f8a9971cbdc0e4ecfea0cfdbb46b
+size 1379840
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll.meta
new file mode 100644
index 00000000..38df19ed
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmod.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 39f9a761a2a032045a853a069db31081
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll
new file mode 100644
index 00000000..f4e7835a
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e76dfa5cd0a3f451c8f54af0810d6fb739c871aefcf32ce7ad63dd8e554d267
+size 1573376
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll.meta
new file mode 100644
index 00000000..9dfb7500
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 243e8fba07980f74b8d49ef345dadd64
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll
new file mode 100644
index 00000000..222f2596
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe1688113ae497cf314cd40bef1a9245ee89bc84a1043ec68780af1fae6569f3
+size 838656
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll.meta
new file mode 100644
index 00000000..74c73fce
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudio.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: ecb0cc0019197154b9baeef623b6ec0a
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll
new file mode 100644
index 00000000..ce24c480
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e99027af492819318f5a09a5ed9830e7c5adc41a6062dd4abf65c11d5bcb814
+size 1338880
diff --git a/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll.meta b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll.meta
new file mode 100644
index 00000000..05692027
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/uwp/lib/x86/fmodstudioL.dll.meta
@@ -0,0 +1,58 @@
+fileFormatVersion: 2
+guid: 43ab9a198caf2d841b813eb81e02486d
+timeCreated: 1457408139
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 1
+ settings:
+ CPU: X86
+ DontProcess: False
+ PlaceholderPath:
+ SDK: UWP
+ ScriptingBackend: AnyScriptingBackend
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos.meta b/Assets/Plugins/FMOD/platforms/visionos.meta
new file mode 100644
index 00000000..5bffd1c0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c0af21c1e7f184d6f860c5bb39642057
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib.meta b/Assets/Plugins/FMOD/platforms/visionos/lib.meta
new file mode 100644
index 00000000..45f91802
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b847b610a434440b0854bdda3a8522fe
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a
new file mode 100644
index 00000000..09a60e77
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a.meta
new file mode 100644
index 00000000..b70ffcfa
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xros.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: 240b87501d4c14726b85b03230183106
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a
new file mode 100644
index 00000000..04767fee
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a.meta
new file mode 100644
index 00000000..c285a5e9
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudioL_xrsimulator.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: cc7984acfd746420c810ab83b89887c4
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a
new file mode 100644
index 00000000..be36bbe4
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a.meta
new file mode 100644
index 00000000..546c9888
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xros.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: b06ee804ac1c44c538ef636ef4e034c1
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a
new file mode 100644
index 00000000..23305f0c
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a.meta
new file mode 100644
index 00000000..620add38
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libfmodstudio_xrsimulator.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: da47e54c091124c7baa78e13f90216f3
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a
new file mode 100644
index 00000000..f9081de2
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a.meta
new file mode 100644
index 00000000..d53c9372
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xros.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: c56aac88d64894d01a74d1cf8f609da6
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a
new file mode 100644
index 00000000..504fba56
Binary files /dev/null and b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a differ
diff --git a/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a.meta b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a.meta
new file mode 100644
index 00000000..92f85c80
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/lib/libresonanceaudio_xrsimulator.a.meta
@@ -0,0 +1,73 @@
+fileFormatVersion: 2
+guid: ab84f09ed56d54cd3867c72395f7658c
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude VisionOS: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ VisionOS: VisionOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: ARM64
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/src.meta b/Assets/Plugins/FMOD/platforms/visionos/src.meta
new file mode 100644
index 00000000..0d0d5914
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dbc65c69ec16043268c63c40c92f8bf0
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs b/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs
new file mode 100644
index 00000000..84232ffe
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if UNITY_VISIONOS && !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+ public const string dll = "__Internal";
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformVisionOS : Platform
+ {
+ static PlatformVisionOS()
+ {
+ Settings.AddPlatformTemplate("de700ef3f37a49b58a57ae3addf01ad9");
+ }
+
+ internal override string DisplayName { get { return "visionOS"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ #if UNITY_VISIONOS
+ settings.DeclareRuntimePlatform(RuntimePlatform.VisionOS, this);
+ #endif
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ #if UNITY_VISIONOS
+ yield return BuildTarget.VisionOS;
+ #else
+ yield return BuildTarget.NoTarget;
+ #endif
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.None; } }
+
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ return new BinaryAssetFolderInfo("visionos", FileLayout.Release_2_2);
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ #if UNITY_VISIONOS
+ if (allVariants || PlayerSettings.VisionOS.sdkVersion == VisionOSSdkVersion.Device)
+ #endif
+ {
+ yield return new FileRecord(string.Format("libfmodstudio{0}_xros.a", suffix));
+ }
+
+ #if UNITY_VISIONOS
+ if (allVariants || PlayerSettings.VisionOS.sdkVersion == VisionOSSdkVersion.Simulator)
+ #endif
+ {
+ yield return new FileRecord(string.Format("libfmodstudio{0}_xrsimulator.a", suffix));
+ }
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ #if UNITY_VISIONOS
+ if (allVariants || PlayerSettings.VisionOS.sdkVersion == VisionOSSdkVersion.Device)
+ #endif
+ {
+ yield return new FileRecord("libresonanceaudio_xros.a");
+ }
+
+ #if UNITY_VISIONOS
+ if (allVariants || PlayerSettings.VisionOS.sdkVersion == VisionOSSdkVersion.Simulator)
+ #endif
+ {
+ yield return new FileRecord("libresonanceaudio_xrsimulator.a");
+ }
+ }
+
+ internal override bool IsFMODStaticallyLinked { get { return true; } }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ return PlatformIOS.StaticSupportsAdditionalCpp();
+ }
+#endif
+
+#if !UNITY_EDITOR
+ internal override void LoadPlugins(FMOD.System coreSystem, Action reportResult)
+ {
+ PlatformIOS.StaticLoadPlugins(this, coreSystem, reportResult);
+ }
+#endif
+
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Core Audio", outputType = FMOD.OUTPUTTYPE.COREAUDIO },
+ };
+#endif
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs.meta b/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs.meta
new file mode 100644
index 00000000..d4ad7e09
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/visionos/src/PlatformVisionOS.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8f591a193113347409efedcc618e83d6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win.meta b/Assets/Plugins/FMOD/platforms/win.meta
new file mode 100644
index 00000000..6414d985
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c66754bc90bcdd74dbacaa9bc9adf48b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib.meta b/Assets/Plugins/FMOD/platforms/win/lib.meta
new file mode 100644
index 00000000..c8a4d9d8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4ad89dfcd36045640a8e902f16b09363
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86.meta
new file mode 100644
index 00000000..e23ad280
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 03f590b69e4afe14fa1c73f89a98a203
+folderAsset: yes
+timeCreated: 1432606678
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll
new file mode 100644
index 00000000..8289086e
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:712e8a838c85d9c9e03f150350e324b4de9f3a64221920e505f1cc56a4fbf8d9
+size 2604544
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll.meta
new file mode 100644
index 00000000..a32046af
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudio.dll.meta
@@ -0,0 +1,78 @@
+fileFormatVersion: 2
+guid: 1550e5c882b8c2445a1f14f8b1b23d41
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Windows
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ SamsungTV:
+ enabled: 0
+ settings:
+ STV_MODEL: STANDARD_13
+ WP8:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ Win:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll
new file mode 100644
index 00000000..11fa6e01
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7197ff88772bde1a7da4aff5975746da1d88c3edba0ae2670db14d805452fd4a
+size 3500544
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll.meta
new file mode 100644
index 00000000..ba151b38
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/fmodstudioL.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 22b97e569d11c114dbd137714df592ed
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ OS: Windows
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll
new file mode 100644
index 00000000..29787e98
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6588e24d03237ee37e90cbcf8a8311daef3151b4db02d82ed9596ef4b11a84b
+size 694784
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll.meta
new file mode 100644
index 00000000..b3274db4
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86/resonanceaudio.dll.meta
@@ -0,0 +1,55 @@
+fileFormatVersion: 2
+guid: b2c11f1e03736f748bd861d7bf4f8952
+timeCreated: 1511469552
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Editor:
+ enabled: 0
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86_64.meta
new file mode 100644
index 00000000..d574d01b
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 8105cca2fc4eb2e488e010278c3ea1bf
+folderAsset: yes
+timeCreated: 1432606678
+licenseType: Free
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll
new file mode 100644
index 00000000..b4563cbe
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3274c2433c0650b70fe347597b84c0ce31e9ae9273dd5cb137b6286f008781f5
+size 3248128
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll.meta
new file mode 100644
index 00000000..2059acb8
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudio.dll.meta
@@ -0,0 +1,78 @@
+fileFormatVersion: 2
+guid: 684d4d47a018ed14080e15f4c99b8e86
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Windows
+ Linux:
+ enabled: 1
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ SamsungTV:
+ enabled: 0
+ settings:
+ STV_MODEL: STANDARD_13
+ WP8:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DontProcess: False
+ PlaceholderPath:
+ SDK: AnySDK
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll
new file mode 100644
index 00000000..0efa3fcf
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8ea60cf98b5fcd795d364ee2f2f47f22b8dcbfc559f61c070353ca7486fa2b5a
+size 4355072
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll.meta
new file mode 100644
index 00000000..9ffd67cc
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/fmodstudioL.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 8758fa26796b44b47b97b6e17ace8975
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OS: Windows
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll
new file mode 100644
index 00000000..bd6856cc
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1667e5336ae067ab1d9aa04e7bcca9789ff5573ed4c7f6fa9305404d0485f99
+size 816640
diff --git a/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll.meta b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll.meta
new file mode 100644
index 00000000..611e72f0
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/lib/x86_64/resonanceaudio.dll.meta
@@ -0,0 +1,50 @@
+fileFormatVersion: 2
+guid: 4c8fb9b92ea2eae4f9112a3941c4f128
+timeCreated: 1511469552
+licenseType: Free
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/src.meta b/Assets/Plugins/FMOD/platforms/win/src.meta
new file mode 100644
index 00000000..14b32ebb
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e3438d4d60981a7489133b13b11958ec
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs b/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs
new file mode 100644
index 00000000..1c5a1623
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs
@@ -0,0 +1,171 @@
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+#if !UNITY_EDITOR
+namespace FMOD
+{
+ public partial class VERSION
+ {
+#if UNITY_STANDALONE_WIN
+ public const string dll = "fmodstudio" + dllSuffix;
+#elif UNITY_WSA
+ public const string dll = "fmod" + dllSuffix;
+#endif
+ }
+}
+
+namespace FMOD.Studio
+{
+ public partial class STUDIO_VERSION
+ {
+#if UNITY_STANDALONE_WIN || UNITY_WSA
+ public const string dll = "fmodstudio" + dllSuffix;
+#endif
+ }
+}
+#endif
+
+namespace FMODUnity
+{
+#if UNITY_EDITOR
+ [InitializeOnLoad]
+#endif
+ public class PlatformWindows : Platform
+ {
+ static PlatformWindows()
+ {
+ Settings.AddPlatformTemplate("2c5177b11d81d824dbb064f9ac8527da");
+ }
+
+ internal override string DisplayName { get { return "Windows"; } }
+ internal override void DeclareRuntimePlatforms(Settings settings)
+ {
+ settings.DeclareRuntimePlatform(RuntimePlatform.WindowsPlayer, this);
+ settings.DeclareRuntimePlatform(RuntimePlatform.WSAPlayerX86, this);
+ settings.DeclareRuntimePlatform(RuntimePlatform.WSAPlayerX64, this);
+ settings.DeclareRuntimePlatform(RuntimePlatform.WSAPlayerARM, this);
+ }
+
+#if UNITY_EDITOR
+ internal override IEnumerable GetBuildTargets()
+ {
+ yield return BuildTarget.StandaloneWindows;
+ yield return BuildTarget.StandaloneWindows64;
+ yield return BuildTarget.WSAPlayer;
+ }
+
+ internal override Legacy.Platform LegacyIdentifier { get { return Legacy.Platform.Windows; } }
+#endif
+
+#if UNITY_WINRT_8_1 || UNITY_WSA_10_0
+ internal override string GetBankFolder()
+ {
+ return "ms-appx:///Data/StreamingAssets";
+ }
+#endif
+
+#if UNITY_EDITOR
+ protected override BinaryAssetFolderInfo GetBinaryAssetFolder(BuildTarget buildTarget)
+ {
+ switch (buildTarget)
+ {
+ case BuildTarget.StandaloneWindows:
+ case BuildTarget.StandaloneWindows64:
+ return new BinaryAssetFolderInfo("win", "Plugins");
+ case BuildTarget.WSAPlayer:
+ return new BinaryAssetFolderInfo("uwp", "Plugins/UWP");
+ default:
+ throw new System.ArgumentException("Unrecognised build target: " + buildTarget);
+ }
+ }
+
+ protected override IEnumerable GetBinaryFiles(BuildTarget buildTarget, bool allVariants, string suffix)
+ {
+ string dllSuffix = suffix + ".dll";
+
+ switch (buildTarget)
+ {
+ case BuildTarget.StandaloneWindows:
+ yield return new FileRecord("x86/fmodstudio" + dllSuffix);
+ break;
+ case BuildTarget.StandaloneWindows64:
+ yield return new FileRecord("x86_64/fmodstudio" + dllSuffix);
+ break;
+ case BuildTarget.WSAPlayer:
+ foreach (string architecture in new[] { "arm", "x64", "x86" })
+ {
+ yield return new FileRecord(string.Format("{0}/fmod{1}", architecture, dllSuffix));
+ yield return new FileRecord(string.Format("{0}/fmodstudio{1}", architecture, dllSuffix));
+ }
+ break;
+ default:
+ throw new System.NotSupportedException("Unrecognised Build Target");
+ }
+ }
+
+ protected override IEnumerable GetOptionalBinaryFiles(BuildTarget buildTarget, bool allVariants)
+ {
+ switch (buildTarget)
+ {
+ case BuildTarget.StandaloneWindows:
+ yield return new FileRecord("x86/gvraudio.dll");
+ yield return new FileRecord("x86/resonanceaudio.dll");
+ break;
+ case BuildTarget.StandaloneWindows64:
+ yield return new FileRecord("x86_64/gvraudio.dll");
+ yield return new FileRecord("x86_64/resonanceaudio.dll");
+ break;
+ case BuildTarget.WSAPlayer:
+ yield break;
+ default:
+ throw new System.NotSupportedException("Unrecognised Build Target");
+ }
+ }
+
+ internal override bool SupportsAdditionalCPP(BuildTarget target)
+ {
+ return target != BuildTarget.WSAPlayer;
+ }
+#endif
+
+ internal override string GetPluginPath(string pluginName)
+ {
+#if UNITY_STANDALONE_WIN
+ #if UNITY_64
+ return string.Format("{0}/X86_64/{1}.dll", GetPluginBasePath(), pluginName);
+ #else
+ return string.Format("{0}/X86/{1}.dll", GetPluginBasePath(), pluginName);
+ #endif
+#else // UNITY_WSA
+ return string.Format("{0}.dll", pluginName);
+#endif
+ }
+#if UNITY_EDITOR
+ internal override OutputType[] ValidOutputTypes
+ {
+ get
+ {
+ return sValidOutputTypes;
+ }
+ }
+
+ private static OutputType[] sValidOutputTypes = {
+ new OutputType() { displayName = "Windows Audio Session API", outputType = FMOD.OUTPUTTYPE.WASAPI },
+ new OutputType() { displayName = "Windows Sonic", outputType = FMOD.OUTPUTTYPE.WINSONIC },
+ };
+
+ internal override int CoreCount { get { return MaximumCoreCount; } }
+#endif
+
+ internal override List DefaultCodecChannels { get { return staticCodecChannels; } }
+
+ private static List staticCodecChannels = new List()
+ {
+ new CodecChannelCount { format = CodecType.FADPCM, channels = 0 },
+ new CodecChannelCount { format = CodecType.Vorbis, channels = 32 },
+ };
+ }
+}
diff --git a/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs.meta b/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs.meta
new file mode 100644
index 00000000..ac31c999
--- /dev/null
+++ b/Assets/Plugins/FMOD/platforms/win/src/PlatformWindows.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9660e62d6232af242877f0cc2b90c63d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src.meta b/Assets/Plugins/FMOD/src.meta
new file mode 100644
index 00000000..e435fc44
--- /dev/null
+++ b/Assets/Plugins/FMOD/src.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2994e348941404549b266423c2ac329f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/AutomatableSlots.cs b/Assets/Plugins/FMOD/src/AutomatableSlots.cs
new file mode 100644
index 00000000..777eb4b7
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/AutomatableSlots.cs
@@ -0,0 +1,85 @@
+using System;
+using UnityEngine.Serialization;
+
+namespace FMODUnity
+{
+ [Serializable]
+ public struct AutomatableSlots
+ {
+ public const int Count = 16;
+
+ [FormerlySerializedAs("slot00")]
+ public float Slot00;
+ [FormerlySerializedAs("slot01")]
+ public float Slot01;
+ [FormerlySerializedAs("slot02")]
+ public float Slot02;
+ [FormerlySerializedAs("slot03")]
+ public float Slot03;
+ [FormerlySerializedAs("slot04")]
+ public float Slot04;
+ [FormerlySerializedAs("slot05")]
+ public float Slot05;
+ [FormerlySerializedAs("slot06")]
+ public float Slot06;
+ [FormerlySerializedAs("slot07")]
+ public float Slot07;
+ [FormerlySerializedAs("slot08")]
+ public float Slot08;
+ [FormerlySerializedAs("slot09")]
+ public float Slot09;
+ [FormerlySerializedAs("slot10")]
+ public float Slot10;
+ [FormerlySerializedAs("slot11")]
+ public float Slot11;
+ [FormerlySerializedAs("slot12")]
+ public float Slot12;
+ [FormerlySerializedAs("slot13")]
+ public float Slot13;
+ [FormerlySerializedAs("slot14")]
+ public float Slot14;
+ [FormerlySerializedAs("slot15")]
+ public float Slot15;
+
+ public float GetValue(int index)
+ {
+ switch(index)
+ {
+ case 0:
+ return Slot00;
+ case 1:
+ return Slot01;
+ case 2:
+ return Slot02;
+ case 3:
+ return Slot03;
+ case 4:
+ return Slot04;
+ case 5:
+ return Slot05;
+ case 6:
+ return Slot06;
+ case 7:
+ return Slot07;
+ case 8:
+ return Slot08;
+ case 9:
+ return Slot09;
+ case 10:
+ return Slot10;
+ case 11:
+ return Slot11;
+ case 12:
+ return Slot12;
+ case 13:
+ return Slot13;
+ case 14:
+ return Slot14;
+ case 15:
+ return Slot15;
+ default:
+ throw new ArgumentException(string.Format("Invalid slot index: {0}", index));
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/AutomatableSlots.cs.meta b/Assets/Plugins/FMOD/src/AutomatableSlots.cs.meta
new file mode 100644
index 00000000..890a60b6
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/AutomatableSlots.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9c13d4e62f5f7b44bb33162cbf29a9f8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/BankRefAttribute.cs b/Assets/Plugins/FMOD/src/BankRefAttribute.cs
new file mode 100644
index 00000000..de449173
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/BankRefAttribute.cs
@@ -0,0 +1,8 @@
+using UnityEngine;
+
+namespace FMODUnity
+{
+ public class BankRefAttribute : PropertyAttribute
+ {
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/BankRefAttribute.cs.meta b/Assets/Plugins/FMOD/src/BankRefAttribute.cs.meta
new file mode 100644
index 00000000..06ddbb18
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/BankRefAttribute.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a8ab5f38e7776644297d8b3687c39b49
+timeCreated: 1445488716
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor.meta b/Assets/Plugins/FMOD/src/Editor.meta
new file mode 100644
index 00000000..ea0ad527
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bdb2bdc82b47a634b803bb658c6e312b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs b/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs
new file mode 100644
index 00000000..c126d056
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs
@@ -0,0 +1,66 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ [CustomPropertyDrawer(typeof(BankRefAttribute))]
+ public class BankRefDrawer : PropertyDrawer
+ {
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+ {
+ Texture browseIcon = EditorUtils.LoadImage("SearchIconBlack.png");
+
+ SerializedProperty pathProperty = property;
+
+ EditorGUI.BeginProperty(position, label, property);
+
+ Event e = Event.current;
+ if (e.type == EventType.DragPerform && position.Contains(e.mousePosition))
+ {
+ if (DragAndDrop.objectReferences.Length > 0 &&
+ DragAndDrop.objectReferences[0] != null &&
+ DragAndDrop.objectReferences[0].GetType() == typeof(EditorBankRef))
+ {
+ pathProperty.stringValue = ((EditorBankRef)DragAndDrop.objectReferences[0]).Name;
+
+ e.Use();
+ }
+ }
+ if (e.type == EventType.DragUpdated && position.Contains(e.mousePosition))
+ {
+ if (DragAndDrop.objectReferences.Length > 0 &&
+ DragAndDrop.objectReferences[0] != null &&
+ DragAndDrop.objectReferences[0].GetType() == typeof(EditorBankRef))
+ {
+ DragAndDrop.visualMode = DragAndDropVisualMode.Move;
+ DragAndDrop.AcceptDrag();
+ e.Use();
+ }
+ }
+
+ float baseHeight = GUI.skin.textField.CalcSize(new GUIContent()).y;
+
+ position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
+
+ var buttonStyle = new GUIStyle(GUI.skin.button);
+ buttonStyle.padding.top = buttonStyle.padding.bottom = 1;
+
+ Rect searchRect = new Rect(position.x + position.width - browseIcon.width - 15, position.y, browseIcon.width + 10, baseHeight);
+ Rect pathRect = new Rect(position.x, position.y, searchRect.x - position.x - 5, baseHeight);
+
+ EditorGUI.PropertyField(pathRect, pathProperty, GUIContent.none);
+ if (GUI.Button(searchRect, new GUIContent(browseIcon, "Select FMOD Bank"), buttonStyle))
+ {
+ var eventBrowser = ScriptableObject.CreateInstance();
+
+ eventBrowser.ChooseBank(property);
+ var windowRect = position;
+ windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position);
+ windowRect.height = searchRect.height + 1;
+ eventBrowser.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 400));
+ }
+
+ EditorGUI.EndProperty();
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs.meta b/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs.meta
new file mode 100644
index 00000000..9b8463c9
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefDrawer.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 49ebe6fea5e4bfc4bb492bba062b2afe
+timeCreated: 1433209573
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs b/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs
new file mode 100644
index 00000000..3a081b42
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs
@@ -0,0 +1,237 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ public class BankRefreshWindow : EditorWindow
+ {
+ private static BankRefreshWindow instance = null;
+
+ private SerializedObject serializedSettings;
+ private SerializedProperty cooldown;
+ private SerializedProperty showWindow;
+
+ private bool readyToRefreshBanks = false;
+ private float closeTime = float.MaxValue;
+ private string lastRefreshError = null;
+
+ private const float CloseDelay = 5;
+
+ public static bool IsVisible { get { return instance != null; } }
+
+ public static bool ReadyToRefreshBanks { get { return instance == null || instance.readyToRefreshBanks; } }
+
+ public static void ShowWindow()
+ {
+ if (instance == null)
+ {
+ instance = CreateInstance();
+ instance.titleContent = new GUIContent(L10n.Tr("FMOD Bank Refresh Status"));
+ instance.minSize = new Vector2(400, 200);
+ instance.maxSize = new Vector2(1000, 200);
+
+ instance.ShowUtility();
+ }
+ }
+
+ private void OnEnable()
+ {
+ serializedSettings = new SerializedObject(Settings.Instance);
+ cooldown = serializedSettings.FindProperty("BankRefreshCooldown");
+ showWindow = serializedSettings.FindProperty("ShowBankRefreshWindow");
+
+ // instance is set to null when scripts are recompiled
+ if (instance == null)
+ {
+ instance = this;
+ }
+ else if (instance != this)
+ {
+ Close();
+ }
+ }
+
+ private void OnDestroy()
+ {
+ if (instance == this)
+ {
+ instance = null;
+ }
+ }
+
+ private void OnInspectorUpdate()
+ {
+ Repaint();
+
+ if (BankRefresher.TimeUntilBankRefresh() != float.MaxValue)
+ {
+ closeTime = float.MaxValue;
+ }
+
+ if (Time.realtimeSinceStartup > closeTime)
+ {
+ Close();
+ }
+ }
+
+ public static void HandleBankRefresh(string error)
+ {
+ if (error != null)
+ {
+ RuntimeUtils.DebugLogErrorFormat("FMOD: Bank refresh failed: {0}", error);
+ }
+
+ if (instance != null)
+ {
+ instance.readyToRefreshBanks = false;
+ instance.lastRefreshError = error;
+
+ if (error == null)
+ {
+ instance.closeTime = Time.realtimeSinceStartup + CloseDelay;
+ }
+ }
+ }
+
+ private void OnGUI()
+ {
+ serializedSettings.Update();
+
+ DrawStatus();
+
+ GUILayout.FlexibleSpace();
+
+ SettingsEditor.DisplayBankRefreshSettings(cooldown, showWindow, false);
+
+ DrawButtons();
+
+ serializedSettings.ApplyModifiedProperties();
+ }
+
+ private bool ConsumeEscapeKey()
+ {
+ if ((focusedWindow == this) && Event.current.isKey && Event.current.keyCode == KeyCode.Escape)
+ {
+ Event.current.Use();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ private void DrawStatus()
+ {
+ GUIStyle labelStyle = new GUIStyle(EditorStyles.whiteLargeLabel);
+ labelStyle.alignment = TextAnchor.MiddleCenter;
+
+ GUIStyle largeErrorStyle = new GUIStyle(labelStyle);
+ largeErrorStyle.normal.textColor = Color.red;
+
+ GUIStyle errorStyle = new GUIStyle(GUI.skin.box);
+ errorStyle.alignment = TextAnchor.UpperLeft;
+ errorStyle.wordWrap = true;
+ errorStyle.normal.textColor = Color.red;
+
+ float timeSinceFileChange = BankRefresher.TimeSinceSourceFileChange();
+
+ if (timeSinceFileChange != float.MaxValue)
+ {
+ GUILayout.Label(string.Format(L10n.Tr("The FMOD source banks changed {0} ago."),
+ EditorUtils.DurationString(timeSinceFileChange)), labelStyle);
+
+ float timeUntilBankRefresh = BankRefresher.TimeUntilBankRefresh();
+
+ if (timeUntilBankRefresh == 0)
+ {
+ GUILayout.Label(L10n.Tr("Refreshing banks now..."), labelStyle);
+ readyToRefreshBanks = true;
+ }
+ else if (timeUntilBankRefresh != float.MaxValue)
+ {
+ if (DrawCountdown(L10n.Tr("Refreshing banks"), timeUntilBankRefresh, Settings.Instance.BankRefreshCooldown, labelStyle)
+ || ConsumeEscapeKey())
+ {
+ BankRefresher.DisableAutoRefresh();
+ }
+ }
+ else
+ {
+ GUILayout.Label(L10n.Tr("Would you like to refresh banks?"), labelStyle);
+ }
+ }
+ else
+ {
+ if (lastRefreshError == null)
+ {
+ GUILayout.Label(L10n.Tr("The FMOD banks are up to date."), labelStyle);
+ }
+ else
+ {
+ GUILayout.Label(L10n.Tr("Bank refresh failed:"), largeErrorStyle);
+ GUILayout.Box(lastRefreshError, errorStyle, GUILayout.ExpandWidth(true));
+ }
+ }
+
+ if (closeTime != float.MaxValue)
+ {
+ float timeUntilClose = Mathf.Max(0, closeTime - Time.realtimeSinceStartup);
+
+ if (DrawCountdown(L10n.Tr("Closing"), timeUntilClose, CloseDelay, labelStyle) || ConsumeEscapeKey())
+ {
+ closeTime = float.MaxValue;
+ }
+ }
+ }
+
+ private static bool DrawCountdown(string text, float remainingTime, float totalTime, GUIStyle labelStyle)
+ {
+ GUILayout.Label(string.Format(L10n.Tr("{0} in {1}..."), text, EditorUtils.DurationString(remainingTime)), labelStyle);
+
+ const float boxHeight = 2;
+
+ Rect controlRect = EditorGUILayout.GetControlRect(false, boxHeight * 2);
+
+ Rect boxRect = controlRect;
+ boxRect.width *= remainingTime / totalTime;
+ boxRect.x += (controlRect.width - boxRect.width) / 2;
+ boxRect.height = 2;
+
+ GUI.DrawTexture(boxRect, EditorGUIUtility.whiteTexture);
+
+ GUIContent cancelContent = new GUIContent(L10n.Tr("Cancel"));
+
+ controlRect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * 2);
+
+ Rect buttonRect = controlRect;
+ buttonRect.width = 100;
+ buttonRect.x += (controlRect.width - buttonRect.width) / 2;
+
+ return GUI.Button(buttonRect, cancelContent);
+ }
+
+ private void DrawButtons()
+ {
+ Rect rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * 2);
+
+ int buttonCount = 2;
+
+ Rect closeRect = rect;
+ closeRect.width = rect.width / buttonCount;
+
+ Rect refreshRect = rect;
+ refreshRect.xMin = closeRect.xMax;
+
+ if (GUI.Button(closeRect, L10n.Tr("Close")))
+ {
+ Close();
+ }
+
+ if (GUI.Button(refreshRect, L10n.Tr("Refresh Banks Now")))
+ {
+ EventManager.RefreshBanks();
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs.meta b/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs.meta
new file mode 100644
index 00000000..efec694b
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefreshWindow.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 40a1ca322d08d704eacd449863718b31
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs b/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs
new file mode 100644
index 00000000..0c75f5e1
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs
@@ -0,0 +1,167 @@
+using System;
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ public class BankRefresher
+ {
+ private static string currentWatchPath;
+ private static FileSystemWatcher sourceFileWatcher;
+ private static bool sourceFilesChanged = false;
+ private static float lastSourceFileChange = float.MaxValue;
+ private static bool autoRefresh = true;
+ private static float nextFilePollTime = float.MinValue;
+
+ private const int FilePollPeriod = 5;
+
+ public static void DisableAutoRefresh()
+ {
+ autoRefresh = false;
+ }
+
+ public static void Startup()
+ {
+ sourceFileWatcher = new FileSystemWatcher();
+ sourceFileWatcher.IncludeSubdirectories = true;
+ sourceFileWatcher.NotifyFilter = NotifyFilters.LastWrite;
+
+ sourceFileWatcher.Changed += OnSourceFileChanged;
+ sourceFileWatcher.Created += OnSourceFileChanged;
+ sourceFileWatcher.Deleted += OnSourceFileChanged;
+
+ EditorApplication.update += Update;
+ }
+
+ private static void OnSourceFileChanged(object source, FileSystemEventArgs e)
+ {
+ sourceFilesChanged = true;
+ }
+
+ private static void Update()
+ {
+ UpdateFileWatcherPath();
+ CheckSourceFilesChanged();
+ CheckCacheFileExists();
+ RefreshBanksIfReady();
+ }
+
+ private static void UpdateFileWatcherPath()
+ {
+ string sourceBankPath = Settings.Instance.SourceBankPath;
+
+ string pathToWatch;
+
+ if (Path.IsPathRooted(sourceBankPath))
+ {
+ pathToWatch = Path.GetFullPath(sourceBankPath);
+ }
+ else
+ {
+ pathToWatch = Path.GetFullPath(Environment.CurrentDirectory + "/" + sourceBankPath);
+ }
+
+ if (currentWatchPath != pathToWatch)
+ {
+ currentWatchPath = pathToWatch;
+
+ try {
+ sourceFileWatcher.EnableRaisingEvents = false;
+ sourceFilesChanged = false;
+
+ if (!string.IsNullOrEmpty(sourceBankPath))
+ {
+ sourceFileWatcher.Path = pathToWatch;
+ sourceFileWatcher.EnableRaisingEvents = true;
+ }
+ }
+ catch (ArgumentException e)
+ {
+ RuntimeUtils.DebugLogWarningFormat("Error watching {0}: {1}", pathToWatch, e.Message);
+ }
+ }
+ }
+
+ private static void CheckSourceFilesChanged()
+ {
+ if (sourceFilesChanged)
+ {
+ lastSourceFileChange = Time.realtimeSinceStartup;
+ sourceFilesChanged = false;
+
+ if (!BankRefreshWindow.IsVisible)
+ {
+ autoRefresh = true;
+ }
+
+ if (IsWindowEnabled())
+ {
+ BankRefreshWindow.ShowWindow();
+ }
+ }
+ }
+
+ private static void CheckCacheFileExists()
+ {
+ if (Time.realtimeSinceStartup >= nextFilePollTime)
+ {
+ if (!File.Exists(EventManager.CacheAssetFullName))
+ {
+ EventManager.RefreshBanks();
+ }
+
+ nextFilePollTime = Time.realtimeSinceStartup + FilePollPeriod;
+ }
+ }
+
+ private static void RefreshBanksIfReady()
+ {
+ if (TimeUntilBankRefresh() == 0 && BankRefreshWindow.ReadyToRefreshBanks)
+ {
+ EventManager.RefreshBanks();
+ }
+ }
+
+ public static void HandleBankRefresh(string result)
+ {
+ lastSourceFileChange = float.MaxValue;
+ BankRefreshWindow.HandleBankRefresh(result);
+ }
+
+ private static bool IsWindowEnabled()
+ {
+ Settings settings = Settings.Instance;
+
+ return settings.BankRefreshCooldown == Settings.BankRefreshPrompt
+ || (settings.BankRefreshCooldown >= 0 && settings.ShowBankRefreshWindow);
+ }
+
+ public static float TimeSinceSourceFileChange()
+ {
+ if (lastSourceFileChange == float.MaxValue)
+ {
+ return float.MaxValue;
+ }
+ else
+ {
+ return Mathf.Max(0, Time.realtimeSinceStartup - lastSourceFileChange);
+ }
+ }
+
+ public static float TimeUntilBankRefresh()
+ {
+ if (!autoRefresh
+ || lastSourceFileChange == float.MaxValue
+ || Settings.Instance.BankRefreshCooldown < 0)
+ {
+ return float.MaxValue;
+ }
+ else
+ {
+ float nextRefreshTime = lastSourceFileChange + Settings.Instance.BankRefreshCooldown;
+ return Mathf.Max(0, nextRefreshTime - Time.realtimeSinceStartup);
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs.meta b/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs.meta
new file mode 100644
index 00000000..fb733614
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e564c074e96205b49b91ff80126983c5
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs b/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs
new file mode 100644
index 00000000..8adac7d1
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using UnityEngine;
+using UnityEditor;
+using UnityEditor.Build;
+
+#if (UNITY_VISUALSCRIPTING_EXIST)
+using Unity.VisualScripting;
+#elif (UNITY_BOLT_EXIST)
+using Ludiq;
+using Bolt;
+#endif
+
+namespace FMODUnity
+{
+ public class BoltIntegration : MonoBehaviour
+ {
+ [MenuItem("FMOD/Generate Visual Scripting Units")]
+ public static void GenerateBoltUnitOptions()
+ {
+#if (UNITY_BOLT_EXIST || UNITY_VISUALSCRIPTING_EXIST)
+ BuildBoltUnitOptions();
+#else
+ TriggerBuild();
+#endif
+ }
+
+#if !(UNITY_BOLT_EXIST || UNITY_VISUALSCRIPTING_EXIST)
+ [MenuItem("FMOD/Generate Visual Scripting Units", true)]
+ private static bool IsBoltPresent()
+ {
+ Assembly ludiqCoreRuntimeAssembly = null;
+ Assembly boltFlowEditorAssembly = null;
+
+ try
+ {
+ ludiqCoreRuntimeAssembly = Assembly.Load("Ludiq.Core.Runtime");
+ boltFlowEditorAssembly = Assembly.Load("Bolt.Flow.Editor");
+ }
+ catch (FileNotFoundException)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ private static void TriggerBuild()
+ {
+ BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
+ BuildTargetGroup group = BuildPipeline.GetBuildTargetGroup(target);
+ NamedBuildTarget namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(group);
+ string previousSymbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
+
+ if (!previousSymbols.Contains("UNITY_BOLT_EXIST"))
+ {
+ PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, previousSymbols + ";UNITY_BOLT_EXIST");
+ }
+ Settings.Instance.BoltUnitOptionsBuildPending = true;
+ AssetDatabase.Refresh();
+ }
+
+#else
+ private static void BuildBoltUnitOptions()
+ {
+#if (UNITY_BOLT_EXIST)
+ DictionaryAsset projectSettings = AssetDatabase.LoadAssetAtPath(PathUtility.FromProject(LudiqCore.Paths.projectSettings), typeof(DictionaryAsset)) as DictionaryAsset;
+ List assemblyOptions = projectSettings.dictionary["assemblyOptions"] as List;
+#else
+ List assemblyOptions = BoltCore.Configuration.assemblyOptions;
+#endif
+
+ if (!assemblyOptions.Contains("FMODUnity"))
+ {
+ assemblyOptions.Add("FMODUnity");
+ }
+
+ if (!assemblyOptions.Contains("FMODUnityResonance"))
+ {
+ assemblyOptions.Add("FMODUnityResonance");
+ }
+#if (UNITY_BOLT_EXIST)
+ List typeOptions = projectSettings.dictionary["typeOptions"] as List;
+#else
+ List typeOptions = BoltCore.Configuration.typeOptions;
+#endif
+ Assembly fmodUnityAssembly = Assembly.Load("FMODUnity");
+ Assembly fmodUnityResonanceAssembly = Assembly.Load("FMODUnityResonance");
+
+ List allTypes = new List(GetTypesForNamespace(fmodUnityAssembly, "FMOD"));
+ allTypes.AddRange(GetTypesForNamespace(fmodUnityAssembly, "FMOD.Studio"));
+ allTypes.AddRange(GetTypesForNamespace(fmodUnityAssembly, "FMODUnity"));
+ allTypes.AddRange(GetTypesForNamespace(fmodUnityResonanceAssembly, "FMODUnityResonance"));
+
+ foreach (Type type in allTypes)
+ {
+ if (!typeOptions.Contains(type))
+ {
+ typeOptions.Add(type);
+ }
+ }
+
+ Codebase.UpdateSettings();
+#if (UNITY_BOLT_EXIST)
+ UnitBase.Build();
+#else
+ BoltCore.Configuration.Save();
+ UnitBase.Rebuild();
+#endif
+ }
+
+ private static IEnumerable GetTypesForNamespace(Assembly assembly, string requestedNamespace)
+ {
+ return assembly.GetTypes()
+ .Where(t => string.Equals(t.Namespace, requestedNamespace, StringComparison.Ordinal));
+ }
+#endif
+
+ public static void Startup()
+ {
+#if (UNITY_BOLT_EXIST || UNITY_VISUALSCRIPTING_EXIST)
+ if (Settings.Instance.BoltUnitOptionsBuildPending)
+ {
+ Settings.Instance.BoltUnitOptionsBuildPending = false;
+ BuildBoltUnitOptions();
+ }
+#endif
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs.meta b/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs.meta
new file mode 100644
index 00000000..0ab100c6
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/BoltIntegration.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f876942dd549ef444a82ab923e75ccb1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs b/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs
new file mode 100644
index 00000000..f9ff18c7
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs
@@ -0,0 +1,124 @@
+#if UNITY_EDITOR
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace FMODUnity
+{
+ public static class CodeGeneration
+ {
+ public static void GenerateStaticPluginRegistration(string filePath, Platform platform,
+ Action reportError)
+ {
+ List validatedPlugins = ValidateStaticPlugins(platform.StaticPlugins, reportError);
+
+ using (StreamWriter file = new StreamWriter(filePath))
+ {
+ WriteStaticPluginRegistration(file, platform.IsFMODStaticallyLinked, validatedPlugins);
+ }
+ }
+
+ private static void WriteStaticPluginRegistration(StreamWriter file, bool isFMODStaticallyLinked,
+ IEnumerable pluginFunctions)
+ {
+ file.WriteLine("#if ENABLE_IL2CPP");
+ file.WriteLine();
+ file.WriteLine("// This file was generated by FMOD for Unity from the Static Plugins list in the FMOD settings.");
+ file.WriteLine();
+
+ file.WriteLine("using System;");
+ file.WriteLine("using System.Runtime.InteropServices;");
+ file.WriteLine();
+
+ file.WriteLine("namespace FMODUnity");
+ file.WriteLine("{");
+
+ file.WriteLine(" class {0}", Platform.RegisterStaticPluginsClassName);
+ file.WriteLine(" {");
+
+ // Import the plugin functions
+ foreach (string pluginFunction in pluginFunctions)
+ {
+ file.WriteLine(" [DllImport(\"__Internal\")]");
+ file.WriteLine(" private static extern IntPtr {0}();", pluginFunction);
+ file.WriteLine();
+ }
+
+ // Import the RegisterDSP function
+ file.WriteLine(" [DllImport(FMOD.VERSION.dll)]");
+ file.WriteLine(" private static extern FMOD.RESULT FMOD5_System_RegisterDSP(IntPtr system, IntPtr description, IntPtr handle);");
+ file.WriteLine();
+
+ file.WriteLine(" public static void {0}(FMOD.System coreSystem, Action reportResult)",
+ Platform.RegisterStaticPluginsFunctionName);
+ file.WriteLine(" {");
+
+ if (pluginFunctions.Any())
+ {
+ file.WriteLine(" FMOD.RESULT result;");
+
+ foreach (string pluginFunction in pluginFunctions)
+ {
+ file.WriteLine();
+ file.WriteLine(" result = FMOD5_System_RegisterDSP(coreSystem.handle, {0}(), IntPtr.Zero);", pluginFunction);
+ file.WriteLine(" reportResult(result, \"Registering static plugin '{0}'\");", pluginFunction);
+ }
+ }
+
+ file.WriteLine(" }");
+ file.WriteLine(" }");
+ file.WriteLine("}");
+ file.WriteLine("");
+ file.WriteLine("#endif // ENABLE_IL2CPP");
+ }
+
+ private static List ValidateStaticPlugins(List staticPlugins, Action reportError)
+ {
+ List result = new List();
+
+ for (int i = 0; i < staticPlugins.Count; ++i)
+ {
+ string functionName = staticPlugins[i];
+
+ string trimmedName = (functionName != null) ? functionName.Trim() : null;
+
+ if (string.IsNullOrEmpty(trimmedName))
+ {
+ reportError(string.Format("Static plugin {0} has no name and will be ignored.", i + 1));
+ }
+ else if (IsValidFunctionName(trimmedName, reportError))
+ {
+ result.Add(trimmedName);
+ }
+ }
+
+ return result;
+ }
+
+ private static bool IsValidFunctionName(string name, Action reportError)
+ {
+ if (!(char.IsLetter(name[0]) || name[0] == '_'))
+ {
+ reportError(string.Format(
+ "Plugin name '{0}' is not valid. Names must start with a letter or an underscore ('_').", name));
+ return false;
+ }
+
+ for (int i = 1; i < name.Length; ++i)
+ {
+ if (!(char.IsLetterOrDigit(name[i]) || name[i] == '_'))
+ {
+ reportError(string.Format(
+ "Plugin name '{0}' is not valid. " +
+ "Character '{1}' at position {2} is invalid - it must be a letter, a number, or an underscore ('_').",
+ name, name[i], i));
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+}
+#endif
diff --git a/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs.meta b/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs.meta
new file mode 100644
index 00000000..31bb1fdc
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/CodeGeneration.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 438155f6a2d689e45b5cc7701d412b80
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs b/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs
new file mode 100644
index 00000000..fd6d7d1d
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs
@@ -0,0 +1,402 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEditor;
+
+namespace FMODUnity
+{
+ public class CreateEventPopup : EditorWindow
+ {
+ private class FolderEntry
+ {
+ public FolderEntry parent;
+ public string name;
+ public string guid;
+ public List entries = new List();
+ public Rect rect;
+ }
+
+ private SerializedProperty outputProperty;
+
+ private FolderEntry rootFolder;
+ private FolderEntry currentFolder;
+ private List banks;
+
+ private int lastHover = 0;
+ private string eventFolder = "/";
+ private string eventName = "";
+ private string currentFilter = "";
+ private int selectedBank = 0;
+ private bool resetCursor = true;
+ private Vector2 scrollPos = new Vector2();
+ private Rect scrollRect = new Rect();
+ private bool isConnected = false;
+
+ internal void SelectEvent(SerializedProperty property)
+ {
+ outputProperty = property;
+ }
+
+ private class BankEntry
+ {
+ public string name;
+ public string guid;
+ }
+
+ public CreateEventPopup()
+ {
+ }
+
+ private void BuildTree()
+ {
+ var rootGuid = EditorUtils.GetScriptOutput("studio.project.workspace.masterEventFolder.id");
+ rootFolder = new FolderEntry();
+ rootFolder.guid = rootGuid;
+ BuildTreeItem(rootFolder);
+ wantsMouseMove = true;
+ banks = new List();
+
+ const string buildBankTreeFunc =
+ @"function() {
+ var output = """";
+ const items = [ studio.project.workspace.masterBankFolder ];
+ while (items.length > 0) {
+ var currentItem = items.shift();
+ if (currentItem.isOfType(""BankFolder"")) {
+ currentItem.items.reverse().forEach(function(val) {
+ items.unshift(val);
+ });
+ } else {
+ output += "","" + currentItem.id + currentItem.getPath().replace(""bank:/"", """");
+ }
+ }
+ return output;
+ }";
+
+ string bankList = EditorUtils.GetScriptOutput(string.Format("({0})()", buildBankTreeFunc));
+ string[] bankListSplit = bankList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ foreach (var bank in bankListSplit)
+ {
+ var entry = new BankEntry();
+ entry.guid = bank.Substring(0, 38);
+ entry.name = bank.Substring(38);
+ banks.Add(entry);
+ }
+ }
+
+ private void BuildTreeItem(FolderEntry entry)
+ {
+ // lookup the entry
+ EditorUtils.GetScriptOutput(string.Format("cur = studio.project.lookup(\"{0}\");", entry.guid));
+
+ // get child count
+ string itemCountString = EditorUtils.GetScriptOutput("cur.items.length;");
+ int itemCount;
+ Int32.TryParse(itemCountString, out itemCount);
+
+ // iterate children looking for folder
+ for (int item = 0; item < itemCount; item++)
+ {
+ EditorUtils.GetScriptOutput(String.Format("child = cur.items[{0}]", item));
+
+ // check if it's a folder
+ string isFolder = EditorUtils.GetScriptOutput("child.isOfExactType(\"EventFolder\")");
+ if (isFolder == "false")
+ {
+ continue;
+ }
+
+ // Get guid and name
+ string info = EditorUtils.GetScriptOutput("child.id + child.name");
+
+ var childEntry = new FolderEntry();
+ childEntry.guid = info.Substring(0, 38);
+ childEntry.name = info.Substring(38);
+ childEntry.parent = entry;
+ entry.entries.Add(childEntry);
+ }
+
+ // Recurse for child entries
+ foreach(var childEntry in entry.entries)
+ {
+ BuildTreeItem(childEntry);
+ }
+ }
+
+ public void OnGUI()
+ {
+ var borderIcon = EditorUtils.LoadImage("Border.png");
+ var border = new GUIStyle(GUI.skin.box);
+ border.normal.background = borderIcon;
+ GUI.Box(new Rect(1, 1, position.width - 1, position.height - 1), GUIContent.none, border);
+
+ if (Event.current.type == EventType.Layout)
+ {
+ isConnected = EditorUtils.IsConnectedToStudio();
+ }
+
+ if (!isConnected)
+ {
+ this.ShowNotification(new GUIContent("FMOD Studio not running"));
+ return;
+ }
+
+ this.RemoveNotification();
+
+ if (rootFolder == null)
+ {
+ BuildTree();
+ currentFolder = rootFolder;
+ }
+
+ var arrowIcon = EditorUtils.LoadImage("ArrowIcon.png");
+ var hoverIcon = EditorUtils.LoadImage("SelectedAlt.png");
+
+ var nextEntry = currentFolder;
+
+ var filteredEntries = currentFolder.entries.FindAll((x) => x.name.StartsWith(currentFilter, StringComparison.CurrentCultureIgnoreCase));
+
+ // Process key strokes for the folder list
+ {
+ if (Event.current.keyCode == KeyCode.UpArrow)
+ {
+ if (Event.current.type == EventType.KeyDown)
+ {
+ lastHover = Math.Max(lastHover - 1, 0);
+ if (filteredEntries[lastHover].rect.y < scrollPos.y)
+ {
+ scrollPos.y = filteredEntries[lastHover].rect.y;
+ }
+ }
+ Event.current.Use();
+ }
+ if (Event.current.keyCode == KeyCode.DownArrow)
+ {
+ if (Event.current.type == EventType.KeyDown)
+ {
+ lastHover = Math.Min(lastHover + 1, filteredEntries.Count - 1);
+ if (filteredEntries[lastHover].rect.y + filteredEntries[lastHover].rect.height > scrollPos.y + scrollRect.height)
+ {
+ scrollPos.y = filteredEntries[lastHover].rect.y - scrollRect.height + filteredEntries[lastHover].rect.height * 2;
+ }
+ }
+ Event.current.Use();
+ }
+ if (Event.current.keyCode == KeyCode.RightArrow)
+ {
+ if (Event.current.type == EventType.KeyDown)
+ nextEntry = filteredEntries[lastHover];
+ Event.current.Use();
+ }
+ if (Event.current.keyCode == KeyCode.LeftArrow)
+ {
+ if (Event.current.type == EventType.KeyDown)
+ if (currentFolder.parent != null)
+ {
+ nextEntry = currentFolder.parent;
+ }
+ Event.current.Use();
+ }
+ }
+
+ bool disabled = eventName.Length == 0;
+ EditorGUI.BeginDisabledGroup(disabled);
+ if (GUILayout.Button("Create Event"))
+ {
+ CreateEventInStudio();
+ this.Close();
+ }
+ EditorGUI.EndDisabledGroup();
+
+ {
+ GUI.SetNextControlName("name");
+
+ EditorGUILayout.LabelField("Name");
+ eventName = EditorGUILayout.TextField(eventName);
+ }
+
+ {
+ EditorGUILayout.LabelField("Bank");
+ selectedBank = EditorGUILayout.Popup(selectedBank, banks.Select(x => x.name).ToArray());
+ }
+
+ bool updateEventPath = false;
+ {
+ GUI.SetNextControlName("folder");
+ EditorGUI.BeginChangeCheck();
+ EditorGUILayout.LabelField("Path");
+ eventFolder = GUILayout.TextField(eventFolder);
+ if (EditorGUI.EndChangeCheck())
+ {
+ updateEventPath = true;
+ }
+ }
+
+ if (resetCursor)
+ {
+ resetCursor = false;
+
+ var textEditor = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
+ if (textEditor != null)
+ {
+ textEditor.MoveCursorToPosition(new Vector2(9999, 9999));
+ }
+ }
+
+ // Draw the current folder as a title bar, click to go back one level
+ {
+ Rect currentRect = EditorGUILayout.GetControlRect();
+
+ var bg = new GUIStyle(GUI.skin.box);
+ Rect bgRect = new Rect(currentRect);
+ bgRect.x = 2;
+ bgRect.width = position.width-4;
+ GUI.Box(bgRect, GUIContent.none, bg);
+
+ Rect textureRect = currentRect;
+ textureRect.width = arrowIcon.width;
+ if (currentFolder.name != null)
+ {
+ GUI.DrawTextureWithTexCoords(textureRect, arrowIcon, new Rect(1, 1, -1, -1));
+ }
+
+ Rect labelRect = currentRect;
+ labelRect.x += arrowIcon.width;
+ labelRect.width -= arrowIcon.width;
+ GUI.Label(labelRect, currentFolder.name != null ? currentFolder.name : "Folders", EditorStyles.boldLabel);
+
+ if (Event.current.type == EventType.MouseDown && currentRect.Contains(Event.current.mousePosition) &&
+ currentFolder.parent != null)
+ {
+ nextEntry = currentFolder.parent;
+ Event.current.Use();
+ }
+ }
+
+ var normal = new GUIStyle(GUI.skin.label);
+ normal.padding.left = 14;
+ var hover = new GUIStyle(normal);
+ hover.normal.background = hoverIcon;
+
+ scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false);
+
+ for (int i = 0; i < filteredEntries.Count; i++)
+ {
+ var entry = filteredEntries[i];
+ var content = new GUIContent(entry.name);
+ var rect = EditorGUILayout.GetControlRect();
+ if ((rect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseMove) || i == lastHover)
+ {
+ lastHover = i;
+
+ GUI.Label(rect, content, hover);
+ if (rect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown)
+ {
+ nextEntry = entry;
+ }
+ }
+ else
+ {
+ GUI.Label(rect, content, normal);
+ }
+
+ Rect textureRect = rect;
+ textureRect.x = textureRect.width - arrowIcon.width;
+ textureRect.width = arrowIcon.width;
+ GUI.DrawTexture(textureRect, arrowIcon);
+
+ if (Event.current.type == EventType.Repaint)
+ {
+ entry.rect = rect;
+ }
+ }
+ EditorGUILayout.EndScrollView();
+
+ if (Event.current.type == EventType.Repaint)
+ {
+ scrollRect = GUILayoutUtility.GetLastRect();
+ }
+
+ if (currentFolder != nextEntry)
+ {
+ lastHover = 0;
+ currentFolder = nextEntry;
+ UpdateTextFromList();
+ Repaint();
+ }
+
+ if (updateEventPath)
+ {
+ UpdateListFromText();
+ }
+
+ if (Event.current.type == EventType.MouseMove)
+ {
+ Repaint();
+ }
+ }
+
+ private void CreateEventInStudio()
+ {
+ string eventGuid = EditorUtils.CreateStudioEvent(eventFolder, eventName);
+
+ if (!string.IsNullOrEmpty(eventGuid))
+ {
+ EditorUtils.GetScriptOutput(String.Format("studio.project.lookup(\"{0}\").relationships.banks.add(studio.project.lookup(\"{1}\"));", eventGuid, banks[selectedBank].guid));
+ EditorUtils.GetScriptOutput("studio.project.build();");
+
+ if (!eventFolder.EndsWith("/"))
+ {
+ eventFolder += "/";
+ }
+
+ string fullPath = "event:" + eventFolder + eventName;
+ outputProperty.SetEventReference(FMOD.GUID.Parse(eventGuid), fullPath);
+ EditorUtils.UpdateParamsOnEmitter(outputProperty.serializedObject, fullPath);
+ outputProperty.serializedObject.ApplyModifiedProperties();
+ }
+ }
+
+ private void UpdateListFromText()
+ {
+ int endFolders = eventFolder.LastIndexOf("/");
+ currentFilter = eventFolder.Substring(endFolders + 1);
+
+ var folders = eventFolder.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+ FolderEntry entry = rootFolder;
+ int i;
+ for (i = 0; i < folders.Length; i++)
+ {
+ var newEntry = entry.entries.Find((x) => x.name.Equals(folders[i], StringComparison.CurrentCultureIgnoreCase));
+ if (newEntry == null)
+ {
+ break;
+ }
+ entry = newEntry;
+ }
+ currentFolder = entry;
+
+ // Treat an exact filter match as being in that folder and clear the filter
+ if (entry.name != null && entry.name.Equals(currentFilter, StringComparison.CurrentCultureIgnoreCase))
+ {
+ currentFilter = "";
+ }
+ }
+
+ private void UpdateTextFromList()
+ {
+ string path = "";
+ var entry = currentFolder;
+ while (entry.parent != null)
+ {
+ path = entry.name + "/" + path;
+ entry = entry.parent;
+ }
+
+ eventFolder = "/" + path;
+ resetCursor = true;
+ currentFilter = "";
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs.meta b/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs.meta
new file mode 100644
index 00000000..10b10096
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/CreateEventPopup.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9c9773a32ed4a2b429fd42645175c32b
+timeCreated: 1455063674
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs b/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs
new file mode 100644
index 00000000..3c82ca95
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+namespace FMODUnity
+{
+ public class EditorBankRef : ScriptableObject
+ {
+ [SerializeField]
+ public string Path;
+
+ [SerializeField]
+ public string Name;
+
+ [SerializeField]
+ public string StudioPath;
+
+ [SerializeField]
+ private Int64 lastModified;
+
+ [SerializeField]
+ public List FileSizes;
+
+ public bool Exists;
+
+ public DateTime LastModified
+ {
+ get { return new DateTime(lastModified); }
+ set { lastModified = value.Ticks; }
+ }
+
+ public static string CalculateName(string filePath, string basePath)
+ {
+ string relativePath = filePath.Substring(basePath.Length + 1);
+ string extension = System.IO.Path.GetExtension(relativePath);
+
+ string name = relativePath.Substring(0, relativePath.Length - extension.Length);
+ name = RuntimeUtils.GetCommonPlatformPath(name);
+
+ return name;
+ }
+
+ public void SetPath(string filePath, string basePath)
+ {
+ Path = RuntimeUtils.GetCommonPlatformPath(filePath);
+ Name = CalculateName(filePath, basePath);
+ base.name = "bank:/" + Name + System.IO.Path.GetExtension(filePath);
+ }
+
+ public void SetStudioPath(string studioPath)
+ {
+ string stringCmp;
+ stringCmp = System.IO.Path.GetFileName(Name);
+ if (!studioPath.Contains(stringCmp))
+ {
+ // No match means localization
+ studioPath = studioPath.Substring(0, studioPath.LastIndexOf("/") + 1);
+ studioPath += stringCmp;
+ }
+ StudioPath = studioPath;
+ }
+
+ [Serializable]
+ public class NameValuePair
+ {
+ public string Name;
+ public long Value;
+
+ public NameValuePair(string name, long value)
+ {
+ Name = name;
+ Value = value;
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs.meta b/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs.meta
new file mode 100644
index 00000000..6773b8b1
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorBankRef.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c18180ecb35941f4682ae60107b85b7c
+timeCreated: 1432775088
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs b/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs
new file mode 100644
index 00000000..406d95d0
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEditor;
+
+namespace FMODUnity
+{
+ public class EditorEventRef : ScriptableObject
+ {
+ [SerializeField]
+ public string Path;
+
+ [SerializeField]
+ public FMOD.GUID Guid;
+
+ [SerializeField]
+ public List Banks;
+ [SerializeField]
+ public bool IsStream;
+ [SerializeField]
+ public bool Is3D;
+ [SerializeField]
+ public bool IsOneShot;
+ [SerializeField]
+ public List Parameters;
+ [SerializeField]
+ public float MinDistance;
+ [SerializeField]
+ public float MaxDistance;
+ [SerializeField]
+ public int Length;
+
+ public List LocalParameters
+ {
+ get { return Parameters.Where(p => p.IsGlobal == false).OrderBy(p => p.Name).ToList(); }
+ }
+
+ public List GlobalParameters
+ {
+ get { return Parameters.Where(p => p.IsGlobal == true).OrderBy(p => p.Name).ToList(); }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs.meta b/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs.meta
new file mode 100644
index 00000000..81521cc1
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorEventRef.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ceb653cd98e289a4e8697a1af55201f2
+timeCreated: 1432775088
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs b/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs
new file mode 100644
index 00000000..c1bc821e
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEditor;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ public enum ParameterType
+ {
+ Continuous,
+ Discrete,
+ Labeled,
+ }
+
+ public class EditorParamRef : ScriptableObject
+ {
+ [SerializeField]
+ public string Name;
+ [SerializeField]
+ public string StudioPath;
+ [SerializeField]
+ public float Min;
+ [SerializeField]
+ public float Max;
+ [SerializeField]
+ public float Default;
+ [SerializeField]
+ public ParameterID ID;
+ [SerializeField]
+ public ParameterType Type;
+ [SerializeField]
+ public bool IsGlobal;
+ [SerializeField]
+ public string[] Labels = { };
+
+ public bool Exists;
+
+ [Serializable]
+ public struct ParameterID
+ {
+ public static implicit operator ParameterID(FMOD.Studio.PARAMETER_ID source)
+ {
+ return new ParameterID {
+ data1 = source.data1,
+ data2 = source.data2,
+ };
+ }
+
+ public static implicit operator FMOD.Studio.PARAMETER_ID(ParameterID source)
+ {
+ return new FMOD.Studio.PARAMETER_ID {
+ data1 = source.data1,
+ data2 = source.data2,
+ };
+ }
+
+ public bool Equals(FMOD.Studio.PARAMETER_ID other)
+ {
+ return data1 == other.data1 && data2 == other.data2;
+ }
+
+ public uint data1;
+ public uint data2;
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs.meta b/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs.meta
new file mode 100644
index 00000000..aa123d2a
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorParamRef.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fecb8ef7f94ca804a8ab72049b86782e
+timeCreated: 1432775088
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs b/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs
new file mode 100644
index 00000000..73c4d153
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs
@@ -0,0 +1,709 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using UnityEditor;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ [InitializeOnLoad]
+ public class EditorSettings : IEditorSettings
+ {
+ static EditorSettings()
+ {
+ Settings.EditorSettings = new EditorSettings();
+ }
+
+ public const string DownloadURL = "https://www.fmod.com/download";
+
+ // This is used to find the platform that implements the current Unity build target.
+ private Dictionary PlatformForBuildTarget = new Dictionary();
+
+ private static string FMODFolderFull => RuntimeUtils.PluginBasePath;
+
+ private const string CacheFolderName = "Cache";
+ private static string CacheFolderRelative => $"{RuntimeUtils.PluginBasePath}/{CacheFolderName}";
+ private static string CacheFolderFull => $"{FMODFolderFull}/{CacheFolderName}";
+
+ private const string RegisterStaticPluginsFile = "RegisterStaticPlugins.cs";
+ private static string RegisterStaticPluginsAssetPathRelative => $"{CacheFolderRelative}/{RegisterStaticPluginsFile}";
+ private static string RegisterStaticPluginsAssetPathFull => $"{CacheFolderFull}/{RegisterStaticPluginsFile}";
+
+ [NonSerialized]
+ private Dictionary binaryCompatibilitiesBeforeBuild;
+
+ public static EditorSettings Instance
+ {
+ get
+ {
+ return Settings.EditorSettings as EditorSettings;
+ }
+ }
+
+ public Settings RuntimeSettings { get; set; }
+
+ [MenuItem("FMOD/Edit Settings", priority = 0)]
+ public static void EditSettings()
+ {
+ Selection.activeObject = Settings.Instance;
+ EditorApplication.ExecuteMenuItem("Window/General/Inspector");
+ }
+
+ public void Clear()
+ {
+ PlatformForBuildTarget.Clear();
+ binaryCompatibilitiesBeforeBuild = null;
+ }
+
+ public void CreateSettingsAsset(string assetName)
+ {
+ string resourcesPath = $"{FMODFolderFull}/Resources";
+
+ bool inPackagesFolder = resourcesPath.StartsWith("Packages/");
+ if (inPackagesFolder)
+ {
+ resourcesPath = "Assets/Plugins/FMOD/Resources";
+ }
+ EditorUtils.EnsureFolderExists(resourcesPath);
+ AssetDatabase.CreateAsset(RuntimeSettings, $"{resourcesPath}/{assetName}.asset");
+
+ AddPlatformsToAsset();
+ }
+
+ public void AddPlatformForBuildTargets(Platform platform)
+ {
+ foreach (BuildTarget buildTarget in platform.GetBuildTargets())
+ {
+ if (buildTarget != BuildTarget.NoTarget)
+ {
+ try
+ {
+ PlatformForBuildTarget.Add(buildTarget, platform);
+ }
+ catch (Exception e)
+ {
+ RuntimeUtils.DebugLogWarningFormat("FMOD: Error platform {0} already added to build targets. : {1}", buildTarget, e.Message);
+ }
+ }
+ }
+ }
+
+ // Adds a new platform group to the set of platforms.
+ public PlatformGroup AddPlatformGroup(string displayName, int sortOrder)
+ {
+ PlatformGroup group = PlatformGroup.Create(displayName, Legacy.Platform.None);
+ group.DisplaySortOrder = sortOrder;
+
+ RuntimeSettings.AddPlatform(group);
+ AssetDatabase.AddObjectToAsset(group, RuntimeSettings);
+
+ RuntimeSettings.LinkPlatform(group);
+
+ return group;
+ }
+
+ private void ClearPlatformSettings()
+ {
+ RemovePlatformFromAsset(RuntimeSettings.DefaultPlatform);
+ RemovePlatformFromAsset(RuntimeSettings.PlayInEditorPlatform);
+
+ RuntimeSettings.Platforms.ForEach(RemovePlatformFromAsset);
+
+ foreach (Platform platform in Resources.LoadAll(Settings.SettingsAssetName))
+ {
+ RemovePlatformFromAsset(platform);
+ }
+
+ RuntimeSettings.DefaultPlatform = null;
+ RuntimeSettings.PlayInEditorPlatform = null;
+
+ RuntimeSettings.Platforms.Clear();
+ PlatformForBuildTarget.Clear();
+ RuntimeSettings.PlatformForRuntimePlatform.Clear();
+ }
+
+ // Testing function: Resets all platform settings.
+ public void ResetPlatformSettings()
+ {
+ ClearPlatformSettings();
+ RuntimeSettings.OnEnable();
+ }
+
+ // Testing function: Reimports legacy platform settings.
+ public void ReimportLegacyPlatforms()
+ {
+ ClearPlatformSettings();
+ RuntimeSettings.MigratedPlatforms.Clear();
+ RuntimeSettings.OnEnable();
+ }
+
+ public void UpdateMigratedPlatform(Platform platform)
+ {
+ if (!RuntimeSettings.MigratedPlatforms.Contains(platform.LegacyIdentifier))
+ {
+ RuntimeSettings.MigratedPlatforms.Add(platform.LegacyIdentifier);
+ }
+ }
+
+ // Adds any missing platforms:
+ // * From the template collection
+ // * From the legacy settings
+ public void AddMissingPlatforms()
+ {
+ var newPlatforms = new List();
+
+ foreach (Settings.PlatformTemplate template in Settings.PlatformTemplates)
+ {
+ if (!RuntimeSettings.PlatformExists(template.Identifier))
+ {
+ newPlatforms.Add(template.CreateInstance());
+ }
+ }
+
+ // Ensure that the default platform exists
+ if (!RuntimeSettings.DefaultPlatform)
+ {
+ RuntimeSettings.DefaultPlatform = ScriptableObject.CreateInstance();
+ newPlatforms.Add(RuntimeSettings.DefaultPlatform);
+ }
+
+ // Ensure that the Play In Editor platform exists
+ if (!RuntimeSettings.PlayInEditorPlatform)
+ {
+ RuntimeSettings.PlayInEditorPlatform = ScriptableObject.CreateInstance();
+ newPlatforms.Add(RuntimeSettings.PlayInEditorPlatform);
+ }
+
+ // Ensure that the default and Play In Editor platforms have properties
+ AffirmPlatformProperties(RuntimeSettings.DefaultPlatform);
+ AffirmPlatformProperties(RuntimeSettings.PlayInEditorPlatform);
+
+ // Migrate plugins if necessary
+ var PluginsProperty = Platform.PropertyAccessors.Plugins;
+
+ if (!RuntimeSettings.MigratedPlatforms.Contains(RuntimeSettings.DefaultPlatform.LegacyIdentifier))
+ {
+ PluginsProperty.Set(RuntimeSettings.DefaultPlatform, RuntimeSettings.Plugins);
+ }
+ else if (!PluginsProperty.HasValue(RuntimeSettings.DefaultPlatform))
+ {
+ PluginsProperty.Set(RuntimeSettings.DefaultPlatform, new List());
+ }
+
+ // Migrate LiveUpdatePort
+ if (!Platform.PropertyAccessors.LiveUpdatePort.HasValue(RuntimeSettings.DefaultPlatform))
+ {
+ Platform.PropertyAccessors.LiveUpdatePort.Set(RuntimeSettings.DefaultPlatform, RuntimeSettings.LiveUpdatePort);
+ }
+
+ // Create a map for migrating legacy settings
+ var platformMap = new Dictionary();
+
+ foreach (Platform platform in RuntimeSettings.Platforms.Concat(newPlatforms))
+ {
+ if (platform.LegacyIdentifier != Legacy.Platform.None)
+ {
+ platformMap.Add(platform.LegacyIdentifier, platform);
+ }
+ }
+
+ Func AffirmPlatform = null;
+
+ // Ensures that all of the platform's ancestors exist.
+ Action AffirmAncestors = (platform) =>
+ {
+ Legacy.Platform legacyParent = Legacy.Parent(platform.LegacyIdentifier);
+
+ if (legacyParent != Legacy.Platform.None)
+ {
+ platform.ParentIdentifier = AffirmPlatform(legacyParent).Identifier;
+ }
+ };
+
+ // Gets the platform corresponding to legacyPlatform (or creates it if it is a group),
+ // and ensures that it has properties and all of its ancestors exist.
+ // Returns null if legacyPlatform is unknown.
+ AffirmPlatform = (legacyPlatform) =>
+ {
+ Platform platform;
+
+ if (platformMap.TryGetValue(legacyPlatform, out platform))
+ {
+ platform.AffirmProperties();
+ }
+ else if (Legacy.IsGroup(legacyPlatform))
+ {
+ PlatformGroup group = PlatformGroup.Create(Legacy.DisplayName(legacyPlatform), legacyPlatform);
+ platformMap.Add(legacyPlatform, group);
+ newPlatforms.Add(group);
+
+ platform = group;
+ }
+ else
+ {
+ // This is an unknown platform
+ return null;
+ }
+
+ AffirmAncestors(platform);
+
+ return platform;
+ };
+
+ // Gets the target plaform to use when migrating settings from legacyPlatform.
+ // Returns null if legacyPlatform is unknown or has already been migrated.
+ Func getMigrationTarget = (legacyPlatform) =>
+ {
+ if (RuntimeSettings.MigratedPlatforms.Contains(legacyPlatform))
+ {
+ // Already migrated
+ return null;
+ }
+
+ return AffirmPlatform(legacyPlatform);
+ };
+
+ var speakerModeSettings = RuntimeSettings.SpeakerModeSettings.ConvertAll(
+ setting => new Legacy.PlatformSetting()
+ {
+ Value = (FMOD.SPEAKERMODE)setting.Value,
+ Platform = setting.Platform
+ }
+ );
+
+ // Migrate all the legacy settings, creating platforms as we need them via AffirmPlatform
+ MigrateLegacyPlatforms(speakerModeSettings, Platform.PropertyAccessors.SpeakerMode, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.SampleRateSettings, Platform.PropertyAccessors.SampleRate, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.LiveUpdateSettings, Platform.PropertyAccessors.LiveUpdate, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.OverlaySettings, Platform.PropertyAccessors.Overlay, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.BankDirectorySettings, Platform.PropertyAccessors.BuildDirectory, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.VirtualChannelSettings, Platform.PropertyAccessors.VirtualChannelCount, getMigrationTarget);
+ MigrateLegacyPlatforms(RuntimeSettings.RealChannelSettings, Platform.PropertyAccessors.RealChannelCount, getMigrationTarget);
+
+ // Now we ensure that if a legacy group has settings, all of its descendants exist
+ // and inherit from it (even if they have no settings of their own), so that the
+ // inheritance structure matches the old system.
+ // We look at all groups (not just newly created ones), because a newly created platform
+ // may need to inherit from a preexisting group.
+ var groupsToProcess = new Queue(platformMap.Values.Where(
+ platform => platform is PlatformGroup
+ && platform.LegacyIdentifier != Legacy.Platform.None
+ && platform.HasAnyOverriddenProperties));
+
+ while (groupsToProcess.Count > 0)
+ {
+ Platform group = groupsToProcess.Dequeue();
+
+ // Ensure that all descendants exist
+ foreach (var child in platformMap.Values)
+ {
+ if (child.Active)
+ {
+ // Don't overwrite existing settings
+ continue;
+ }
+
+ var legacyPlatform = child.LegacyIdentifier;
+
+ if (legacyPlatform == Legacy.Platform.iOS || legacyPlatform == Legacy.Platform.Android)
+ {
+ // These platforms were overridden by MobileHigh and MobileLow in the old system
+ continue;
+ }
+
+ if (RuntimeSettings.MigratedPlatforms.Contains(legacyPlatform))
+ {
+ // The user may have deleted this platform since migration, so don't mess with it
+ continue;
+ }
+
+ if (Legacy.Parent(legacyPlatform) == group.LegacyIdentifier)
+ {
+ child.AffirmProperties();
+ child.ParentIdentifier = group.Identifier;
+
+ if (child is PlatformGroup)
+ {
+ groupsToProcess.Enqueue(child as PlatformGroup);
+ }
+ }
+ }
+ }
+
+ // Add all of the new platforms to the set of known platforms
+ foreach (Platform platform in newPlatforms)
+ {
+ RuntimeSettings.AddPlatform(platform);
+ }
+
+ RuntimeSettings.Platforms.ForEach(UpdateMigratedPlatform);
+ }
+
+ private void MigrateLegacyPlatforms(List settings,
+ Platform.PropertyAccessor property, Func getMigrationTarget)
+ where TSetting : Legacy.PlatformSetting
+ {
+ foreach (TSetting setting in settings)
+ {
+ Platform platform = getMigrationTarget(setting.Platform);
+
+ if (platform != null)
+ {
+ property.Set(platform, setting.Value);
+ }
+ }
+ }
+
+ // The platform that implements the current Unity build target.
+ public Platform CurrentEditorPlatform
+ {
+ get
+ {
+ return GetPlatform(EditorUserBuildSettings.activeBuildTarget);
+ }
+ }
+
+ public Platform GetPlatform(BuildTarget buildTarget)
+ {
+ if (PlatformForBuildTarget.ContainsKey(buildTarget))
+ {
+ return PlatformForBuildTarget[buildTarget];
+ }
+ else
+ {
+ return RuntimeSettings.DefaultPlatform;
+ }
+ }
+
+ public void SetPlatformParent(Platform platform, Platform newParent)
+ {
+ Platform oldParent = RuntimeSettings.FindPlatform(platform.ParentIdentifier);
+
+ if (oldParent != null)
+ {
+ oldParent.ChildIdentifiers.Remove(platform.Identifier);
+ }
+
+ if (newParent != null)
+ {
+ platform.ParentIdentifier = newParent.Identifier;
+
+ newParent.ChildIdentifiers.Add(platform.Identifier);
+ SortPlatformChildren(newParent);
+ }
+ else
+ {
+ platform.ParentIdentifier = null;
+ }
+ }
+
+ public void SetPlatformSortOrder(Platform platform, float sortOrder)
+ {
+ if (platform.DisplaySortOrder != sortOrder)
+ {
+ platform.DisplaySortOrder = sortOrder;
+
+ if (platform.Parent != null)
+ {
+ SortPlatformChildren(platform.Parent);
+ }
+ }
+ }
+
+ public void SortPlatformChildren(Platform platform)
+ {
+ platform.ChildIdentifiers.Sort((a, b) => {
+ Platform platformA = RuntimeSettings.FindPlatform(a);
+ Platform platformB = RuntimeSettings.FindPlatform(b);
+
+ return platformA.DisplaySortOrder.CompareTo(platformB.DisplaySortOrder);
+ });
+ }
+
+ // Ensures that the given platform has valid properties.
+ private void AffirmPlatformProperties(Platform platform)
+ {
+ if (!platform.Active)
+ {
+ RuntimeUtils.DebugLogFormat("[FMOD] Cannot find properties for platform {0}, creating default properties", platform.Identifier);
+ RuntimeSettings.AddPlatformProperties(platform);
+ }
+ }
+
+ private void RemovePlatformFromAsset(Platform platform)
+ {
+ if (AssetDatabase.Contains(platform))
+ {
+ UnityEngine.Object.DestroyImmediate(platform, true);
+ }
+ }
+
+ public bool CanBuildTarget(BuildTarget target, Platform.BinaryType binaryType, out string error)
+ {
+ if (Settings.Instance == null)
+ {
+ error = "Settings instance has not been initialized. Unable to continue build.";
+ return false;
+ }
+
+ Platform platform;
+
+ if (!PlatformForBuildTarget.TryGetValue(target, out platform))
+ {
+ error = string.Format("No FMOD platform found for build target {0}. " +
+ "You may need to install a platform specific integration package from {1}.",
+ target, DownloadURL);
+ return false;
+ }
+
+ IEnumerable missingPathsQuery = platform.GetBinaryFilePaths(target, binaryType)
+ .Where(path => !File.Exists(path) && !Directory.Exists(path));
+
+ if (missingPathsQuery.Any())
+ {
+ string[] missingPaths = missingPathsQuery.Select(path => "- " + path).ToArray();
+
+ string summary;
+
+ if (missingPaths.Length == 1)
+ {
+ summary = string.Format("There is an FMOD binary missing for build target {0}", target);
+ }
+ else
+ {
+ summary = string.Format("There are {0} FMOD binaries missing for build target {1}",
+ missingPaths.Length, target);
+ }
+
+ if (binaryType == Platform.BinaryType.Logging)
+ {
+ summary += " (development build)";
+ }
+
+ error = string.Format(
+ "{0}:\n" +
+ "{1}\n" +
+ "Please run the {2} menu command.\n",
+ summary, string.Join("\n", missingPaths), FileReorganizer.ReorganizerMenuItemPath);
+ return false;
+ }
+
+ error = null;
+ return true;
+ }
+
+ public void PreprocessBuild(BuildTarget target, Platform.BinaryType binaryType)
+ {
+ Platform platform = PlatformForBuildTarget[target];
+
+ PreprocessStaticPlugins(platform, target);
+
+ SelectBinaries(platform, target, binaryType);
+ }
+
+ private void PostprocessBuild(BuildTarget target)
+ {
+ foreach(string path in binaryCompatibilitiesBeforeBuild.Keys)
+ {
+ PluginImporter importer = AssetImporter.GetAtPath(path) as PluginImporter;
+
+ if (importer != null)
+ {
+ importer.SetCompatibleWithPlatform(target, binaryCompatibilitiesBeforeBuild[path]);
+ }
+ }
+ }
+
+ private void PreprocessStaticPlugins(Platform platform, BuildTarget target)
+ {
+ // Ensure we don't have leftover temporary changes from a previous build.
+ CleanTemporaryFiles();
+
+ BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(target);
+ NamedBuildTarget namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
+ ScriptingImplementation scriptingBackend = PlayerSettings.GetScriptingBackend(namedBuildTarget);
+
+ if (platform.StaticPlugins.Count > 0)
+ {
+ if (scriptingBackend == ScriptingImplementation.IL2CPP)
+ {
+ Action reportError = message => {
+ RuntimeUtils.DebugLogWarningFormat("FMOD: Error processing static plugins for platform {0}: {1}",
+ platform.DisplayName, message);
+ };
+
+ if (!AssetDatabase.IsValidFolder(CacheFolderFull))
+ {
+ RuntimeUtils.DebugLogFormat("Creating {0}", CacheFolderFull);
+ AssetDatabase.CreateFolder(FMODFolderFull, CacheFolderName);
+ }
+
+ // Generate registration code and import it so it's included in the build.
+ RuntimeUtils.DebugLogFormat("FMOD: Generating static plugin registration code in {0}", RegisterStaticPluginsAssetPathFull);
+
+ string filePath = RegisterStaticPluginsAssetPathRelative.Replace("Assets", Application.dataPath);
+ CodeGeneration.GenerateStaticPluginRegistration(filePath, platform, reportError);
+ AssetDatabase.ImportAsset(RegisterStaticPluginsAssetPathFull);
+ }
+ else
+ {
+ RuntimeUtils.DebugLogWarningFormat(
+ "FMOD: Platform {0} has {1} static plugins specified, " +
+ "but static plugins are only supported on the IL2CPP scripting backend",
+ platform.DisplayName, platform.StaticPlugins.Count);
+ }
+ }
+ }
+
+ public void CleanTemporaryFiles()
+ {
+ DeleteTemporaryFile(RegisterStaticPluginsAssetPathFull);
+ }
+
+ public void DeleteTemporaryFile(string assetPath)
+ {
+ bool assetExists = !string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(assetPath));
+
+ if (assetExists && AssetDatabase.DeleteAsset(assetPath))
+ {
+ RuntimeUtils.DebugLogFormat("FMOD: Removed temporary file {0}", assetPath);
+ }
+ }
+
+ private static void SelectBinaries(Platform platform, BuildTarget target, Platform.BinaryType binaryType)
+ {
+ string message = string.Format("FMOD: Selected binaries for platform {0}{1}:", target,
+ (binaryType == Platform.BinaryType.Logging) ? " (development build)" : string.Empty);
+
+ Instance.binaryCompatibilitiesBeforeBuild = new Dictionary();
+
+ HashSet enabledPaths = new HashSet();
+
+ foreach (string path in platform.GetBinaryAssetPaths(target, binaryType | Platform.BinaryType.Optional))
+ {
+ PluginImporter importer = AssetImporter.GetAtPath(path) as PluginImporter;
+
+ if (importer is PluginImporter)
+ {
+ Instance.binaryCompatibilitiesBeforeBuild.Add(path, importer.GetCompatibleWithPlatform(target));
+
+ importer.SetCompatibleWithPlatform(target, true);
+
+ enabledPaths.Add(path);
+
+ message += string.Format("\n- Enabled {0}", path);
+ }
+ }
+
+ foreach (string path in platform.GetBinaryAssetPaths(target, Platform.BinaryType.All))
+ {
+ if (!enabledPaths.Contains(path))
+ {
+ PluginImporter importer = AssetImporter.GetAtPath(path) as PluginImporter;
+
+ if (importer is PluginImporter)
+ {
+ Instance.binaryCompatibilitiesBeforeBuild.Add(path, importer.GetCompatibleWithPlatform(target));
+
+ importer.SetCompatibleWithPlatform(target, false);
+
+ message += string.Format("\n- Disabled {0}", path);
+ }
+ }
+ }
+
+ RuntimeUtils.DebugLog(message);
+ }
+
+ public bool ForceLoggingBinaries { get; set; } = false;
+
+ public class BuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
+ {
+ public int callbackOrder { get { return 0; } }
+
+ public void OnPreprocessBuild(BuildReport report)
+ {
+ Platform.BinaryType binaryType;
+
+ if ((report.summary.options & BuildOptions.Development) == BuildOptions.Development
+ || EditorSettings.Instance.ForceLoggingBinaries)
+ {
+ binaryType = Platform.BinaryType.Logging;
+ }
+ else
+ {
+ binaryType = Platform.BinaryType.Release;
+ }
+
+ string error;
+ if (!EditorSettings.Instance.CanBuildTarget(report.summary.platform, binaryType, out error))
+ {
+ throw new BuildFailedException(error);
+ }
+
+ bool androidPatchBuildPrevious = Settings.Instance.AndroidPatchBuild;
+ if ((report.summary.options & BuildOptions.PatchPackage) == BuildOptions.PatchPackage)
+ {
+ Settings.Instance.AndroidPatchBuild = true;
+ }
+ else
+ {
+ Settings.Instance.AndroidPatchBuild = false;
+ }
+ if (androidPatchBuildPrevious != Settings.Instance.AndroidPatchBuild)
+ {
+ EditorUtility.SetDirty(Settings.Instance);
+ }
+
+ EditorSettings.Instance.PreprocessBuild(report.summary.platform, binaryType);
+ }
+
+ public void OnPostprocessBuild(BuildReport report)
+ {
+ Instance.PostprocessBuild(report.summary.platform);
+ Settings.Instance.AndroidPatchBuild = false;
+ }
+ }
+
+ public void CheckActiveBuildTarget()
+ {
+ Settings.EditorSettings.CleanTemporaryFiles();
+
+ Platform.BinaryType binaryType = EditorUserBuildSettings.development
+ ? Platform.BinaryType.Logging
+ : Platform.BinaryType.Release;
+
+ string error;
+ if (!CanBuildTarget(EditorUserBuildSettings.activeBuildTarget, binaryType, out error))
+ {
+ RuntimeUtils.DebugLogWarning(error);
+
+ if (EditorWindow.HasOpenInstances())
+ {
+ GUIContent message =
+ new GUIContent("FMOD detected issues with this platform!\nSee the Console for details.");
+ EditorWindow.GetWindow().ShowNotification(message, 10);
+ }
+ }
+ }
+
+ // Adds all platforms to the settings asset, so they get stored in the same file as the main
+ // Settings object.
+ public void AddPlatformsToAsset()
+ {
+ RuntimeSettings.Platforms.ForEach(AddPlatformToAsset);
+ }
+
+ private void AddPlatformToAsset(Platform platform)
+ {
+ if (!AssetDatabase.Contains(platform))
+ {
+ platform.name = "FMODStudioSettingsPlatform";
+ AssetDatabase.AddObjectToAsset(platform, RuntimeSettings);
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs.meta b/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs.meta
new file mode 100644
index 00000000..33884c45
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorSettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3c9e3e2137498d343a2e31906a12dec2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs b/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs
new file mode 100644
index 00000000..bdcffac7
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs
@@ -0,0 +1,1921 @@
+#if UNITY_ADDRESSABLES_EXIST
+ // The Addressables package depends on the ScriptableBuildPipeline package
+ #define UNITY_SCRIPTABLEBUILDPIPELINE_EXIST
+#endif
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Reflection;
+using UnityEngine;
+using UnityEditor;
+using UnityEditor.Build;
+#if UNITY_SCRIPTABLEBUILDPIPELINE_EXIST
+using UnityEditor.Build.Pipeline;
+#endif
+using UnityEditor.SceneManagement;
+using System.IO;
+using System.Text;
+using System.Net.Sockets;
+
+namespace FMODUnity
+{
+ public class EditorUtils : MonoBehaviour
+ {
+ public const string BuildFolder = "Build";
+
+ private static FMOD.Studio.System system;
+ private static FMOD.SPEAKERMODE speakerMode;
+ private static string encryptionKey;
+
+ private static List loadedPreviewBanks = new List();
+ private static FMOD.Studio.EventDescription previewEventDesc;
+ private static FMOD.Studio.EventInstance previewEventInstance;
+
+ private const int StudioScriptPort = 3663;
+ private static NetworkStream networkStream = null;
+ private static StreamReader streamReader = null;
+ private static Socket socket = null;
+ private static IAsyncResult socketConnection = null;
+
+ public static void CheckResult(FMOD.RESULT result)
+ {
+ if (result != FMOD.RESULT.OK)
+ {
+ RuntimeUtils.DebugLogError(string.Format("FMOD Studio: Encountered Error: {0} {1}", result, FMOD.Error.String(result)));
+ }
+ }
+
+ public static void ValidateSource(out bool valid, out string reason)
+ {
+ valid = true;
+ reason = "";
+ var settings = Settings.Instance;
+ if (settings.HasSourceProject)
+ {
+ if (string.IsNullOrEmpty(settings.SourceProjectPath))
+ {
+ valid = false;
+ reason =L10n.Tr("The FMOD Studio project path must be set to an .fspro file.");
+ return;
+ }
+ if (!File.Exists(settings.SourceProjectPath))
+ {
+ valid = false;
+ reason = string.Format(L10n.Tr("The FMOD Studio project path '{0}' does not exist."), settings.SourceProjectPath);
+ return;
+ }
+
+ string projectPath = settings.SourceProjectPath;
+ string projectFolder = Path.GetDirectoryName(projectPath);
+ string buildFolder = RuntimeUtils.GetCommonPlatformPath(Path.Combine(projectFolder, BuildFolder));
+ if (!Directory.Exists(buildFolder) ||
+ Directory.GetDirectories(buildFolder).Length == 0 ||
+ Directory.GetFiles(Directory.GetDirectories(buildFolder)[0], "*.bank", SearchOption.AllDirectories).Length == 0
+ )
+ {
+ valid = false;
+ reason = string.Format(L10n.Tr("The FMOD Studio project '{0}' does not contain any built banks. Please build your project in FMOD Studio."), settings.SourceProjectPath);
+ return;
+ }
+ }
+ else
+ {
+ if (String.IsNullOrEmpty(settings.SourceBankPath))
+ {
+ valid = false;
+ reason = L10n.Tr("The build path has not been set.");
+ return;
+ }
+ if (!Directory.Exists(settings.SourceBankPath))
+ {
+ valid = false;
+ reason = string.Format(L10n.Tr("The build path '{0}' does not exist."), settings.SourceBankPath);
+ return;
+ }
+
+ if (settings.HasPlatforms)
+ {
+ if (Directory.GetDirectories(settings.SourceBankPath).Length == 0)
+ {
+ valid = false;
+ reason = string.Format(L10n.Tr("Build path '{0}' does not contain any platform sub-directories. Please check that the build path is correct."), settings.SourceBankPath);
+ return;
+ }
+ }
+ else
+ {
+ if (Directory.GetFiles(settings.SourceBankPath, "*.strings.bank").Length == 0)
+ {
+ valid = false;
+ reason = string.Format(L10n.Tr("Build path '{0}' does not contain any built banks."), settings.SourceBankPath);
+ return;
+ }
+ }
+ }
+ }
+
+ public static string[] GetBankPlatforms()
+ {
+ string buildFolder = Settings.Instance.SourceBankPath;
+ try
+ {
+ if (Directory.GetFiles(buildFolder, "*.bank").Length == 0)
+ {
+ string[] buildDirectories = Directory.GetDirectories(buildFolder);
+ string[] buildNames = new string[buildDirectories.Length];
+ for (int i = 0; i < buildDirectories.Length; i++)
+ {
+ buildNames[i] = Path.GetFileNameWithoutExtension(buildDirectories[i]);
+ }
+ return buildNames;
+ }
+ }
+ catch
+ {
+ }
+ return new string[0];
+ }
+
+ public static string VersionString(uint version)
+ {
+ uint major = (version & 0x00FF0000) >> 16;
+ uint minor = (version & 0x0000FF00) >> 8;
+ uint patch = (version & 0x000000FF);
+
+ return string.Format("{0:X1}.{1:X2}.{2:X2}", major, minor, patch);
+ }
+
+ public static string DurationString(float seconds)
+ {
+ float minutes = seconds / 60;
+ float hours = minutes / 60;
+
+ if (hours >= 1)
+ {
+ return Pluralize(Mathf.FloorToInt(hours), L10n.Tr("hour"), L10n.Tr("hours"));
+ }
+ else if (minutes >= 1)
+ {
+ return Pluralize(Mathf.FloorToInt(minutes), L10n.Tr("minute"), L10n.Tr("minutes"));
+ }
+ else if (seconds >= 1)
+ {
+ return Pluralize(Mathf.FloorToInt(seconds), L10n.Tr("second"), L10n.Tr("seconds"));
+ }
+ else
+ {
+ return L10n.Tr("a moment");
+ }
+ }
+
+ public static string SeriesString(string separator, string finalSeparator, IEnumerable elements)
+ {
+ if (!elements.Any())
+ {
+ return string.Empty;
+ }
+ else if (!elements.Skip(1).Any())
+ {
+ return elements.First();
+ }
+ else
+ {
+ return string.Join(separator, elements.Take(elements.Count() - 1)) + finalSeparator + elements.Last();
+ }
+ }
+
+ public static string Pluralize(int count, string singular, string plural)
+ {
+ return string.Format("{0} {1}", count, (count == 1) ? singular : plural);
+ }
+
+ public static Texture2D LoadImage(string filename)
+ {
+ Texture2D texture = EditorGUIUtility.Load($"{RuntimeUtils.PluginBasePath}/images/{filename}") as Texture2D;
+
+ if (texture == null)
+ {
+ texture = EditorGUIUtility.Load($"Assets/Editor Default Resources/FMOD/{filename}") as Texture2D;
+ }
+
+ return texture;
+ }
+
+ public static string GameObjectPath(Component component, GameObject root = null)
+ {
+ Transform transform = component.transform;
+
+ StringBuilder objectPath = new StringBuilder();
+
+ while(transform != null && transform.gameObject != root)
+ {
+ if (objectPath.Length > 0)
+ {
+ objectPath.Insert(0, "/");
+ }
+
+ objectPath.Insert(0, transform.name);
+
+ transform = transform.parent;
+ }
+
+ return objectPath.ToString();
+ }
+
+ public static bool HasAttribute(MemberInfo member)
+ where T : Attribute
+ {
+ Attribute[] attributes = Attribute.GetCustomAttributes(member, typeof(Attribute), true);
+
+ return attributes.Any(a => typeof(T).IsAssignableFrom(a.GetType()));
+ }
+
+ public static bool AssetExists(string path)
+ {
+ string fullPath = $"{Environment.CurrentDirectory}/{path}";
+
+ // We check that the file or directory exists as well because recently deleted assets remain in the database
+ return !string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(path))
+ && (File.Exists(fullPath) || Directory.Exists(fullPath));
+ }
+
+ public static void EnsureFolderExists(string folderPath)
+ {
+ if (!AssetDatabase.IsValidFolder(folderPath))
+ {
+ string parentFolder = GetParentFolder(folderPath);
+
+ EnsureFolderExists(parentFolder);
+
+ string folderName = Path.GetFileName(folderPath);
+
+ AssetDatabase.CreateFolder(parentFolder, folderName);
+ }
+ }
+
+ // Path.GetDirectoryName replaces '/' with '\\' in some scripting runtime versions,
+ // so we have to roll our own.
+ public static string GetParentFolder(string assetPath)
+ {
+ int endIndex = assetPath.LastIndexOf('/');
+
+ return (endIndex > 0) ? assetPath.Substring(0, endIndex) : string.Empty;
+ }
+
+ public static void DrawLegacyEvent(SerializedProperty property, string migrationTarget)
+ {
+ // Display the legacy event field if it is not empty
+ if (!string.IsNullOrEmpty(property.stringValue))
+ {
+ EditorGUILayout.PropertyField(property, new GUIContent(L10n.Tr("Legacy Event")));
+
+ using (new EditorGUI.IndentLevelScope())
+ {
+ GUIContent content = new GUIContent(
+ string.Format(L10n.Tr("Will be migrated to {0}"), migrationTarget),
+ EditorGUIUtility.IconContent("console.infoicon.sml").image);
+ GUIStyle style = new GUIStyle(GUI.skin.label) { richText = true };
+
+ Rect rect = EditorGUILayout.GetControlRect(false, style.CalcSize(content).y);
+ rect = EditorGUI.IndentedRect(rect);
+
+ GUI.Label(rect, content, style);
+ }
+ }
+ }
+
+ // Gets a control rect, draws a help button at the end of the line,
+ // and returns a rect describing the remaining space.
+ public static Rect DrawHelpButtonLayout(Func createContent)
+ {
+ Vector2 helpSize = GetHelpButtonSize();
+
+ Rect rect = EditorGUILayout.GetControlRect(true, helpSize.y);
+
+ return DrawHelpButton(rect, createContent);
+ }
+
+ public static Rect DrawHelpButton(Rect rect, Func createContent)
+ {
+ GUIContent content;
+ GUIStyle style;
+ GetHelpButtonData(out content, out style);
+
+ Vector2 helpSize = style.CalcSize(content);
+
+ Rect helpRect = rect;
+ helpRect.xMin = helpRect.xMax - helpSize.x;
+
+ if (GUI.Button(helpRect, content, style))
+ {
+ PopupWindow.Show(helpRect, createContent());
+ }
+
+ Rect remainderRect = rect;
+ remainderRect.xMax = helpRect.xMin;
+
+ return remainderRect;
+ }
+
+ public static float DrawParameterValueLayout(float value, EditorParamRef paramRef)
+ {
+ if (paramRef.Type == ParameterType.Labeled)
+ {
+ return EditorGUILayout.Popup((int)value, paramRef.Labels);
+ }
+ else if (paramRef.Type == ParameterType.Discrete)
+ {
+ return EditorGUILayout.IntSlider((int)value, (int)paramRef.Min, (int)paramRef.Max);
+ }
+ else
+ {
+ return EditorGUILayout.Slider(value, paramRef.Min, paramRef.Max);
+ }
+ }
+
+ public static Vector2 GetHelpButtonSize()
+ {
+ GUIContent content;
+ GUIStyle style;
+ GetHelpButtonData(out content, out style);
+
+ return style.CalcSize(content);
+ }
+
+ private static void GetHelpButtonData(out GUIContent content, out GUIStyle style)
+ {
+ content = EditorGUIUtility.IconContent("_Help");
+ style = GUI.skin.label;
+ }
+
+#if !FMOD_STORE_UPLOAD
+ [InitializeOnLoadMethod]
+#endif
+ private static void Startup()
+ {
+ EditorApplication.update += Update;
+ AssemblyReloadEvents.beforeAssemblyReload += HandleBeforeAssemblyReload;
+ EditorApplication.playModeStateChanged += HandleOnPlayModeChanged;
+ EditorApplication.pauseStateChanged += HandleOnPausedModeChanged;
+
+ if (Application.isBatchMode)
+ {
+ BuildStatusWatcher.Startup();
+ }
+ else
+ {
+ EditorApplication.update += CallStartupMethodsWhenReady;
+ }
+ }
+
+ private static void HandleBeforeAssemblyReload()
+ {
+ DestroySystem();
+ }
+
+ private static void HandleOnPausedModeChanged(PauseState state)
+ {
+ if (RuntimeManager.IsInitialized && RuntimeManager.HaveMasterBanksLoaded)
+ {
+ RuntimeManager.GetBus("bus:/").setPaused(EditorApplication.isPaused);
+ RuntimeManager.StudioSystem.update();
+ }
+ }
+
+ private static void HandleOnPlayModeChanged(PlayModeStateChange state)
+ {
+ // Entering Play Mode will cause scripts to reload, losing all state
+ // This is the last chance to clean up FMOD and avoid a leak.
+ if (state == PlayModeStateChange.ExitingEditMode)
+ {
+ DestroySystem();
+ }
+ }
+
+ private static void Update()
+ {
+ // Update the editor system
+ if (system.isValid())
+ {
+ CheckResult(system.update());
+
+ if (speakerMode != Settings.Instance.PlayInEditorPlatform.SpeakerMode)
+ {
+ RecreateSystem();
+ }
+
+ if (encryptionKey != Settings.Instance.EncryptionKey)
+ {
+ RecreateSystem();
+ }
+ }
+
+ for (int i = 0; i < previewEventInstances.Count; i++)
+ {
+ var instance = previewEventInstances[i];
+ if (instance.isValid())
+ {
+ FMOD.Studio.PLAYBACK_STATE state;
+ instance.getPlaybackState(out state);
+ if (state == FMOD.Studio.PLAYBACK_STATE.STOPPED)
+ {
+ PreviewStop(instance);
+ i--;
+ }
+ }
+ }
+ }
+
+ private static void CallStartupMethodsWhenReady()
+ {
+ if (EditorApplication.isUpdating)
+ {
+ // Some startup code accesses Settings.Instance; this can obliterate settings if
+ // the asset database is being updated, so wait until the update is finished.
+ return;
+ }
+
+ EditorApplication.update -= CallStartupMethodsWhenReady;
+
+ // Explicitly initialize Settings so that both it and EditorSettings will work.
+ Settings.Initialize();
+ Settings.EditorSettings.CheckActiveBuildTarget();
+
+ CheckBaseFolderGUID();
+ CheckMacLibraries();
+
+ Legacy.CleanTemporaryChanges();
+ CleanObsoleteFiles();
+
+#if UNITY_TIMELINE_EXIST
+ // Register timeline event receivers.
+ FMODEventPlayableBehavior.Enter += (sender, args) =>
+ {
+ FMODEventPlayableBehavior behavior = sender as FMODEventPlayableBehavior;
+ if (!string.IsNullOrEmpty(behavior.EventReference.Path))
+ {
+ LoadPreviewBanks();
+ EditorEventRef eventRef = EventManager.EventFromPath(behavior.EventReference.Path);
+ Dictionary paramValues = new Dictionary();
+ foreach (EditorParamRef param in eventRef.Parameters)
+ {
+ paramValues.Add(param.Name, param.Default);
+ }
+ foreach (ParamRef param in behavior.Parameters)
+ {
+ paramValues[param.Name] = param.Value;
+ }
+
+ args.eventInstance = PreviewEvent(eventRef, paramValues, behavior.CurrentVolume, behavior.ClipStartTime);
+ }
+ };
+
+ FMODEventPlayableBehavior.Exit += (sender, args) =>
+ {
+ FMODEventPlayableBehavior behavior = sender as FMODEventPlayableBehavior;
+ if (behavior.StopType != STOP_MODE.None)
+ {
+ FMOD.Studio.STOP_MODE stopType = behavior.StopType == STOP_MODE.Immediate ? FMOD.Studio.STOP_MODE.IMMEDIATE : FMOD.Studio.STOP_MODE.ALLOWFADEOUT;
+ PreviewStop(args.eventInstance, stopType);
+ }
+ };
+
+ FMODEventPlayableBehavior.GraphStop += (sender, args) =>
+ {
+ PreviewStop(args.eventInstance);
+ };
+
+ FMODEventPlayable.OnCreatePlayable += (sender, args) =>
+ {
+ FMODEventPlayable playable = sender as FMODEventPlayable;
+ if (playable.Parameters.Length > 0 || playable.Template.ParameterLinks.Count > 0)
+ {
+ LoadPreviewBanks();
+ FMOD.Studio.EventDescription eventDescription;
+ system.getEventByID(playable.EventReference.Guid, out eventDescription);
+ playable.LinkParameters(eventDescription);
+ }
+ };
+#endif
+
+ BuildStatusWatcher.Startup();
+ BankRefresher.Startup();
+ BoltIntegration.Startup();
+ EventManager.Startup();
+ SetupWizardWindow.Startup();
+ }
+
+ private static void RecreateSystem()
+ {
+ StopAllPreviews();
+ DestroySystem();
+ CreateSystem();
+ }
+
+ private static void DestroySystem()
+ {
+ if (system.isValid())
+ {
+ RuntimeUtils.DebugLog("FMOD Studio: Destroying editor system instance");
+ UnloadPreviewBanks();
+ system.release();
+ system.clearHandle();
+ }
+ }
+
+ private static void CreateSystem()
+ {
+ RuntimeUtils.DebugLog("FMOD Studio: Creating editor system instance");
+ RuntimeUtils.EnforceLibraryOrder();
+
+ FMOD.RESULT result = FMOD.Debug.Initialize(FMOD.DEBUG_FLAGS.LOG, FMOD.DEBUG_MODE.FILE, null, "fmod_editor.log");
+ if (result != FMOD.RESULT.OK)
+ {
+ RuntimeUtils.DebugLogWarning("FMOD Studio: Cannot open fmod_editor.log. Logging will be disabled for importing and previewing");
+ }
+
+ CheckResult(FMOD.Studio.System.create(out system));
+
+ FMOD.System lowlevel;
+ CheckResult(system.getCoreSystem(out lowlevel));
+
+ // Use play-in-editor speaker mode for event browser preview and metering
+ speakerMode = Settings.Instance.PlayInEditorPlatform.SpeakerMode;
+ CheckResult(lowlevel.setSoftwareFormat(0, speakerMode, 0));
+
+ encryptionKey = Settings.Instance.EncryptionKey;
+ if (!string.IsNullOrEmpty(encryptionKey))
+ {
+ FMOD.Studio.ADVANCEDSETTINGS studioAdvancedSettings = new FMOD.Studio.ADVANCEDSETTINGS();
+ CheckResult(system.setAdvancedSettings(studioAdvancedSettings, encryptionKey));
+ }
+
+ CheckResult(system.initialize(256, FMOD.Studio.INITFLAGS.ALLOW_MISSING_PLUGINS | FMOD.Studio.INITFLAGS.SYNCHRONOUS_UPDATE, FMOD.INITFLAGS.NORMAL, IntPtr.Zero));
+
+ FMOD.ChannelGroup master;
+ CheckResult(lowlevel.getMasterChannelGroup(out master));
+ FMOD.DSP masterHead;
+ CheckResult(master.getDSP(FMOD.CHANNELCONTROL_DSP_INDEX.HEAD, out masterHead));
+ CheckResult(masterHead.setMeteringEnabled(false, true));
+ }
+
+ public static void UpdateParamsOnEmitter(SerializedObject serializedObject, string path)
+ {
+ if (string.IsNullOrEmpty(path) || EventManager.EventFromPath(path) == null)
+ {
+ return;
+ }
+
+ var eventRef = EventManager.EventFromPath(path);
+ serializedObject.ApplyModifiedProperties();
+ if (serializedObject.isEditingMultipleObjects)
+ {
+ foreach (var obj in serializedObject.targetObjects)
+ {
+ UpdateParamsOnEmitter(obj, eventRef);
+ }
+ }
+ else
+ {
+ UpdateParamsOnEmitter(serializedObject.targetObject, eventRef);
+ }
+ serializedObject.Update();
+ }
+
+ private static void UpdateParamsOnEmitter(UnityEngine.Object obj, EditorEventRef eventRef)
+ {
+ var emitter = obj as StudioEventEmitter;
+ if (emitter == null)
+ {
+ // Custom game object
+ return;
+ }
+
+ for (int i = 0; i < emitter.Params.Length; i++)
+ {
+ if (!eventRef.LocalParameters.Exists((x) => x.Name == emitter.Params[i].Name))
+ {
+ int end = emitter.Params.Length - 1;
+ emitter.Params[i] = emitter.Params[end];
+ Array.Resize(ref emitter.Params, end);
+ i--;
+ }
+ }
+
+ emitter.OverrideAttenuation = false;
+ emitter.OverrideMinDistance = eventRef.MinDistance;
+ emitter.OverrideMaxDistance = eventRef.MaxDistance;
+ }
+
+ public static FMOD.Studio.System System
+ {
+ get
+ {
+ if (!system.isValid())
+ {
+ CreateSystem();
+ }
+ return system;
+ }
+ }
+
+ [MenuItem("FMOD/Help/Getting Started", priority = 2)]
+ private static void OnlineGettingStarted()
+ {
+ OpenOnlineDocumentation("unity", "user-guide");
+ }
+
+ [MenuItem("FMOD/Help/Integration Manual", priority = 3)]
+ public static void OnlineManual()
+ {
+ OpenOnlineDocumentation("unity");
+ }
+
+ [MenuItem("FMOD/Help/API Manual", priority = 4)]
+ private static void OnlineAPIDocs()
+ {
+ OpenOnlineDocumentation("api");
+ }
+
+ [MenuItem("FMOD/Help/Support Forum", priority = 16)]
+ private static void OnlineQA()
+ {
+ Application.OpenURL("https://qa.fmod.com/");
+ }
+
+ [MenuItem("FMOD/Help/Revision History", priority = 5)]
+ private static void OnlineRevisions()
+ {
+ OpenOnlineDocumentation("api", "welcome-revision-history");
+ }
+
+ public static void OpenOnlineDocumentation(string section, string page = null, string anchor = null)
+ {
+ const string Prefix = "https://fmod.com/docs/";
+ string version = string.Format("{0:X}.{1:X}", FMOD.VERSION.number >> 16, (FMOD.VERSION.number >> 8) & 0xFF);
+ string url;
+
+ if (!string.IsNullOrEmpty(page))
+ {
+ if (!string.IsNullOrEmpty(anchor))
+ {
+ url = string.Format("{0}/{1}/{2}/{3}.html#{4}", Prefix, version, section, page, anchor);
+ }
+ else
+ {
+ url = string.Format("{0}/{1}/{2}/{3}.html", Prefix, version, section, page);
+ }
+ }
+ else
+ {
+ url = string.Format("{0}/{1}/{2}", Prefix, version, section);
+ }
+
+ Application.OpenURL(url);
+ }
+
+ [MenuItem("FMOD/About Integration", priority = 7)]
+ public static void About()
+ {
+ FMOD.System lowlevel;
+ CheckResult(System.getCoreSystem(out lowlevel));
+
+ uint version;
+ uint buildNumber;
+ CheckResult(lowlevel.getVersion(out version, out buildNumber));
+
+ string text = string.Format(
+ L10n.Tr("Version: {0}\nBuild Number: {1}\n\nCopyright \u00A9 Firelight Technologies Pty, Ltd. 2014-2025 \n\nSee LICENSE.TXT for additional license information."),
+ VersionString(version),
+ buildNumber);
+
+ EditorUtility.DisplayDialog(L10n.Tr("FMOD Studio Unity Integration"), text, "OK");
+ }
+
+ private static List previewEventInstances = new List();
+
+ public static bool PreviewBanksLoaded
+ {
+ get { return loadedPreviewBanks.Count > 0; }
+ }
+
+ public static void LoadPreviewBanks()
+ {
+ if (PreviewBanksLoaded)
+ {
+ return;
+ }
+
+ foreach (var bank in EventManager.Banks)
+ {
+ FMOD.Studio.Bank previewBank;
+ FMOD.RESULT result = System.loadBankFile(bank.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out previewBank);
+ if (result != FMOD.RESULT.ERR_EVENT_ALREADY_LOADED) // ignore error when a bank is already loaded, e.g. localized banks.
+ {
+ CheckResult(result);
+ }
+ loadedPreviewBanks.Add(previewBank);
+ }
+ }
+
+ public static void UnloadPreviewBanks()
+ {
+ if (!PreviewBanksLoaded)
+ {
+ return;
+ }
+
+ loadedPreviewBanks.ForEach(x => { x.unload(); x.clearHandle(); });
+ loadedPreviewBanks.Clear();
+ }
+
+ public static FMOD.Studio.EventInstance PreviewEvent(EditorEventRef eventRef, Dictionary previewParamValues, float volume = 1, float startTime = 0.0f)
+ {
+ FMOD.Studio.EventDescription eventDescription;
+ FMOD.Studio.EventInstance eventInstance;
+
+ CheckResult(System.getEventByID(eventRef.Guid, out eventDescription));
+ CheckResult(eventDescription.createInstance(out eventInstance));
+
+ foreach (EditorParamRef param in eventRef.Parameters)
+ {
+ FMOD.Studio.PARAMETER_DESCRIPTION paramDesc;
+ if (param.IsGlobal)
+ {
+ CheckResult(System.getParameterDescriptionByName(param.Name, out paramDesc));
+ }
+ else
+ {
+ CheckResult(eventDescription.getParameterDescriptionByName(param.Name, out paramDesc));
+ }
+
+ float value = previewParamValues.ContainsKey(param.Name) ? previewParamValues[param.Name] : param.Default;
+ param.ID = paramDesc.id;
+
+ if (param.IsGlobal)
+ {
+ CheckResult(System.setParameterByID(param.ID, value));
+ }
+ else
+ {
+ CheckResult(eventInstance.setParameterByID(param.ID, value));
+ }
+ }
+
+ CheckResult(eventInstance.setVolume(volume));
+ CheckResult(eventInstance.setTimelinePosition((int)(startTime * 1000.0f)));
+ CheckResult(eventInstance.start());
+
+ previewEventInstances.Add(eventInstance);
+
+ return eventInstance;
+ }
+
+ public static void PreviewPause(FMOD.Studio.EventInstance eventInstance)
+ {
+ if (eventInstance.isValid() && previewEventInstances.Contains(eventInstance))
+ {
+ bool paused;
+ CheckResult(eventInstance.getPaused(out paused));
+ CheckResult(eventInstance.setPaused(!paused));
+ }
+ }
+
+ public static void PreviewStop(FMOD.Studio.EventInstance eventInstance, FMOD.Studio.STOP_MODE stopMode = FMOD.Studio.STOP_MODE.IMMEDIATE)
+ {
+ if (previewEventInstances.Contains(eventInstance))
+ {
+ previewEventInstances.Remove(eventInstance);
+ if (eventInstance.isValid())
+ {
+ eventInstance.stop(stopMode);
+ eventInstance.release();
+ eventInstance.clearHandle();
+ }
+ }
+ }
+
+ public static void StopAllPreviews()
+ {
+ foreach (FMOD.Studio.EventInstance eventInstance in previewEventInstances)
+ {
+ PreviewStop(eventInstance);
+ }
+ }
+
+ public static float[] GetMetering()
+ {
+ FMOD.System lowlevel;
+ CheckResult(System.getCoreSystem(out lowlevel));
+ FMOD.ChannelGroup master;
+ CheckResult(lowlevel.getMasterChannelGroup(out master));
+ FMOD.DSP masterHead;
+ CheckResult(master.getDSP(FMOD.CHANNELCONTROL_DSP_INDEX.HEAD, out masterHead));
+
+ FMOD.DSP_METERING_INFO outputMetering;
+ CheckResult(masterHead.getMeteringInfo(IntPtr.Zero, out outputMetering));
+
+ FMOD.SPEAKERMODE mode;
+ int rate, raw;
+ lowlevel.getSoftwareFormat(out rate, out mode, out raw);
+ int channels;
+ lowlevel.getSpeakerModeChannels(mode, out channels);
+
+ float[] data = new float[channels];
+ if (outputMetering.numchannels > 0)
+ {
+ Array.Copy(outputMetering.rmslevel, data, channels);
+ }
+ return data;
+ }
+
+ private static NetworkStream ScriptStream
+ {
+ get
+ {
+ if (networkStream == null)
+ {
+ try
+ {
+ if (socket == null)
+ {
+ socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ }
+
+ if (!socket.Connected)
+ {
+ socketConnection = socket.BeginConnect("127.0.0.1", StudioScriptPort, null, null);
+ socketConnection.AsyncWaitHandle.WaitOne();
+ socket.EndConnect(socketConnection);
+ socketConnection = null;
+ }
+
+ networkStream = new NetworkStream(socket);
+
+ byte[] headerBytes = new byte[128];
+ int read = ScriptStream.Read(headerBytes, 0, 128);
+ string header = Encoding.UTF8.GetString(headerBytes, 0, read - 1);
+ if (header.StartsWith("log():"))
+ {
+ RuntimeUtils.DebugLog("FMOD Studio: Script Client returned " + header.Substring(6));
+ }
+ }
+ catch (Exception e)
+ {
+ RuntimeUtils.DebugLog("FMOD Studio: Script Client failed to connect - Check FMOD Studio is running");
+
+ socketConnection = null;
+ socket = null;
+ networkStream = null;
+ streamReader = null;
+ throw e;
+ }
+ }
+ return networkStream;
+ }
+ }
+
+ private static StreamReader ScriptStreamReader
+ {
+ get
+ {
+ if (streamReader == null)
+ {
+ streamReader = new StreamReader(ScriptStream);
+ }
+ return streamReader;
+ }
+ }
+
+ private static void AsyncConnectCallback(IAsyncResult result)
+ {
+ try
+ {
+ socket.EndConnect(result);
+ }
+ catch (Exception)
+ {
+ }
+ finally
+ {
+ socketConnection = null;
+ }
+ }
+
+ public static bool IsConnectedToStudio()
+ {
+ try
+ {
+ if (socket != null && socket.Connected)
+ {
+ if (SendScriptCommand("true"))
+ {
+ return true;
+ }
+ }
+
+ if (socketConnection == null)
+ {
+ socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ socketConnection = socket.BeginConnect("127.0.0.1", StudioScriptPort, AsyncConnectCallback, null);
+ }
+
+ return false;
+
+ }
+ catch(Exception e)
+ {
+ RuntimeUtils.DebugLogException(e);
+ return false;
+ }
+ }
+
+ public static bool SendScriptCommand(string command)
+ {
+ byte[] commandBytes = Encoding.UTF8.GetBytes(command);
+ try
+ {
+ ScriptStream.Write(commandBytes, 0, commandBytes.Length);
+ byte[] commandReturnBytes = new byte[128];
+ int read = ScriptStream.Read(commandReturnBytes, 0, 128);
+ string result = Encoding.UTF8.GetString(commandReturnBytes, 0, read - 1);
+ return (result.Contains("true"));
+ }
+ catch (Exception)
+ {
+ if (networkStream != null)
+ {
+ networkStream.Close();
+ networkStream = null;
+ streamReader = null;
+ }
+ return false;
+ }
+ }
+
+ public static string GetScriptOutput(string command)
+ {
+ byte[] commandBytes = Encoding.UTF8.GetBytes(command);
+ try
+ {
+ ScriptStream.Write(commandBytes, 0, commandBytes.Length);
+ char[] myReadBuffer = new char[2048];
+ StringBuilder myCompleteMessage = new StringBuilder();
+ int numberOfCharactersRead = ScriptStreamReader.Read(myReadBuffer, 0, myReadBuffer.Length);
+
+ while (numberOfCharactersRead > 0)
+ {
+ int nullIndex = Array.IndexOf(myReadBuffer, '\0', 0, numberOfCharactersRead);
+
+ if (nullIndex > 0)
+ {
+ myCompleteMessage.Append(myReadBuffer, 0, nullIndex - 1);
+ }
+ else if (nullIndex < 0)
+ {
+ myCompleteMessage.Append(myReadBuffer, 0, numberOfCharactersRead);
+ }
+
+ if (nullIndex >= 0)
+ {
+ break;
+ }
+
+ numberOfCharactersRead = ScriptStreamReader.Read(myReadBuffer, 0, myReadBuffer.Length);
+ }
+
+ string result = myCompleteMessage.ToString();
+ if (result.StartsWith("out():"))
+ {
+ return result.Substring(6).Trim();
+ }
+
+ return null;
+ }
+ catch (Exception)
+ {
+ networkStream.Close();
+ networkStream = null;
+ streamReader = null;
+ return null;
+ }
+ }
+
+ private static string GetMasterBank()
+ {
+ GetScriptOutput(string.Format("masterBankFolder = studio.project.workspace.masterBankFolder;"));
+ string bankCountString = GetScriptOutput(string.Format("masterBankFolder.items.length;"));
+ int bankCount = int.Parse(bankCountString);
+ for (int i = 0; i < bankCount; i++)
+ {
+ string isMaster = GetScriptOutput(string.Format("masterBankFolder.items[{1}].isOfExactType(\"MasterBank\");", i));
+ if (isMaster == "true")
+ {
+ string guid = GetScriptOutput(string.Format("masterBankFolder.items[{1}].id;", i));
+ return guid;
+ }
+ }
+ return "";
+ }
+
+ private static bool CheckForNameConflict(string folderGuid, string eventName)
+ {
+ const string checkForNameConflictFunc =
+ @"function(folderGuid, eventName) {
+ var nameConflict = false;
+ studio.project.lookup(folderGuid).items.forEach(function(val) {
+ nameConflict |= val.name == eventName;
+ });
+ return nameConflict;
+ }";
+
+ string conflictBool = GetScriptOutput(string.Format("({0})(\"{1}\", \"{2}\")", checkForNameConflictFunc, folderGuid, eventName));
+ return conflictBool == "1";
+ }
+
+ public static string CreateStudioEvent(string eventPath, string eventName)
+ {
+ var folders = eventPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+ string folderGuid = GetScriptOutput("studio.project.workspace.masterEventFolder.id;");
+
+ const string getFolderGuidFunc =
+ @"function(parentGuid, folderName) {
+ folderGuid = """";
+ studio.project.lookup(parentGuid).items.forEach(function(val) {
+ folderGuid = val.isOfType(""EventFolder"") && val.name == folderName ? val.id : folderGuid;
+ });
+ if (folderGuid == """")
+ {
+ var newFolder = studio.project.create(""EventFolder"");
+ newFolder.name = folderName;
+ newFolder.folder = studio.project.lookup(parentGuid);
+ folderGuid = newFolder.id;
+ }
+ return folderGuid;
+ }";
+
+ for (int i = 0; i < folders.Length; i++)
+ {
+ string parentGuid = folderGuid;
+ folderGuid = GetScriptOutput(string.Format("({0})(\"{1}\", \"{2}\")", getFolderGuidFunc, parentGuid, folders[i]));
+ }
+
+ if (CheckForNameConflict(folderGuid, eventName))
+ {
+ EditorUtility.DisplayDialog(L10n.Tr("Name Conflict"), string.Format(L10n.Tr("The event {0} already exists under {1}"), eventName, eventPath), "OK");
+ return null;
+ }
+
+ const string createEventFunc =
+ @"function(eventName, folderGuid) {
+ event = studio.project.create(""Event"");
+ event.note = ""Placeholder created via Unity"";
+ event.name = eventName;
+ event.folder = studio.project.lookup(folderGuid);
+
+ track = studio.project.create(""GroupTrack"");
+ track.mixerGroup.output = event.mixer.masterBus;
+ track.mixerGroup.name = ""Audio 1"";
+ event.relationships.groupTracks.add(track);
+
+ tag = studio.project.create(""Tag"");
+ tag.name = ""placeholder"";
+ tag.folder = studio.project.workspace.masterTagFolder;
+ event.relationships.tags.add(tag);
+
+ return event.id;
+ }";
+
+ string eventGuid = GetScriptOutput(string.Format("({0})(\"{1}\", \"{2}\")", createEventFunc, eventName, folderGuid));
+ return eventGuid;
+ }
+
+ // The FMOD base folder needs to have a known GUID so that we can find it
+ // if it has been moved, and so that platform specific integration packages can
+ // be installed correctly.
+ //
+ // However, old FMOD packages didn't specify a GUID for the base folder, meaning Unity
+ // would generate a new one. If this is the case, we need to patch the metadata with
+ // the correct GUID.
+ private static void CheckBaseFolderGUID()
+ {
+ if (string.IsNullOrEmpty(AssetDatabase.GUIDToAssetPath(RuntimeUtils.BaseFolderGUID)))
+ {
+ string folderPath = RuntimeUtils.PluginBasePathDefault;
+
+ if (!Directory.Exists(folderPath))
+ {
+ Debug.LogErrorFormat("FMOD: Couldn't find base folder by GUID ({0}) or path ({1})",
+ RuntimeUtils.BaseFolderGUID, RuntimeUtils.PluginBasePathDefault);
+ return;
+ }
+
+ const string DialogTitle = "Update FMOD Folder Metadata";
+
+ bool update = EditorUtility.DisplayDialog(DialogTitle,
+ $"The metadata for the {folderPath} folder needs to be updated"
+ + " so that FMOD can locate required files.\n\n"
+ + "After this change you may move the FMOD folder to any location within your project.",
+ "Update Metadata", "Ignore");
+
+ while (update)
+ {
+ string error = ReplaceMetaFileGUID(folderPath, RuntimeUtils.BaseFolderGUID);
+
+ if (error == null)
+ {
+ return;
+ }
+
+ update = EditorUtility.DisplayDialog(DialogTitle,
+ $"Error updating metadata for {folderPath}:\n\n{error}\n\nDo you want to try again?",
+ "Try Again", "Ignore");
+ }
+ }
+ }
+
+ private static string ReplaceMetaFileGUID(string assetPath, string newGUID)
+ {
+ try
+ {
+ string filePath = $"{assetPath}.meta";
+
+ if (!AssetDatabase.MakeEditable(filePath))
+ {
+ return $"Failed to open {filePath} for editing";
+ }
+
+ string[] lines = File.ReadAllLines(filePath);
+
+ const string GuidPrefix = "guid:";
+ bool guidReplaced = false;
+
+ using (StreamWriter stream = File.CreateText(filePath))
+ {
+ foreach (string line in lines)
+ {
+ if (!guidReplaced && line.StartsWith(GuidPrefix))
+ {
+ guidReplaced = true;
+ stream.WriteLine($"{GuidPrefix} {newGUID}");
+ }
+ else
+ {
+ stream.WriteLine(line);
+ }
+ }
+ }
+
+ if (!guidReplaced)
+ {
+ return $"Couldn't find a line starting with '{GuidPrefix}' in {filePath}";
+ }
+
+ Debug.LogFormat("FMOD: Updated the GUID for {0} to {1}", assetPath, newGUID);
+
+ AssetDatabase.ImportAsset(assetPath);
+
+ return null;
+ }
+ catch (Exception e)
+ {
+ Debug.LogWarningFormat("FMOD: Failed to update the GUID for {0}: {1}", assetPath, e.Message);
+
+ return e.Message;
+ }
+ }
+
+ private static void CheckMacLibraries()
+ {
+ Platform platformMac = EditorSettings.Instance.GetPlatform(BuildTarget.StandaloneOSX);
+
+ IEnumerable allLibraries = platformMac.GetBuildTargets()
+ .SelectMany(t => platformMac.GetBinaryAssetPaths(t, Platform.BinaryType.All))
+ .Distinct();
+
+ List librariesToRepair = allLibraries.Where(path => {
+ string infoPlistPath = $"{path}/Contents/Info.plist";
+
+ if (File.Exists(infoPlistPath))
+ {
+ string contents = File.ReadAllText(infoPlistPath);
+
+ return contents.Contains("\r\n");
+ }
+
+ return false;
+ })
+ .ToList();
+
+ if (!librariesToRepair.Any())
+ {
+ return;
+ }
+
+ librariesToRepair.Sort();
+
+ const string DialogTitle = "Repair FMOD Libraries";
+
+ bool repair = EditorUtility.DisplayDialog(DialogTitle,
+ "The following FMOD libraries contain incorrect line endings, and need to be repaired:\n\n" +
+ $"{string.Join("\n", librariesToRepair)}\n\n" +
+ "Do you want to repair them now?", "Repair", "Ignore");
+
+ while (repair)
+ {
+ try
+ {
+ RepairMacLibraries(librariesToRepair);
+ repair = false;
+ }
+ catch (Exception e)
+ {
+ repair = EditorUtility.DisplayDialog(DialogTitle,
+ $"Error repairing FMOD libraries:\n\n{e.Message}\n\nDo you want to try again?",
+ "Try Again", "Ignore");
+ }
+ }
+ }
+
+ private static void RepairMacLibraries(IEnumerable paths)
+ {
+ foreach (string path in paths)
+ {
+ string infoPlistPath = $"{path}/Contents/Info.plist";
+
+ if (!AssetDatabase.MakeEditable(infoPlistPath))
+ {
+ throw new Exception($"Failed to open {infoPlistPath} for editing");
+ }
+
+ string contents = File.ReadAllText(infoPlistPath);
+ contents = contents.Replace("\r\n", "\n");
+
+ File.WriteAllText(infoPlistPath, contents);
+
+ Debug.LogFormat("FMOD: Replaced CRLF line endings with LF in {0}", infoPlistPath);
+ }
+ }
+
+ private static void CleanObsoleteFiles()
+ {
+ if (Environment.GetCommandLineArgs().Any(a => a == "-exportPackage"))
+ {
+ // Don't delete anything or it won't be included in the package
+ return;
+ }
+ if (EditorApplication.isPlayingOrWillChangePlaymode)
+ {
+ // Messing with the asset database while entering play mode causes a NullReferenceException
+ return;
+ }
+
+ string obsoleteFolder = $"{RuntimeUtils.PluginBasePath}/obsolete";
+
+ if (AssetDatabase.IsValidFolder(obsoleteFolder))
+ {
+ EditorApplication.LockReloadAssemblies();
+
+ string[] guids = AssetDatabase.FindAssets(string.Empty, new string[] { obsoleteFolder });
+ foreach (string guid in guids)
+ {
+ string path = AssetDatabase.GUIDToAssetPath(guid);
+ if (AssetDatabase.DeleteAsset(path))
+ {
+ RuntimeUtils.DebugLogFormat("FMOD: Removed obsolete file {0}", path);
+ }
+ }
+ if(AssetDatabase.MoveAssetToTrash(obsoleteFolder))
+ {
+ RuntimeUtils.DebugLogFormat("FMOD: Removed obsolete folder {0}", obsoleteFolder);
+ }
+ AssetDatabase.Refresh();
+ EditorApplication.UnlockReloadAssemblies();
+ }
+ }
+
+ public static string WritableAssetPath(string cacheAssetName)
+ {
+ if (RuntimeUtils.PluginBasePath.StartsWith("Assets/"))
+ {
+ return $"{RuntimeUtils.PluginBasePath}/Cache/Editor/{cacheAssetName}.asset";
+ }
+ else
+ {
+ return $"Assets/Plugins/FMOD/Cache/Editor/{cacheAssetName}.asset";
+ }
+ }
+ }
+
+ public class StagingSystem
+ {
+ private static string PlatformsFolder => $"{RuntimeUtils.PluginBasePath}/platforms";
+ private static string StagingFolder => $"{RuntimeUtils.PluginBasePath}/staging";
+ private const string AnyCPU = "AnyCPU";
+
+ private static readonly LibInfo[] LibrariesToUpdate = {
+ new LibInfo() {cpu = "x86", os = "Windows", lib = "fmodstudioL.dll", platform = "win", buildTarget = BuildTarget.StandaloneWindows},
+ new LibInfo() {cpu = "x86_64", os = "Windows", lib = "fmodstudioL.dll", platform = "win", buildTarget = BuildTarget.StandaloneWindows64},
+ new LibInfo() {cpu = "x86_64", os = "Linux", lib = "libfmodstudioL.so", platform = "linux", buildTarget = BuildTarget.StandaloneLinux64},
+ new LibInfo() {cpu = AnyCPU, os = "OSX", lib = "fmodstudioL.bundle", platform = "mac", buildTarget = BuildTarget.StandaloneOSX},
+ };
+
+ public static bool SourceLibsExist
+ {
+ get
+ {
+ return LibrariesToUpdate.Any((info) =>
+ {
+ string sourcePath = GetSourcePath(info);
+
+ if (sourcePath != null)
+ {
+ return AssetImporter.GetAtPath(sourcePath) as PluginImporter != null;
+ }
+ else
+ {
+ return false;
+ }
+ });
+ }
+ }
+
+ private struct LibInfo
+ {
+ public string cpu;
+ public string os;
+ public string lib;
+ public string platform;
+ public BuildTarget buildTarget;
+ };
+
+ private static string GetTargetPath(LibInfo libInfo)
+ {
+ foreach (Platform.FileLayout layout in Platform.OldFileLayouts)
+ {
+ string path = GetTargetPath(libInfo, layout);
+
+ if (EditorUtils.AssetExists(path))
+ {
+ return path;
+ }
+ }
+
+ return null;
+ }
+
+ private static string GetTargetPath(LibInfo libInfo, Platform.FileLayout layout)
+ {
+ switch (layout)
+ {
+ case Platform.FileLayout.Release_1_10:
+ return $"Assets/Plugins/{CPUAndLibPath(libInfo)}";
+ case Platform.FileLayout.Release_2_0:
+ return $"Assets/Plugins/FMOD/lib/{libInfo.platform}/{CPUAndLibPath(libInfo)}";
+ case Platform.FileLayout.Release_2_1:
+ case Platform.FileLayout.Release_2_2:
+ return $"{PlatformsFolder}/{libInfo.platform}/lib/{CPUAndLibPath(libInfo)}";
+ default:
+ throw new ArgumentException("Unrecognised file layout: " + layout);
+ }
+ }
+
+ private static string CPUAndLibPath(LibInfo libInfo)
+ {
+ return (libInfo.cpu == AnyCPU) ? libInfo.lib : $"{libInfo.cpu}/{libInfo.lib}";
+ }
+
+ private static string GetSourcePath(LibInfo libInfo)
+ {
+ return $"{StagingFolder}/{libInfo.platform}/lib/{CPUAndLibPath(libInfo)}";
+ }
+
+ public class UpdateStep
+ {
+ internal Settings.SharedLibraryUpdateStages Stage;
+ public string Name;
+ public string Description;
+ public string Details;
+ public Action Execute;
+
+ public void CacheDetails()
+ {
+ Details = GetDetails();
+ }
+
+ private Func GetDetails;
+
+ internal static UpdateStep Create(Settings.SharedLibraryUpdateStages stage, string name, string description,
+ Func details, Action execute)
+ {
+ return new UpdateStep() {
+ Stage = stage,
+ Name = name,
+ Description = description,
+ GetDetails = details,
+ Execute = execute,
+ };
+ }
+ }
+
+ public static readonly UpdateStep[] UpdateSteps = {
+ UpdateStep.Create(
+ stage: Settings.SharedLibraryUpdateStages.DisableExistingLibraries,
+ name: L10n.Tr("Disable Existing Native Libraries"),
+ description: L10n.Tr("Disable the existing FMOD native libraries so that Unity will not load them at startup time."),
+ details: () => {
+ IEnumerable importers =
+ LibrariesToUpdate.Select(GetPluginImporter).Where(p => p != null);
+
+ if (!importers.Any())
+ {
+ return string.Empty;
+ }
+
+ IEnumerable paths = importers.Select(p => $"\n* {p.assetPath}");
+
+ return string.Format(L10n.Tr("This will disable these native libraries:{0}"),string.Join(string.Empty, paths));
+ },
+ execute: () => {
+ foreach (LibInfo libInfo in LibrariesToUpdate)
+ {
+ PluginImporter pluginImporter = GetPluginImporter(libInfo);
+ if (pluginImporter != null && pluginImporter.GetCompatibleWithEditor())
+ {
+ pluginImporter.SetCompatibleWithEditor(false);
+ pluginImporter.SetCompatibleWithAnyPlatform(false);
+ EditorUtility.SetDirty(pluginImporter);
+ pluginImporter.SaveAndReimport();
+ }
+ }
+
+ Settings.Instance.SharedLibraryUpdateStage = Settings.SharedLibraryUpdateStages.RestartUnity;
+ Settings.Instance.SharedLibraryTimeSinceStart = EditorApplication.timeSinceStartup;
+ EditorUtility.SetDirty(Settings.Instance);
+ }
+ ),
+
+ UpdateStep.Create(
+ stage: Settings.SharedLibraryUpdateStages.RestartUnity,
+ name: L10n.Tr("Restart Unity"),
+ description: L10n.Tr("Restart Unity so that it releases its lock on the existing FMOD native libraries."),
+ details: () => {
+ return L10n.Tr("This will restart Unity. You will be prompted to save your work if you have unsaved scene modifications.");
+ },
+ execute: () => {
+ if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
+ {
+ EditorApplication.OpenProject(Environment.CurrentDirectory);
+ }
+ }
+ ),
+
+ UpdateStep.Create(
+ stage: Settings.SharedLibraryUpdateStages.CopyNewLibraries,
+ name: L10n.Tr("Copy New Native Libraries"),
+ description: L10n.Tr("Copy the new FMOD native libraries to the correct location and enable them."),
+ details: () => {
+ List actions = new List();
+
+ foreach (LibInfo libInfo in LibrariesToUpdate)
+ {
+ string sourcePath = GetSourcePath(libInfo);
+ string targetPath = GetTargetPath(libInfo);
+
+ if (EditorUtils.AssetExists(sourcePath))
+ {
+ if (targetPath != null)
+ {
+ actions.Add($"Delete {targetPath}");
+ }
+
+ targetPath = GetTargetPath(libInfo, Platform.FileLayout.Latest);
+
+ actions.Add($"Copy {sourcePath} to {targetPath}");
+ }
+
+ if (targetPath != null)
+ {
+ actions.Add($"Enable {targetPath}");
+ }
+ }
+
+ actions.Add($"Remove {StagingFolder}");
+
+ return string.Format(L10n.Tr("This will do the following:\n* {0}"), string.Join("\n* ", actions));
+ },
+ execute: () => {
+ bool allCopiesSucceeded = true;
+
+ foreach (LibInfo libInfo in LibrariesToUpdate)
+ {
+ string sourcePath = GetSourcePath(libInfo);
+ string targetPath = GetTargetPath(libInfo);
+
+ if (EditorUtils.AssetExists(sourcePath))
+ {
+ if (targetPath != null)
+ {
+ if (!AssetDatabase.DeleteAsset(targetPath))
+ {
+ RuntimeUtils.DebugLogError(string.Format("FMOD: Could not delete {0}", targetPath));
+ }
+ }
+
+ targetPath = GetTargetPath(libInfo, Platform.FileLayout.Latest);
+
+ EditorUtils.EnsureFolderExists(EditorUtils.GetParentFolder(targetPath));
+
+ if (!AssetDatabase.CopyAsset(sourcePath, targetPath))
+ {
+ RuntimeUtils.DebugLogError(string.Format("FMOD: Could not copy {0} to {1}", sourcePath, targetPath));
+ allCopiesSucceeded = false;
+ }
+ }
+
+ PluginImporter pluginImporter = AssetImporter.GetAtPath(targetPath) as PluginImporter;
+
+ if (pluginImporter != null)
+ {
+ pluginImporter.ClearSettings();
+ pluginImporter.SetCompatibleWithEditor(true);
+ pluginImporter.SetCompatibleWithAnyPlatform(false);
+ pluginImporter.SetCompatibleWithPlatform(libInfo.buildTarget, true);
+ pluginImporter.SetEditorData("CPU", libInfo.cpu);
+ pluginImporter.SetEditorData("OS", libInfo.os);
+ EditorUtility.SetDirty(pluginImporter);
+ pluginImporter.SaveAndReimport();
+ }
+ }
+
+ if (allCopiesSucceeded)
+ {
+ if (AssetDatabase.MoveAssetToTrash(StagingFolder))
+ {
+ RuntimeUtils.DebugLogFormat("FMOD: Removed staging folder {0}", StagingFolder);
+ }
+ else
+ {
+ RuntimeUtils.DebugLogError(string.Format("FMOD: Could not remove staging folder {0}", StagingFolder));
+ }
+ }
+
+ ResetUpdateStage();
+
+ // This is so that Unity finds the new libraries
+ EditorUtility.RequestScriptReload();
+ }
+ ),
+ };
+
+ private static PluginImporter GetPluginImporter(LibInfo libInfo)
+ {
+ string targetPath = GetTargetPath(libInfo);
+
+ if (targetPath != null)
+ {
+ return AssetImporter.GetAtPath(targetPath) as PluginImporter;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ private static UpdateStep FindUpdateStep(Settings.SharedLibraryUpdateStages stage)
+ {
+ return UpdateSteps.FirstOrDefault(s => s.Stage == stage);
+ }
+
+ private static void ResetUpdateStage()
+ {
+ if (Settings.Instance.SharedLibraryUpdateStage != Settings.SharedLibraryUpdateStages.Start ||
+ Settings.Instance.SharedLibraryTimeSinceStart != 0)
+ {
+ Settings.Instance.SharedLibraryUpdateStage = Settings.SharedLibraryUpdateStages.Start;
+ Settings.Instance.SharedLibraryTimeSinceStart = 0;
+ EditorUtility.SetDirty(Settings.Instance);
+ }
+ }
+
+ public static UpdateStep Startup()
+ {
+ if (!AssetDatabase.IsValidFolder(StagingFolder))
+ {
+ ResetUpdateStage();
+ return null;
+ }
+
+ if (Settings.Instance.SharedLibraryUpdateStage == Settings.SharedLibraryUpdateStages.Start)
+ {
+ bool targetLibsExist = LibrariesToUpdate.Any(info => GetPluginImporter(info) != null);
+
+ if (targetLibsExist)
+ {
+ Settings.Instance.SharedLibraryUpdateStage = Settings.SharedLibraryUpdateStages.DisableExistingLibraries;
+ EditorUtility.SetDirty(Settings.Instance);
+ }
+ else
+ {
+ FindUpdateStep(Settings.SharedLibraryUpdateStages.CopyNewLibraries).Execute();
+
+ ResetUpdateStage();
+ return null;
+ }
+ }
+
+ if (Settings.Instance.SharedLibraryUpdateStage == Settings.SharedLibraryUpdateStages.RestartUnity
+ && EditorApplication.timeSinceStartup < Settings.Instance.SharedLibraryTimeSinceStart)
+ {
+ // Unity has been restarted
+ Settings.Instance.SharedLibraryUpdateStage = Settings.SharedLibraryUpdateStages.CopyNewLibraries;
+ EditorUtility.SetDirty(Settings.Instance);
+ }
+
+ return GetNextUpdateStep();
+ }
+
+ public static UpdateStep GetNextUpdateStep()
+ {
+ UpdateStep step = FindUpdateStep(Settings.Instance.SharedLibraryUpdateStage);
+
+ if (step != null)
+ {
+ step.CacheDetails();
+ }
+
+ return step;
+ }
+ }
+
+ public abstract class HelpContent : PopupWindowContent
+ {
+ private GUIContent icon;
+
+ protected abstract void Prepare();
+ protected abstract Vector2 GetContentSize();
+ protected abstract void DrawContent();
+
+ public override void OnOpen()
+ {
+ icon = EditorGUIUtility.IconContent("console.infoicon");
+
+ Prepare();
+ }
+
+ public override Vector2 GetWindowSize()
+ {
+ Vector2 contentSize = GetContentSize();
+
+ Vector2 iconSize = GUI.skin.label.CalcSize(icon);
+
+ return new Vector2(contentSize.x + iconSize.x,
+ Math.Max(contentSize.y, iconSize.y) + EditorGUIUtility.standardVerticalSpacing);
+ }
+
+ public override void OnGUI(Rect rect)
+ {
+ using (new GUILayout.HorizontalScope())
+ {
+ using (new GUILayout.VerticalScope())
+ {
+ GUILayout.Label(icon);
+ }
+
+ using (new GUILayout.VerticalScope())
+ {
+ DrawContent();
+ }
+ }
+ }
+ }
+
+ public class SimpleHelp : HelpContent
+ {
+ private GUIContent text;
+ private GUIStyle style;
+ private float textWidth;
+
+ public SimpleHelp(string text, float textWidth = 300)
+ {
+ this.text = new GUIContent(text);
+ this.textWidth = textWidth;
+ }
+
+ protected override void Prepare()
+ {
+ style = new GUIStyle(GUI.skin.label) {
+ richText = true,
+ wordWrap = true,
+ alignment = TextAnchor.MiddleLeft,
+ };
+ }
+
+ protected override Vector2 GetContentSize()
+ {
+ float textHeight = style.CalcHeight(text, textWidth) + style.margin.bottom;
+
+ return new Vector2(textWidth, textHeight);
+ }
+
+ protected override void DrawContent()
+ {
+ GUILayout.Label(text, style);
+ }
+ }
+
+ public class BuildStatusWatcher
+ {
+ public static Action OnBuildStarted;
+ public static Action OnBuildEnded;
+
+ private static bool buildInProgress = false;
+
+ private static void SetBuildInProgress(bool inProgress)
+ {
+ if (inProgress != buildInProgress)
+ {
+ buildInProgress = inProgress;
+
+ if (buildInProgress)
+ {
+ EditorApplication.update += PollBuildStatus;
+
+ if (OnBuildStarted != null)
+ {
+ OnBuildStarted();
+ }
+ }
+ else
+ {
+ EditorApplication.update -= PollBuildStatus;
+
+ if (OnBuildEnded != null)
+ {
+ OnBuildEnded();
+ }
+ }
+ }
+ }
+
+ private static void PollBuildStatus()
+ {
+ SetBuildInProgress(BuildPipeline.isBuildingPlayer);
+ }
+
+ private class BuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
+ {
+ public int callbackOrder { get { return 0; } }
+
+ public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
+ {
+ SetBuildInProgress(true);
+ }
+
+ public void OnPostprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
+ {
+ SetBuildInProgress(false);
+ }
+ }
+
+ public static void Startup()
+ {
+#if UNITY_SCRIPTABLEBUILDPIPELINE_EXIST
+ BuildCallbacks callbacks = ContentPipeline.BuildCallbacks;
+
+ callbacks.PostDependencyCallback += (parameters, dependencyData) => {
+ SetBuildInProgress(true);
+ return ReturnCode.Success;
+ };
+
+ callbacks.PostWritingCallback += (parameters, dependencyData, writeData, results) => {
+ SetBuildInProgress(false);
+ return ReturnCode.Success;
+ };
+#endif
+ }
+ }
+
+ public static class SerializedPropertyExtensions
+ {
+ public static bool ArrayContains(this SerializedProperty array, Func predicate)
+ {
+ return FindArrayIndex(array, predicate) >= 0;
+ }
+
+ public static bool ArrayContains(this SerializedProperty array, string subPropertyName,
+ Func predicate)
+ {
+ return FindArrayIndex(array, subPropertyName, predicate) >= 0;
+ }
+
+ public static int FindArrayIndex(this SerializedProperty array, Func predicate)
+ {
+ for (int i = 0; i < array.arraySize; ++i)
+ {
+ SerializedProperty current = array.GetArrayElementAtIndex(i);
+
+ if (predicate(current))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ public static int FindArrayIndex(this SerializedProperty array, string subPropertyName,
+ Func predicate)
+ {
+ for (int i = 0; i < array.arraySize; ++i)
+ {
+ SerializedProperty current = array.GetArrayElementAtIndex(i);
+ SerializedProperty subProperty = current.FindPropertyRelative(subPropertyName);
+
+ if (predicate(subProperty))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ public static void ArrayAdd(this SerializedProperty array, Action initialize)
+ {
+ array.InsertArrayElementAtIndex(array.arraySize);
+ initialize(array.GetArrayElementAtIndex(array.arraySize - 1));
+ }
+
+ public static void ArrayClear(this SerializedProperty array)
+ {
+ while (array.arraySize > 0)
+ {
+ array.DeleteArrayElementAtIndex(array.arraySize - 1);
+ }
+ }
+
+ private static FMOD.GUID GetGuid(this SerializedProperty property)
+ {
+ return new FMOD.GUID() {
+ Data1 = property.FindPropertyRelative("Data1").intValue,
+ Data2 = property.FindPropertyRelative("Data2").intValue,
+ Data3 = property.FindPropertyRelative("Data3").intValue,
+ Data4 = property.FindPropertyRelative("Data4").intValue,
+ };
+ }
+
+ public static void SetGuid(this SerializedProperty property, FMOD.GUID guid)
+ {
+ property.FindPropertyRelative("Data1").intValue = guid.Data1;
+ property.FindPropertyRelative("Data2").intValue = guid.Data2;
+ property.FindPropertyRelative("Data3").intValue = guid.Data3;
+ property.FindPropertyRelative("Data4").intValue = guid.Data4;
+ }
+
+ public static void SetEventReference(this SerializedProperty property, FMOD.GUID guid, string path)
+ {
+ SerializedProperty guidProperty = property.FindPropertyRelative("Guid");
+ guidProperty.SetGuid(guid);
+
+ SerializedProperty pathProperty = property.FindPropertyRelative("Path");
+ pathProperty.stringValue = path;
+ }
+
+ public static EventReference GetEventReference(this SerializedProperty property)
+ {
+ SerializedProperty pathProperty = property.FindPropertyRelative("Path");
+ SerializedProperty guidProperty = property.FindPropertyRelative("Guid");
+
+ return new EventReference() {
+ Path = pathProperty.stringValue,
+ Guid = guidProperty.GetGuid(),
+ };
+ }
+ }
+
+ public class NoIndentScope : IDisposable
+ {
+ private int oldIndentLevel;
+
+ public NoIndentScope()
+ {
+ oldIndentLevel = EditorGUI.indentLevel;
+ EditorGUI.indentLevel = 0;
+ }
+
+ public void Dispose()
+ {
+ EditorGUI.indentLevel = oldIndentLevel;
+ }
+ }
+
+ public class NaturalComparer : IComparer
+ {
+ public int Compare(string a, string b)
+ {
+ return EditorUtility.NaturalCompare(a, b);
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs.meta b/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs.meta
new file mode 100644
index 00000000..7a44a90a
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EditorUtils.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2bb4068641d1f71478f95a9b73533f51
+timeCreated: 1432608272
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs b/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs
new file mode 100644
index 00000000..7dde4c32
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs
@@ -0,0 +1,1782 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using UnityEngine;
+using System.IO;
+
+namespace FMODUnity
+{
+ public class EventBrowser : EditorWindow, ISerializationCallbackReceiver
+ {
+ [SerializeField]
+ private bool isStandaloneWindow;
+
+ [NonSerialized]
+ private float nextRepaintTime;
+
+ [NonSerialized]
+ private float[] cachedMetering;
+
+ private const float RepaintInterval = 1 / 30.0f;
+
+ private Texture2D borderIcon;
+ private GUIStyle borderStyle;
+
+ [NonSerialized]
+ private TreeView treeView;
+
+ [NonSerialized]
+ private SearchField searchField;
+
+ [SerializeField]
+ private PreviewArea previewArea = new PreviewArea();
+
+ [SerializeField]
+ private TreeView.State treeViewState;
+
+ [NonSerialized]
+ private DateTime LastKnownCacheTime;
+
+ private SerializedProperty outputProperty;
+
+ public static FMOD.Studio.EventInstance PreviewEventInstance { get; private set; }
+
+ [MenuItem("FMOD/Event Browser", priority = 2)]
+ public static void ShowWindow()
+ {
+ EventBrowser eventBrowser = GetWindow("FMOD Events");
+ eventBrowser.minSize = new Vector2(380, 600);
+
+ eventBrowser.BeginStandaloneWindow();
+
+ EditorUtils.LoadPreviewBanks();
+ }
+
+ public static bool IsOpen
+ {
+ get; private set;
+ }
+
+ public void OnBeforeSerialize()
+ {
+ treeViewState = treeView.state;
+ }
+
+ public void OnAfterDeserialize()
+ {
+ }
+
+ private void Update()
+ {
+ bool forceRepaint = false;
+
+ float[] currentMetering = EditorUtils.GetMetering();
+ if (cachedMetering == null || !cachedMetering.SequenceEqual(currentMetering))
+ {
+ cachedMetering = currentMetering;
+ forceRepaint = true;
+ }
+
+ if (LastKnownCacheTime != EventManager.CacheTime)
+ {
+ ReadEventCache();
+ forceRepaint = true;
+ }
+
+ if (forceRepaint || (previewArea != null && previewArea.forceRepaint && nextRepaintTime < Time.realtimeSinceStartup))
+ {
+ Repaint();
+ nextRepaintTime = Time.time + RepaintInterval;
+ }
+ }
+
+ private void ReadEventCache()
+ {
+ LastKnownCacheTime = EventManager.CacheTime;
+ treeView.Reload();
+ }
+
+ private class TreeView : UnityEditor.IMGUI.Controls.TreeView
+ {
+ private static readonly Texture2D folderOpenIcon = EditorUtils.LoadImage("FolderIconOpen.png");
+ private static readonly Texture2D folderClosedIcon = EditorUtils.LoadImage("FolderIconClosed.png");
+ private static readonly Texture2D eventIcon = EditorUtils.LoadImage("EventIcon.png");
+ private static readonly Texture2D snapshotIcon = EditorUtils.LoadImage("SnapshotIcon.png");
+ private static readonly Texture2D bankIcon = EditorUtils.LoadImage("BankIcon.png");
+ private static readonly Texture2D continuousParameterIcon = EditorUtils.LoadImage("ContinuousParameterIcon.png");
+ private static readonly Texture2D discreteParameterIcon = EditorUtils.LoadImage("DiscreteParameterIcon.png");
+ private static readonly Texture2D labeledParameterIcon = EditorUtils.LoadImage("LabeledParameterIcon.png");
+
+ private Dictionary itemIDs = new Dictionary();
+
+ private const string EventPrefix = "event:/";
+ private const string SnapshotPrefix = "snapshot:/";
+ private const string BankPrefix = "bank:/";
+ private const string ParameterPrefix = "parameter:/";
+
+ bool expandNextFolderSet = false;
+ string nextFramedItemPath;
+ private string[] searchStringSplit;
+
+ IList noSearchExpandState;
+
+ float oldBaseIndent;
+
+ public TreeView(State state) : base(state.baseState)
+ {
+ noSearchExpandState = state.noSearchExpandState;
+ SelectedObject = state.selectedObject;
+ TypeFilter = state.typeFilter;
+ DragEnabled = state.dragEnabled;
+
+ for (int i = 0; i < state.itemPaths.Count; ++i)
+ {
+ itemIDs.Add(state.itemPaths[i], state.itemIDs[i]);
+ }
+ }
+
+ public void JumpToEvent(string path)
+ {
+ JumpToItem(path);
+ }
+
+ public void JumpToBank(string name)
+ {
+ JumpToItem(BankPrefix + name);
+ }
+
+ private void JumpToItem(string path)
+ {
+ nextFramedItemPath = path;
+ Reload();
+
+ int itemID;
+ if (itemIDs.TryGetValue(path, out itemID))
+ {
+ SetSelection(new List { itemID },
+ TreeViewSelectionOptions.RevealAndFrame | TreeViewSelectionOptions.FireSelectionChanged);
+ }
+ else
+ {
+ SetSelection(new List());
+ }
+ }
+
+ private class LeafItem : TreeViewItem
+ {
+ public LeafItem(int id, int depth, ScriptableObject data)
+ : base(id, depth)
+ {
+ Data = data;
+ }
+
+ public ScriptableObject Data;
+ }
+
+ private class FolderItem : TreeViewItem
+ {
+ public FolderItem(int id, int depth, string displayName)
+ : base(id, depth, displayName)
+ {
+ }
+ }
+
+ private FolderItem CreateFolderItem(string name, string path, bool hasChildren, bool forceExpanded,
+ TreeViewItem parent)
+ {
+ FolderItem item = new FolderItem(AffirmItemID("folder:" + path), 0, name);
+
+ bool expanded;
+
+ if (!hasChildren)
+ {
+ expanded = false;
+ }
+ else if (forceExpanded || expandNextFolderSet
+ || (nextFramedItemPath != null && nextFramedItemPath.StartsWith(path)))
+ {
+ SetExpanded(item.id, true);
+ expanded = true;
+ }
+ else
+ {
+ expanded = IsExpanded(item.id);
+ }
+
+ if (expanded)
+ {
+ item.icon = folderOpenIcon;
+ }
+ else
+ {
+ item.icon = folderClosedIcon;
+
+ if (hasChildren)
+ {
+ item.children = CreateChildListForCollapsedParent();
+ }
+ }
+
+ parent.AddChild(item);
+
+ return item;
+ }
+
+ protected override TreeViewItem BuildRoot()
+ {
+ return new TreeViewItem(-1, -1);
+ }
+
+ private int AffirmItemID(string path)
+ {
+ int id;
+
+ if (!itemIDs.TryGetValue(path, out id))
+ {
+ id = itemIDs.Count;
+ itemIDs.Add(path, id);
+ }
+
+ return id;
+ }
+
+ public TypeFilter TypeFilter { get; set; }
+ public bool DragEnabled { get; set; }
+
+ protected override IList BuildRows(TreeViewItem root)
+ {
+ if (hasSearch)
+ {
+ searchStringSplit = searchString.Split(' ');
+ }
+
+ if (rootItem.children != null)
+ {
+ rootItem.children.Clear();
+ }
+
+ if ((TypeFilter & TypeFilter.Event) != 0)
+ {
+ CreateSubTree(L10n.Tr("Events"), EventPrefix,
+ EventManager.Events.Where(e => e.Path.StartsWith(EventPrefix)), e => e.Path);
+
+ CreateSubTree(L10n.Tr("Snapshots"), SnapshotPrefix,
+ EventManager.Events.Where(e => e.Path.StartsWith(SnapshotPrefix)), s => s.Path);
+ }
+
+ if ((TypeFilter & TypeFilter.Bank) != 0)
+ {
+ CreateSubTree(L10n.Tr("Banks"), BankPrefix, EventManager.Banks, b => b.StudioPath);
+ }
+
+ if ((TypeFilter & TypeFilter.Parameter) != 0)
+ {
+ CreateSubTree(L10n.Tr("Global Parameters"), ParameterPrefix,
+ EventManager.Parameters, p => p.StudioPath);
+ }
+
+ List rows = new List();
+
+ AddChildrenInOrder(rows, rootItem);
+
+ SetupDepthsFromParentsAndChildren(rootItem);
+
+ expandNextFolderSet = false;
+ nextFramedItemPath = null;
+
+ return rows;
+ }
+
+ private static NaturalComparer naturalComparer = new NaturalComparer();
+
+ private void CreateSubTree(string rootName, string rootPath,
+ IEnumerable sourceRecords, Func GetPath,
+ Func MakeUniquePath = null)
+ where T : ScriptableObject
+ {
+ var records = sourceRecords.Select(r => new { source = r, path = GetPath(r) });
+
+ if (hasSearch)
+ {
+ records = records.Where(r => {
+ foreach (var word in searchStringSplit)
+ {
+ if (word.Length > 0 && r.path.IndexOf(word, StringComparison.OrdinalIgnoreCase) < 0)
+ {
+ return false;
+ }
+ }
+ return true;
+ });
+ }
+
+ records = records.OrderBy(r => r.path, naturalComparer);
+
+ TreeViewItem root =
+ CreateFolderItem(rootName, rootPath, records.Any(), TypeFilter != TypeFilter.All, rootItem);
+
+ List currentFolderItems = new List();
+
+ foreach (var record in records)
+ {
+ string leafName;
+ TreeViewItem parent = CreateFolderItems(record.path, currentFolderItems, root, out leafName);
+
+ if (parent != null)
+ {
+ string uniquePath;
+
+ if (MakeUniquePath != null)
+ {
+ uniquePath = MakeUniquePath(record.path, record.source);
+ }
+ else
+ {
+ uniquePath = record.path;
+ }
+
+ TreeViewItem leafItem = new LeafItem(AffirmItemID(uniquePath), 0, record.source);
+ leafItem.displayName = leafName;
+ leafItem.icon = IconForRecord(record.source);
+
+ parent.AddChild(leafItem);
+ }
+ }
+ }
+
+ private Texture2D IconForRecord(ScriptableObject record)
+ {
+ EditorEventRef eventRef = record as EditorEventRef;
+ if (eventRef != null)
+ {
+ if (eventRef.Path.StartsWith(SnapshotPrefix))
+ {
+ return snapshotIcon;
+ }
+ else
+ {
+ return eventIcon;
+ }
+ }
+
+ EditorBankRef bankRef = record as EditorBankRef;
+ if (bankRef != null)
+ {
+ return bankIcon;
+ }
+
+ EditorParamRef paramRef = record as EditorParamRef;
+ if (paramRef != null)
+ {
+ switch(paramRef.Type)
+ {
+ case ParameterType.Continuous:
+ return continuousParameterIcon;
+ case ParameterType.Discrete:
+ return discreteParameterIcon;
+ case ParameterType.Labeled:
+ return labeledParameterIcon;
+ }
+ }
+
+ return null;
+ }
+
+ private TreeViewItem CreateFolderItems(string path, List currentFolderItems,
+ TreeViewItem root, out string leafName)
+ {
+ TreeViewItem parent = root;
+
+ char separator = '/';
+
+ // Skip the type prefix at the start of the path
+ int elementStart = path.IndexOf(separator) + 1;
+
+ for (int i = 0; ; ++i)
+ {
+ if (!IsExpanded(parent.id))
+ {
+ leafName = null;
+ return null;
+ }
+
+ int elementEnd = path.IndexOf(separator, elementStart);
+
+ if (elementEnd < 0)
+ {
+ // No more folders; elementStart points to the event name
+ break;
+ }
+
+ string folderName = path.Substring(elementStart, elementEnd - elementStart);
+
+ if (i < currentFolderItems.Count && folderName != currentFolderItems[i].displayName)
+ {
+ currentFolderItems.RemoveRange(i, currentFolderItems.Count - i);
+ }
+
+ if (i == currentFolderItems.Count)
+ {
+ FolderItem folderItem =
+ CreateFolderItem(folderName, path.Substring(0, elementEnd), true, false, parent);
+
+ currentFolderItems.Add(folderItem);
+ }
+
+ elementStart = elementEnd + 1;
+ parent = currentFolderItems[i];
+ }
+
+ leafName = path.Substring(elementStart);
+ return parent;
+ }
+
+ private static void AddChildrenInOrder(List list, TreeViewItem item)
+ {
+ if (item.children != null)
+ {
+ foreach (TreeViewItem child in item.children.Where(child => child is FolderItem))
+ {
+ list.Add(child);
+
+ AddChildrenInOrder(list, child);
+ }
+
+ foreach (TreeViewItem child in item.children.Where(child => !(child == null || child is FolderItem)))
+ {
+ list.Add(child);
+ }
+ }
+ }
+
+ protected override bool CanMultiSelect(TreeViewItem item)
+ {
+ return false;
+ }
+
+ protected override bool CanChangeExpandedState(TreeViewItem item)
+ {
+ return item.hasChildren;
+ }
+
+ protected override bool CanStartDrag(CanStartDragArgs args)
+ {
+ if (DragEnabled && args.draggedItem is LeafItem)
+ {
+ return IsDraggable((args.draggedItem as LeafItem).Data);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
+ {
+ IList items = FindRows(args.draggedItemIDs);
+
+ if (items[0] is LeafItem)
+ {
+ LeafItem item = items[0] as LeafItem;
+
+ DragAndDrop.PrepareStartDrag();
+ DragAndDrop.objectReferences = new UnityEngine.Object[] { Instantiate(item.Data) };
+
+ string title = string.Empty;
+
+ if (item.Data is EditorEventRef)
+ {
+ title = L10n.Tr("New FMOD Studio Emitter");
+ }
+ else if (item.Data is EditorBankRef)
+ {
+ title = L10n.Tr("New FMOD Studio Bank Loader");
+ }
+ else if (item.Data is EditorParamRef)
+ {
+ title = L10n.Tr("New FMOD Studio Global Parameter Trigger");
+ }
+
+ DragAndDrop.StartDrag(title);
+ }
+ }
+
+ protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
+ {
+ return DragAndDropVisualMode.None;
+ }
+
+ protected override void SearchChanged(string newSearch)
+ {
+ if (!string.IsNullOrEmpty(newSearch.Trim()))
+ {
+ expandNextFolderSet = true;
+
+ if (noSearchExpandState == null)
+ {
+ // A new search is beginning
+ noSearchExpandState = GetExpanded();
+ SetExpanded(new List());
+ }
+ }
+ else
+ {
+ if (noSearchExpandState != null)
+ {
+ // A search is ending
+ SetExpanded(noSearchExpandState);
+ noSearchExpandState = null;
+ }
+ }
+ }
+
+ public ScriptableObject SelectedObject { get; private set; }
+ public ScriptableObject DoubleClickedObject { get; private set; }
+
+ protected override void SelectionChanged(IList selectedIDs)
+ {
+ SelectedObject = null;
+
+ if (selectedIDs.Count > 0)
+ {
+ TreeViewItem item = FindItem(selectedIDs[0], rootItem);
+
+ if (item is LeafItem)
+ {
+ SelectedObject = (item as LeafItem).Data;
+ }
+ }
+ }
+
+ protected override void DoubleClickedItem(int id)
+ {
+ TreeViewItem item = FindItem(id, rootItem);
+
+ if (item is LeafItem)
+ {
+ DoubleClickedObject = (item as LeafItem).Data;
+ }
+ }
+
+ protected override void BeforeRowsGUI()
+ {
+ oldBaseIndent = baseIndent;
+ DoubleClickedObject = null;
+ }
+
+ protected override void RowGUI(RowGUIArgs args)
+ {
+ if (hasSearch)
+ {
+ // Hack to undo TreeView flattening the hierarchy when searching
+ baseIndent = oldBaseIndent + args.item.depth * depthIndentWidth;
+ }
+
+ base.RowGUI(args);
+
+ TreeViewItem item = args.item;
+
+ if (Event.current.type == EventType.MouseUp && item is FolderItem && item.hasChildren)
+ {
+ Rect rect = args.rowRect;
+ rect.xMin = GetContentIndent(item);
+
+ if (rect.Contains(Event.current.mousePosition))
+ {
+ SetExpanded(item.id, !IsExpanded(item.id));
+ Event.current.Use();
+ }
+ }
+ }
+
+ protected override void AfterRowsGUI()
+ {
+ baseIndent = oldBaseIndent;
+ }
+
+ [Serializable]
+ public class State
+ {
+ public TreeViewState baseState;
+ public List noSearchExpandState;
+ public ScriptableObject selectedObject;
+ public List itemPaths = new List();
+ public List itemIDs = new List();
+ public TypeFilter typeFilter = TypeFilter.All;
+ public bool dragEnabled = true;
+
+ public State() : this(new TreeViewState())
+ {
+ }
+
+ public State(TreeViewState baseState)
+ {
+ this.baseState = baseState;
+ }
+ }
+
+ new public State state
+ {
+ get
+ {
+ State result = new State(base.state);
+
+ if (noSearchExpandState != null)
+ {
+ result.noSearchExpandState = new List(noSearchExpandState);
+ }
+
+ result.selectedObject = SelectedObject;
+
+ foreach (var entry in itemIDs)
+ {
+ result.itemPaths.Add(entry.Key);
+ result.itemIDs.Add(entry.Value);
+ }
+
+ result.typeFilter = TypeFilter;
+ result.dragEnabled = true;
+
+ return result;
+ }
+ }
+ }
+
+ private void AffirmResources()
+ {
+ if (borderIcon == null)
+ {
+ borderIcon = EditorUtils.LoadImage("Border.png");
+
+ borderStyle = new GUIStyle(GUI.skin.box);
+ borderStyle.normal.background = borderIcon;
+ borderStyle.margin = new RectOffset();
+ }
+ }
+
+ private bool InChooserMode { get { return outputProperty != null; } }
+
+ private void OnGUI()
+ {
+ if (!IsOpen)
+ {
+ return;
+ }
+
+ AffirmResources();
+
+ if (InChooserMode)
+ {
+ GUILayout.BeginVertical(borderStyle, GUILayout.ExpandWidth(true));
+ }
+
+ treeView.searchString = searchField.OnGUI(treeView.searchString);
+
+ Rect treeRect = GUILayoutUtility.GetRect(0, 0, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
+ treeRect.y += 2;
+ treeRect.height -= 2;
+
+ treeView.OnGUI(treeRect);
+
+ if (InChooserMode)
+ {
+ GUILayout.EndVertical();
+ HandleChooserModeEvents();
+ }
+ else
+ {
+ previewArea.treeView = treeView;
+ previewArea.OnGUI(position.width, cachedMetering != null ? cachedMetering : EditorUtils.GetMetering());
+ }
+ }
+
+ private void HandleChooserModeEvents()
+ {
+ if (Event.current.isKey)
+ {
+ KeyCode keyCode = Event.current.keyCode;
+
+ if ((keyCode == KeyCode.Return || keyCode == KeyCode.KeypadEnter) && treeView.SelectedObject != null)
+ {
+ SetOutputProperty(treeView.SelectedObject);
+ Event.current.Use();
+ Close();
+ }
+ else if (keyCode == KeyCode.Escape)
+ {
+ Event.current.Use();
+ Close();
+ }
+ }
+ else if (treeView.DoubleClickedObject != null)
+ {
+ SetOutputProperty(treeView.DoubleClickedObject);
+ Close();
+ }
+ }
+
+ private void SetOutputProperty(ScriptableObject data)
+ {
+ if (data is EditorEventRef)
+ {
+ EditorEventRef eventRef = data as EditorEventRef;
+
+ outputProperty.SetEventReference(eventRef.Guid, eventRef.Path);
+
+ EditorUtils.UpdateParamsOnEmitter(outputProperty.serializedObject, eventRef.Path);
+ }
+ else if (data is EditorBankRef)
+ {
+ outputProperty.stringValue = (data as EditorBankRef).Name;
+ }
+ else if (data is EditorParamRef)
+ {
+ outputProperty.stringValue = (data as EditorParamRef).Name;
+ }
+
+ outputProperty.serializedObject.ApplyModifiedProperties();
+ }
+
+ [Serializable]
+ private class PreviewArea
+ {
+ [NonSerialized]
+ public TreeView treeView;
+
+ [NonSerialized]
+ private EditorEventRef currentEvent;
+
+ [SerializeField]
+ private DetailsView detailsView = new DetailsView();
+
+ [SerializeField]
+ private TransportControls transportControls = new TransportControls();
+
+ [SerializeField]
+ private Event3DPreview event3DPreview = new Event3DPreview();
+
+ [SerializeField]
+ private PreviewMeters meters = new PreviewMeters();
+
+ [SerializeField]
+ private EventParameterControls parameterControls = new EventParameterControls();
+
+ private GUIStyle mainStyle;
+
+ private bool isNarrow;
+
+ public bool forceRepaint { get { return transportControls.forceRepaint; } }
+
+ private void SetEvent(EditorEventRef eventRef)
+ {
+ if (eventRef != currentEvent)
+ {
+ currentEvent = eventRef;
+
+ EditorUtils.PreviewStop(PreviewEventInstance);
+ transportControls.Reset();
+ event3DPreview.Reset();
+ parameterControls.Reset();
+ }
+ }
+
+ private void AffirmResources()
+ {
+ if (mainStyle == null)
+ {
+ mainStyle = new GUIStyle(GUI.skin.box);
+ mainStyle.margin = new RectOffset();
+ }
+ }
+
+ public void OnGUI(float width, float[] metering)
+ {
+ isNarrow = width < 600;
+
+ AffirmResources();
+
+ ScriptableObject selectedObject = treeView.SelectedObject;
+
+ if (selectedObject is EditorEventRef)
+ {
+ SetEvent(selectedObject as EditorEventRef);
+ }
+ else
+ {
+ SetEvent(null);
+ }
+
+ if (selectedObject != null)
+ {
+ GUILayout.BeginVertical(mainStyle, GUILayout.ExpandWidth(true));
+
+ if (selectedObject is EditorEventRef)
+ {
+ EditorEventRef eventRef = selectedObject as EditorEventRef;
+
+ if (eventRef.Path.StartsWith("event:"))
+ {
+ DrawEventPreview(eventRef, metering);
+ }
+ else if (eventRef.Path.StartsWith("snapshot:"))
+ {
+ detailsView.DrawSnapshot(eventRef);
+ }
+ }
+ else if (selectedObject is EditorBankRef)
+ {
+ detailsView.DrawBank(selectedObject as EditorBankRef);
+ }
+ else if (selectedObject is EditorParamRef)
+ {
+ detailsView.DrawParameter(selectedObject as EditorParamRef);
+ }
+
+ GUILayout.EndVertical();
+ }
+ }
+
+ private void DrawSeparatorLine()
+ {
+ GUILayout.Box(GUIContent.none, GUILayout.Height(1), GUILayout.ExpandWidth(true));
+ }
+
+ private void DrawEventPreview(EditorEventRef eventRef, float[] metering)
+ {
+ detailsView.DrawEvent(eventRef, isNarrow);
+
+ DrawSeparatorLine();
+
+ // Playback controls, 3D Preview and meters
+ EditorGUILayout.BeginHorizontal(GUILayout.Height(event3DPreview.Height));
+ GUILayout.FlexibleSpace();
+
+ EditorGUILayout.BeginVertical();
+
+ if (!isNarrow)
+ {
+ GUILayout.FlexibleSpace();
+ }
+
+ transportControls.OnGUI(eventRef, parameterControls.ParameterValues);
+
+ if (isNarrow)
+ {
+ EditorGUILayout.Separator();
+ meters.OnGUI(true, metering);
+ }
+ else
+ {
+ GUILayout.FlexibleSpace();
+ }
+
+ EditorGUILayout.EndVertical();
+
+ event3DPreview.OnGUI(eventRef);
+
+ if (!isNarrow)
+ {
+ meters.OnGUI(false, metering);
+ }
+
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.EndHorizontal();
+
+ DrawSeparatorLine();
+
+ parameterControls.OnGUI(eventRef);
+ }
+ }
+
+ [Serializable]
+ private class DetailsView
+ {
+ private Texture copyIcon;
+ private GUIStyle textFieldNameStyle;
+
+ private void AffirmResources()
+ {
+ if (copyIcon == null)
+ {
+ copyIcon = EditorUtils.LoadImage("CopyIcon.png");
+
+ textFieldNameStyle = new GUIStyle(EditorStyles.label);
+ textFieldNameStyle.fontStyle = FontStyle.Bold;
+ }
+ }
+
+ public void DrawEvent(EditorEventRef selectedEvent, bool isNarrow)
+ {
+ AffirmResources();
+
+ DrawCopyableTextField(L10n.Tr("Full Path"), selectedEvent.Path);
+
+ DrawTextField(L10n.Tr("Banks"), string.Join(", ", selectedEvent.Banks.Select(x => x.Name).ToArray()));
+
+ EditorGUILayout.BeginHorizontal();
+ DrawTextField(L10n.Tr("Panning"), selectedEvent.Is3D ? "3D" : "2D");
+ DrawTextField(L10n.Tr("Oneshot"), selectedEvent.IsOneShot.ToString());
+
+ TimeSpan t = TimeSpan.FromMilliseconds(selectedEvent.Length);
+ DrawTextField(L10n.Tr("Length"), selectedEvent.Length > 0 ? string.Format("{0:D2}:{1:D2}:{2:D3}", t.Minutes, t.Seconds, t.Milliseconds) : "N/A");
+
+ if (!isNarrow) DrawTextField(L10n.Tr("Streaming"), selectedEvent.IsStream.ToString());
+ EditorGUILayout.EndHorizontal();
+ if (isNarrow) DrawTextField(L10n.Tr("Streaming"), selectedEvent.IsStream.ToString());
+ }
+
+ public void DrawSnapshot(EditorEventRef eventRef)
+ {
+ AffirmResources();
+
+ DrawCopyableTextField(L10n.Tr("Full Path"), eventRef.Path);
+ }
+
+ public void DrawBank(EditorBankRef bank)
+ {
+ AffirmResources();
+
+ DrawCopyableTextField(L10n.Tr("Full Path"), "bank:/" + bank.Name);
+
+ string[] SizeSuffix = { "B", "KB", "MB", "GB" };
+
+ GUILayout.Label(L10n.Tr("Platform Bank Sizes"), textFieldNameStyle);
+
+ EditorGUI.indentLevel++;
+
+ foreach (var sizeInfo in bank.FileSizes)
+ {
+ int order = 0;
+ long size = sizeInfo.Value;
+
+ while (size >= 1024 && order + 1 < SizeSuffix.Length)
+ {
+ order++;
+ size /= 1024;
+ }
+
+ EditorGUILayout.LabelField(sizeInfo.Name, string.Format("{0} {1}", size, SizeSuffix[order]));
+ }
+
+ EditorGUI.indentLevel--;
+ }
+
+ public void DrawParameter(EditorParamRef parameter)
+ {
+ AffirmResources();
+
+ DrawCopyableTextField(L10n.Tr("Name"), parameter.Name);
+ DrawCopyableTextField("ID",
+ string.Format("{{ data1 = 0x{0:x8}, data2 = 0x{1:x8} }}", parameter.ID.data1, parameter.ID.data2));
+ DrawTextField(L10n.Tr("Minimum"), parameter.Min.ToString());
+ DrawTextField(L10n.Tr("Maximum"), parameter.Max.ToString());
+ }
+
+ private void DrawCopyableTextField(string name, string value)
+ {
+ EditorGUILayout.BeginHorizontal();
+ DrawTextField(name, value);
+ if (GUILayout.Button(copyIcon, GUILayout.ExpandWidth(false)))
+ {
+ EditorGUIUtility.systemCopyBuffer = value;
+ }
+ EditorGUILayout.EndHorizontal();
+ }
+
+ private void DrawTextField(string name, string content)
+ {
+ EditorGUILayout.BeginHorizontal();
+
+ GUILayout.Label(name, textFieldNameStyle, GUILayout.Width(75));
+ GUILayout.Label(content);
+
+ EditorGUILayout.EndHorizontal();
+ }
+ }
+
+ [Serializable]
+ private class TransportControls
+ {
+ private Texture playOff;
+ private Texture playOn;
+ private Texture stopOff;
+ private Texture stopOn;
+ private Texture openIcon;
+ private GUIStyle buttonStyle;
+
+ public bool forceRepaint { get; private set; }
+
+ public void Reset()
+ {
+ forceRepaint = false;
+ }
+
+ private void AffirmResources()
+ {
+ if (playOff == null)
+ {
+ playOff = EditorUtils.LoadImage("TransportPlayButtonOff.png");
+ playOn = EditorUtils.LoadImage("TransportPlayButtonOn.png");
+ stopOff = EditorUtils.LoadImage("TransportStopButtonOff.png");
+ stopOn = EditorUtils.LoadImage("TransportStopButtonOn.png");
+ openIcon = EditorUtils.LoadImage("transportOpen.png");
+
+ buttonStyle = new GUIStyle();
+ buttonStyle.padding.left = 4;
+ buttonStyle.padding.top = 10;
+ }
+ }
+
+ public void OnGUI(EditorEventRef selectedEvent, Dictionary parameterValues)
+ {
+ AffirmResources();
+
+ FMOD.Studio.PLAYBACK_STATE previewState = FMOD.Studio.PLAYBACK_STATE.STOPPED;
+ bool paused = false;
+
+ if (PreviewEventInstance.isValid())
+ {
+ PreviewEventInstance.getPlaybackState(out previewState);
+ PreviewEventInstance.getPaused(out paused);
+ }
+
+ bool playing = previewState == FMOD.Studio.PLAYBACK_STATE.PLAYING;
+ bool stopped = previewState == FMOD.Studio.PLAYBACK_STATE.STOPPED;
+
+ EditorGUILayout.BeginHorizontal();
+
+ if (GUILayout.Button(stopped || paused ? stopOn : stopOff, buttonStyle, GUILayout.ExpandWidth(false)))
+ {
+ forceRepaint = false;
+
+ if (paused)
+ {
+ EditorUtils.PreviewStop(PreviewEventInstance);
+ PreviewEventInstance.release();
+ PreviewEventInstance.clearHandle();
+ }
+ if (playing)
+ {
+ EditorUtils.PreviewPause(PreviewEventInstance);
+ }
+ }
+ if (GUILayout.Button(playing ? playOn : playOff, buttonStyle, GUILayout.ExpandWidth(false)))
+ {
+ if (paused)
+ {
+ EditorUtils.PreviewPause(PreviewEventInstance);
+ }
+ else
+ {
+ if (PreviewEventInstance.isValid())
+ {
+ EditorUtils.PreviewStop(PreviewEventInstance);
+ }
+ PreviewEventInstance = EditorUtils.PreviewEvent(selectedEvent, parameterValues);
+ }
+
+ forceRepaint = true;
+ }
+ if (GUILayout.Button(new GUIContent(openIcon, L10n.Tr("Show Event in FMOD Studio")), buttonStyle, GUILayout.ExpandWidth(false)))
+ {
+ string cmd = string.Format("studio.window.navigateTo(studio.project.lookup(\"{0}\"))", selectedEvent.Guid);
+ EditorUtils.SendScriptCommand(cmd);
+ }
+
+ EditorGUILayout.EndHorizontal();
+ }
+ }
+
+ [Serializable]
+ private class Event3DPreview
+ {
+ private bool isDragging;
+ private Rect arenaRect;
+
+ private Vector2 eventPosition;
+ private float eventDistance = 0;
+ private float eventOrientation = 0;
+
+ private Texture arena;
+ private Texture emitter;
+
+ public void Reset()
+ {
+ eventPosition = new Vector2(0, 0);
+ eventDistance = 0;
+ eventOrientation = 0;
+ }
+
+ private void AffirmResources()
+ {
+ if (arena == null)
+ {
+ arena = EditorUtils.LoadImage("Preview.png");
+ emitter = EditorUtils.LoadImage("PreviewEmitter.png");
+ }
+ }
+
+ public float Height
+ {
+ get
+ {
+ AffirmResources();
+ return GUI.skin.label.CalcSize(new GUIContent(arena)).y;
+ }
+ }
+
+ public void OnGUI(EditorEventRef selectedEvent)
+ {
+ AffirmResources();
+
+ var originalColour = GUI.color;
+ if (!selectedEvent.Is3D)
+ {
+ GUI.color = new Color(1.0f, 1.0f, 1.0f, 0.1f);
+ }
+
+ GUILayout.Label(arena, GUILayout.ExpandWidth(false));
+
+ if (Event.current.type == EventType.Repaint)
+ {
+ arenaRect = GUILayoutUtility.GetLastRect();
+ }
+
+ Vector2 center = arenaRect.center;
+ Rect rect2 = new Rect(center.x + eventPosition.x - 6, center.y + eventPosition.y - 6, 12, 12);
+ GUI.DrawTexture(rect2, emitter);
+
+ GUI.color = originalColour;
+
+ if (selectedEvent.Is3D)
+ {
+ bool useGUIEvent = false;
+
+ switch (Event.current.type)
+ {
+ case EventType.MouseDown:
+ if (arenaRect.Contains(Event.current.mousePosition))
+ {
+ isDragging = true;
+ useGUIEvent = true;
+ }
+ break;
+ case EventType.MouseUp:
+ if (isDragging)
+ {
+ isDragging = false;
+ useGUIEvent = true;
+ }
+ break;
+ case EventType.MouseDrag:
+ if (isDragging)
+ {
+ useGUIEvent = true;
+ }
+ break;
+ }
+
+ if (useGUIEvent)
+ {
+ Vector2 newPosition = Event.current.mousePosition;
+ Vector2 delta = newPosition - center;
+
+ float maximumDistance = (arena.width - emitter.width) / 2;
+ float distance = Math.Min(delta.magnitude, maximumDistance);
+
+ delta.Normalize();
+ eventPosition = delta * distance;
+ eventDistance = distance / maximumDistance * selectedEvent.MaxDistance;
+
+ float angle = Mathf.Atan2(delta.y, delta.x);
+ eventOrientation = angle + Mathf.PI * 0.5f;
+
+ Event.current.Use();
+ }
+ }
+
+ if (PreviewEventInstance.isValid())
+ {
+ // Listener at origin
+ FMOD.ATTRIBUTES_3D pos = new FMOD.ATTRIBUTES_3D();
+ pos.position.x = (float)Math.Sin(eventOrientation) * eventDistance;
+ pos.position.y = (float)Math.Cos(eventOrientation) * eventDistance;
+ pos.forward.x = 1.0f;
+ pos.up.z = 1.0f;
+ PreviewEventInstance.set3DAttributes(pos);
+ }
+ }
+ }
+
+ [Serializable]
+ private class EventParameterControls
+ {
+ [NonSerialized]
+ private Dictionary parameterValues = new Dictionary();
+
+ [NonSerialized]
+ private Vector2 scrollPosition;
+
+ [NonSerialized]
+ private bool showGlobalParameters;
+
+ public Dictionary ParameterValues { get { return parameterValues; } }
+
+ public void Reset()
+ {
+ parameterValues.Clear();
+ }
+
+ public void OnGUI(EditorEventRef selectedEvent)
+ {
+ scrollPosition = GUILayout.BeginScrollView(scrollPosition,
+ GUILayout.Height(EditorGUIUtility.singleLineHeight * 7f));
+
+ foreach (EditorParamRef paramRef in selectedEvent.LocalParameters)
+ {
+ if (!parameterValues.ContainsKey(paramRef.Name))
+ {
+ parameterValues[paramRef.Name] = paramRef.Default;
+ }
+
+ CreateParamRefSlider(paramRef);
+ }
+
+ showGlobalParameters = selectedEvent.GlobalParameters.Count > 0 &&
+ EditorGUI.Foldout(EditorGUILayout.GetControlRect(), showGlobalParameters, L10n.Tr("Global Parameters"));
+
+ foreach (EditorParamRef paramRef in selectedEvent.GlobalParameters)
+ {
+ if (!parameterValues.ContainsKey(paramRef.Name))
+ {
+ parameterValues[paramRef.Name] = paramRef.Default;
+ }
+
+ if (showGlobalParameters)
+ {
+ CreateParamRefSlider(paramRef, true);
+ }
+ }
+
+ GUILayout.EndScrollView();
+ }
+
+ public void CreateParamRefSlider(EditorParamRef paramRef, bool isGlobal = false)
+ {
+ if (paramRef.Type == ParameterType.Labeled)
+ {
+ parameterValues[paramRef.Name] = EditorGUILayout.IntPopup(
+ paramRef.Name, (int)parameterValues[paramRef.Name], paramRef.Labels, null);
+ }
+ else if (paramRef.Type == ParameterType.Discrete)
+ {
+ parameterValues[paramRef.Name] = EditorGUILayout.IntSlider(
+ paramRef.Name, (int)parameterValues[paramRef.Name], (int)paramRef.Min, (int)paramRef.Max);
+ }
+ else
+ {
+ parameterValues[paramRef.Name] = EditorGUILayout.Slider(
+ paramRef.Name, parameterValues[paramRef.Name], paramRef.Min, paramRef.Max);
+ }
+
+ if (isGlobal)
+ {
+ EditorUtils.System.setParameterByID(paramRef.ID, parameterValues[paramRef.Name]);
+ }
+ else
+ {
+ if (PreviewEventInstance.isValid())
+ {
+ PreviewEventInstance.setParameterByID(paramRef.ID, parameterValues[paramRef.Name]);
+ }
+ }
+ }
+ }
+
+ [Serializable]
+ private class PreviewMeters
+ {
+ private Texture meterOn;
+ private Texture meterOff;
+
+ private void AffirmResources()
+ {
+ if (meterOn == null)
+ {
+ meterOn = EditorUtils.LoadImage("LevelMeter.png");
+ meterOff = EditorUtils.LoadImage("LevelMeterOff.png");
+ }
+ }
+
+ public void OnGUI(bool minimized, float[] metering)
+ {
+ AffirmResources();
+
+ int meterHeight = minimized ? 86 : 128;
+ int meterWidth = (int)((128 / (float)meterOff.height) * meterOff.width);
+
+ List meterPositions = meterPositionsForSpeakerMode(speakerModeForChannelCount(metering.Length), meterWidth, 2, 6);
+
+ const int MeterCountMaximum = 16;
+
+ int minimumWidth = meterWidth * MeterCountMaximum;
+
+ Rect fullRect = GUILayoutUtility.GetRect(minimumWidth, meterHeight,
+ GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
+
+ float baseX = fullRect.x + (fullRect.width - (meterWidth * metering.Length)) / 2;
+
+ for(int i = 0; i < metering.Length; i++)
+ {
+ Rect meterRect = new Rect(baseX + meterPositions[i], fullRect.y, meterWidth, fullRect.height);
+
+ GUI.DrawTexture(meterRect, meterOff);
+
+ float db = 20.0f * Mathf.Log10(metering[i] * Mathf.Sqrt(2.0f));
+ db = Mathf.Clamp(db, -80.0f, 10.0f);
+ float visible = 0;
+ int[] segmentPixels = new int[] { 0, 18, 38, 60, 89, 130, 187, 244, 300 };
+ float[] segmentDB = new float[] { -80.0f, -60.0f, -50.0f, -40.0f, -30.0f, -20.0f, -10.0f, 0, 10.0f };
+ int segment = 1;
+ while (segmentDB[segment] < db)
+ {
+ segment++;
+ }
+ visible = segmentPixels[segment - 1] + ((db - segmentDB[segment - 1]) / (segmentDB[segment] - segmentDB[segment - 1])) * (segmentPixels[segment] - segmentPixels[segment - 1]);
+
+ visible *= fullRect.height / (float)meterOff.height;
+
+ Rect levelPosRect = new Rect(meterRect.x, fullRect.height - visible + meterRect.y, meterWidth, visible);
+ Rect levelUVRect = new Rect(0, 0, 1.0f, visible / fullRect.height);
+ GUI.DrawTextureWithTexCoords(levelPosRect, meterOn, levelUVRect);
+ }
+ }
+
+ private FMOD.SPEAKERMODE speakerModeForChannelCount(int channelCount)
+ {
+ switch(channelCount)
+ {
+ case 1:
+ return FMOD.SPEAKERMODE.MONO;
+ case 4:
+ return FMOD.SPEAKERMODE.QUAD;
+ case 5:
+ return FMOD.SPEAKERMODE.SURROUND;
+ case 6:
+ return FMOD.SPEAKERMODE._5POINT1;
+ case 8:
+ return FMOD.SPEAKERMODE._7POINT1;
+ case 12:
+ return FMOD.SPEAKERMODE._7POINT1POINT4;
+ default:
+ return FMOD.SPEAKERMODE.STEREO;
+ }
+ }
+
+ private List meterPositionsForSpeakerMode(FMOD.SPEAKERMODE mode, float meterWidth, float groupGap, float lfeGap)
+ {
+ List offsets = new List();
+
+ switch(mode)
+ {
+ case FMOD.SPEAKERMODE.MONO: // M
+ offsets.Add(0);
+ break;
+
+ case FMOD.SPEAKERMODE.STEREO: // L R
+ offsets.Add(0);
+ offsets.Add(meterWidth);
+ break;
+
+ case FMOD.SPEAKERMODE.QUAD:
+ switch(Settings.Instance.MeterChannelOrdering)
+ {
+ case MeterChannelOrderingType.Standard:
+ case MeterChannelOrderingType.SeparateLFE: // L R | LS RS
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // LS
+ offsets.Add(meterWidth*3 + groupGap); // RS
+ break;
+ case MeterChannelOrderingType.Positional: // LS | L R | RS
+ offsets.Add(meterWidth*1 + groupGap); // L
+ offsets.Add(meterWidth*2 + groupGap); // R
+ offsets.Add(0); // LS
+ offsets.Add(meterWidth*3 + groupGap*2); // RS
+ break;
+ }
+ break;
+
+ case FMOD.SPEAKERMODE.SURROUND:
+ switch(Settings.Instance.MeterChannelOrdering)
+ {
+ case MeterChannelOrderingType.Standard:
+ case MeterChannelOrderingType.SeparateLFE: // L R | C | LS RS
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*3 + groupGap*2); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ break;
+ case MeterChannelOrderingType.Positional: // LS | L C R | RS
+ offsets.Add(meterWidth*1 + groupGap); // L
+ offsets.Add(meterWidth*3 + groupGap); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(0); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ break;
+ }
+ break;
+
+ case FMOD.SPEAKERMODE._5POINT1:
+ switch(Settings.Instance.MeterChannelOrdering)
+ {
+ case MeterChannelOrderingType.Standard: // L R | C | LFE | LS RS
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*3 + groupGap*2); // LFE
+ offsets.Add(meterWidth*4 + groupGap*3); // LS
+ offsets.Add(meterWidth*5 + groupGap*3); // RS
+ break;
+ case MeterChannelOrderingType.SeparateLFE: // L R | C | LS RS || LFE
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*5 + groupGap*2 + lfeGap); // LFE
+ offsets.Add(meterWidth*3 + groupGap*2); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ break;
+ case MeterChannelOrderingType.Positional: // LS | L C R | RS || LFE
+ offsets.Add(meterWidth*1 + groupGap); // L
+ offsets.Add(meterWidth*3 + groupGap); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*5 + groupGap*2 + lfeGap); // LFE
+ offsets.Add(0); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ break;
+ }
+ break;
+
+ case FMOD.SPEAKERMODE._7POINT1:
+ switch(Settings.Instance.MeterChannelOrdering)
+ {
+ case MeterChannelOrderingType.Standard: // L R | C | LFE | LS RS | LSR RSR
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*3 + groupGap*2); // LFE
+ offsets.Add(meterWidth*4 + groupGap*3); // LS
+ offsets.Add(meterWidth*5 + groupGap*3); // RS
+ offsets.Add(meterWidth*6 + groupGap*4); // LSR
+ offsets.Add(meterWidth*7 + groupGap*4); // RSR
+ break;
+ case MeterChannelOrderingType.SeparateLFE: // L R | C | LS RS | LSR RSR || LFE
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*7 + groupGap*3 + lfeGap); // LFE
+ offsets.Add(meterWidth*3 + groupGap*2); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ offsets.Add(meterWidth*5 + groupGap*3); // LSR
+ offsets.Add(meterWidth*6 + groupGap*3); // RSR
+ break;
+ case MeterChannelOrderingType.Positional: // LSR LS | L C R | RS RSR || LFE
+ offsets.Add(meterWidth*2 + groupGap); // L
+ offsets.Add(meterWidth*4 + groupGap); // R
+ offsets.Add(meterWidth*3 + groupGap); // C
+ offsets.Add(meterWidth*7 + groupGap*2 + lfeGap); // LFE
+ offsets.Add(meterWidth*1); // LS
+ offsets.Add(meterWidth*5 + groupGap*2); // RS
+ offsets.Add(0); // LSR
+ offsets.Add(meterWidth*6 + groupGap*2); // RSR
+ break;
+ }
+ break;
+
+ case FMOD.SPEAKERMODE._7POINT1POINT4:
+ switch(Settings.Instance.MeterChannelOrdering)
+ {
+ case MeterChannelOrderingType.Standard: // L R | C | LFE | LS RS | LSR RSR | TFL TFR TBL TBR
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*3 + groupGap*2); // LFE
+ offsets.Add(meterWidth*4 + groupGap*3); // LS
+ offsets.Add(meterWidth*5 + groupGap*3); // RS
+ offsets.Add(meterWidth*6 + groupGap*4); // LSR
+ offsets.Add(meterWidth*7 + groupGap*4); // RSR
+ offsets.Add(meterWidth*8 + groupGap*5); // TFL
+ offsets.Add(meterWidth*9 + groupGap*5); // TFR
+ offsets.Add(meterWidth*10 + groupGap*5); // TBL
+ offsets.Add(meterWidth*11 + groupGap*5); // TBR
+ break;
+ case MeterChannelOrderingType.SeparateLFE: // L R | C | LS RS | LSR RSR | TFL TFR TBL TBR || LFE
+ offsets.Add(0); // L
+ offsets.Add(meterWidth*1); // R
+ offsets.Add(meterWidth*2 + groupGap); // C
+ offsets.Add(meterWidth*11 + groupGap*4 + lfeGap); // LFE
+ offsets.Add(meterWidth*3 + groupGap*2); // LS
+ offsets.Add(meterWidth*4 + groupGap*2); // RS
+ offsets.Add(meterWidth*5 + groupGap*3); // LSR
+ offsets.Add(meterWidth*6 + groupGap*3); // RSR
+ offsets.Add(meterWidth*7 + groupGap*4); // TFL
+ offsets.Add(meterWidth*8 + groupGap*4); // TFR
+ offsets.Add(meterWidth*9 + groupGap*4); // TBL
+ offsets.Add(meterWidth*10 + groupGap*4); // TBR
+ break;
+ case MeterChannelOrderingType.Positional: // LSR LS | L C R | RS RSR | TBL TFL TFR TBR || LFE
+ offsets.Add(meterWidth*2 + groupGap); // L
+ offsets.Add(meterWidth*4 + groupGap); // R
+ offsets.Add(meterWidth*3 + groupGap); // C
+ offsets.Add(meterWidth*11 + groupGap*3 + lfeGap); // LFE
+ offsets.Add(meterWidth*1); // LS
+ offsets.Add(meterWidth*5 + groupGap*2); // RS
+ offsets.Add(0); // LSR
+ offsets.Add(meterWidth*6 + groupGap*2); // RSR
+ offsets.Add(meterWidth*8 + groupGap*3); // TFL
+ offsets.Add(meterWidth*9 + groupGap*3); // TFR
+ offsets.Add(meterWidth*7 + groupGap*3); // TBL
+ offsets.Add(meterWidth*10 + groupGap*3); // TBR
+ break;
+ }
+ break;
+ }
+
+ return offsets;
+ }
+ }
+
+ [Flags]
+ private enum TypeFilter
+ {
+ Event = 1,
+ Bank = 2,
+ Parameter = 4,
+ All = Event | Bank | Parameter,
+ }
+
+ public void ChooseEvent(SerializedProperty property)
+ {
+ BeginInspectorPopup(property, TypeFilter.Event);
+
+ SerializedProperty pathProperty = property.FindPropertyRelative(L10n.Tr("Path"));
+
+ if (!string.IsNullOrEmpty(pathProperty.stringValue))
+ {
+ treeView.JumpToEvent(pathProperty.stringValue);
+ }
+ }
+
+ public void ChooseBank(SerializedProperty property)
+ {
+ BeginInspectorPopup(property, TypeFilter.Bank);
+
+ if (!string.IsNullOrEmpty(property.stringValue))
+ {
+ treeView.JumpToBank(property.stringValue);
+ }
+ }
+
+ public void ChooseParameter(SerializedProperty property)
+ {
+ BeginInspectorPopup(property, TypeFilter.Parameter);
+ }
+
+ public void FrameEvent(string path)
+ {
+ treeView.JumpToEvent(path);
+ }
+
+ private void BeginInspectorPopup(SerializedProperty property, TypeFilter typeFilter)
+ {
+ treeView.TypeFilter = typeFilter;
+ outputProperty = property;
+ searchField.SetFocus();
+ treeView.DragEnabled = false;
+ ReadEventCache();
+ }
+
+ private void BeginStandaloneWindow()
+ {
+ treeView.TypeFilter = TypeFilter.All;
+ outputProperty = null;
+ searchField.SetFocus();
+ treeView.DragEnabled = true;
+ isStandaloneWindow = true;
+ }
+
+ public void OnEnable()
+ {
+ if (treeViewState == null)
+ {
+ treeViewState = new TreeView.State();
+ }
+
+ searchField = new SearchField();
+ treeView = new TreeView(treeViewState);
+
+ // Delay accessing the event cache as this will cause an error if window is opened on Unity start up.
+ EditorApplication.delayCall += () =>
+ {
+ ReadEventCache();
+
+ searchField.downOrUpArrowKeyPressed += treeView.SetFocus;
+
+ SceneView.duringSceneGui += SceneUpdate;
+
+ EditorApplication.hierarchyWindowItemOnGUI += HierarchyUpdate;
+
+ if (isStandaloneWindow)
+ {
+ EditorUtils.LoadPreviewBanks();
+ }
+
+ IsOpen = true;
+ Repaint();
+ };
+ }
+
+ public void OnDestroy()
+ {
+ if (PreviewEventInstance.isValid())
+ {
+ EditorUtils.PreviewStop(PreviewEventInstance);
+ PreviewEventInstance.clearHandle();
+ }
+
+ if (isStandaloneWindow)
+ {
+ EditorUtils.UnloadPreviewBanks();
+ }
+
+ IsOpen = false;
+ }
+
+ private static bool IsDraggable(UnityEngine.Object data)
+ {
+ return data is EditorEventRef || data is EditorBankRef || data is EditorParamRef;
+ }
+
+ public static bool IsDroppable(UnityEngine.Object[] data)
+ {
+ return data.Length > 0 && IsDraggable(data[0]);
+ }
+
+ // This is an event handler on the hierachy view to handle dragging our objects from the browser
+ private void HierarchyUpdate(int instance, Rect rect)
+ {
+ if (Event.current.type == EventType.DragPerform && rect.Contains(Event.current.mousePosition))
+ {
+ if (IsDroppable(DragAndDrop.objectReferences))
+ {
+ UnityEngine.Object data = DragAndDrop.objectReferences[0];
+
+ GameObject target = EditorUtility.InstanceIDToObject(instance) as GameObject;
+
+ if (data is EditorEventRef)
+ {
+ Undo.SetCurrentGroupName(L10n.Tr("Add Studio Event Emitter"));
+
+ StudioEventEmitter emitter = Undo.AddComponent(target);
+
+ EditorEventRef eventRef = data as EditorEventRef;
+ emitter.EventReference.Path = eventRef.Path;
+ emitter.EventReference.Guid = eventRef.Guid;
+ }
+ else if (data is EditorBankRef)
+ {
+ Undo.SetCurrentGroupName(L10n.Tr("Add Studio Bank Loader"));
+
+ StudioBankLoader loader = Undo.AddComponent(target);
+ loader.Banks = new List();
+ loader.Banks.Add((data as EditorBankRef).Name);
+ }
+ else // data is EditorParamRef
+ {
+ Undo.SetCurrentGroupName(L10n.Tr("Add Studio Global Parameter Trigger"));
+
+ StudioGlobalParameterTrigger trigger = Undo.AddComponent(target);
+ trigger.Parameter = (data as EditorParamRef).Name;
+ }
+
+ Selection.activeObject = target;
+
+ Event.current.Use();
+ }
+ }
+ }
+
+ // This is an event handler on the scene view to handle dragging our objects from the browser
+ // and creating new gameobjects
+ private void SceneUpdate(SceneView sceneView)
+ {
+ if (Event.current.type == EventType.DragPerform && IsDroppable(DragAndDrop.objectReferences))
+ {
+ UnityEngine.Object data = DragAndDrop.objectReferences[0];
+ GameObject newObject;
+
+ if (data is EditorEventRef)
+ {
+ EditorEventRef eventRef = data as EditorEventRef;
+
+ string path = eventRef.Path;
+
+ string name = path.Substring(path.LastIndexOf("/") + 1);
+ newObject = new GameObject(name + " Emitter");
+
+ StudioEventEmitter emitter = newObject.AddComponent();
+ emitter.EventReference.Path = path;
+ emitter.EventReference.Guid = eventRef.Guid;
+
+ Undo.RegisterCreatedObjectUndo(newObject, L10n.Tr("Create Studio Event Emitter"));
+ }
+ else if (data is EditorBankRef)
+ {
+ newObject = new GameObject("Studio Bank Loader");
+
+ StudioBankLoader loader = newObject.AddComponent();
+ loader.Banks = new List();
+ loader.Banks.Add((data as EditorBankRef).Name);
+
+ Undo.RegisterCreatedObjectUndo(newObject, L10n.Tr("Create Studio Bank Loader"));
+ }
+ else // data is EditorParamRef
+ {
+ string name = (data as EditorParamRef).Name;
+
+ newObject = new GameObject(name + " Trigger");
+
+ StudioGlobalParameterTrigger trigger = newObject.AddComponent();
+ trigger.Parameter = name;
+
+ Undo.RegisterCreatedObjectUndo(newObject, L10n.Tr("Create Studio Global Parameter Trigger"));
+ }
+
+ Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
+ object hit = HandleUtility.RaySnap(ray);
+
+ if (hit != null)
+ {
+ newObject.transform.position = ((RaycastHit)hit).point;
+ }
+ else
+ {
+ newObject.transform.position = ray.origin + ray.direction * 10.0f;
+ }
+
+ Selection.activeObject = newObject;
+ Event.current.Use();
+ }
+ else if (Event.current.type == EventType.DragUpdated && IsDroppable(DragAndDrop.objectReferences))
+ {
+ DragAndDrop.visualMode = DragAndDropVisualMode.Move;
+ DragAndDrop.AcceptDrag();
+ Event.current.Use();
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs.meta b/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs.meta
new file mode 100644
index 00000000..c5714f4c
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventBrowser.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5332ad2baabb58844975479e906001c8
+timeCreated: 1432613753
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EventCache.cs b/Assets/Plugins/FMOD/src/Editor/EventCache.cs
new file mode 100644
index 00000000..79e6c144
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventCache.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace FMODUnity
+{
+ public class EventCache : ScriptableObject
+ {
+ [SerializeField]
+ public List EditorBanks;
+ [SerializeField]
+ public List EditorEvents;
+ [SerializeField]
+ public List EditorParameters;
+ [SerializeField]
+ public List MasterBanks;
+ [SerializeField]
+ public List StringsBanks;
+ [SerializeField]
+ private Int64 cacheTime;
+ [SerializeField]
+ public int cacheVersion;
+
+ public DateTime CacheTime
+ {
+ get { return new DateTime(cacheTime); }
+ set { cacheTime = value.Ticks; }
+ }
+
+ public EventCache()
+ {
+ EditorBanks = new List();
+ EditorEvents = new List();
+ EditorParameters = new List();
+ MasterBanks = new List();
+ StringsBanks = new List();
+ cacheTime = 0;
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EventCache.cs.meta b/Assets/Plugins/FMOD/src/Editor/EventCache.cs.meta
new file mode 100644
index 00000000..13509d0c
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventCache.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d32cf7c32a3ed8347bac48ef5ed56d82
+timeCreated: 1432775088
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EventManager.cs b/Assets/Plugins/FMOD/src/Editor/EventManager.cs
new file mode 100644
index 00000000..db61ceda
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventManager.cs
@@ -0,0 +1,1368 @@
+using UnityEngine;
+using UnityEditor;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using UnityEditor.Build;
+using System.Reflection;
+using UnityEditor.Build.Reporting;
+using UnityEngine.SceneManagement;
+
+namespace FMODUnity
+{
+ [InitializeOnLoad]
+ public class EventManager : MonoBehaviour
+ {
+ private const string FMODLabel = "FMOD";
+
+ private const string AssetsFolderName = "Assets";
+
+ private const string CacheAssetName = "FMODStudioCache";
+ public static string CacheAssetFullName = EditorUtils.WritableAssetPath(CacheAssetName);
+ private static EventCache eventCache;
+
+ private const string StringBankExtension = "strings.bank";
+ private const string BankExtension = "bank";
+
+#if UNITY_EDITOR
+ [MenuItem("FMOD/Refresh Banks", priority = 1)]
+ public static void RefreshBanks()
+ {
+ string result = UpdateCache();
+
+ if (eventCache != null)
+ {
+ OnCacheChange();
+ if (Settings.Instance.ImportType == ImportType.AssetBundle)
+ {
+ UpdateBankStubAssets(EditorUserBuildSettings.activeBuildTarget);
+ }
+ }
+
+ BankRefresher.HandleBankRefresh(result);
+ }
+#endif
+
+ private static void ClearCache()
+ {
+ eventCache.CacheTime = DateTime.MinValue;
+ eventCache.EditorBanks.Clear();
+ eventCache.EditorEvents.Clear();
+ eventCache.EditorParameters.Clear();
+ eventCache.StringsBanks.Clear();
+ eventCache.MasterBanks.Clear();
+ if (Settings.Instance && Settings.Instance.BanksToLoad != null)
+ Settings.Instance.BanksToLoad.Clear();
+ }
+
+ private static void AffirmEventCache()
+ {
+ if (eventCache == null)
+ {
+ UpdateCache();
+ }
+ }
+
+ private static string UpdateCache()
+ {
+ if (eventCache == null)
+ {
+ eventCache = AssetDatabase.LoadAssetAtPath(CacheAssetFullName, typeof(EventCache)) as EventCache;
+
+ // If new libraries need to be staged, or the staging process is in progress, clear the cache and exit.
+ if (StagingSystem.SourceLibsExist)
+ {
+ if (eventCache != null)
+ {
+ ClearCache();
+ }
+ return null;
+ }
+
+ if (eventCache == null || eventCache.cacheVersion != FMOD.VERSION.number)
+ {
+ RuntimeUtils.DebugLog("FMOD: Event cache is missing or in an old format; creating a new instance.");
+
+ eventCache = ScriptableObject.CreateInstance();
+ eventCache.cacheVersion = FMOD.VERSION.number;
+
+ Directory.CreateDirectory(Path.GetDirectoryName(CacheAssetFullName));
+ AssetDatabase.CreateAsset(eventCache, CacheAssetFullName);
+ }
+ }
+
+ var settings = Settings.Instance;
+ var editorSettings = EditorSettings.Instance;
+
+ if (string.IsNullOrEmpty(settings.SourceBankPath))
+ {
+ ClearCache();
+ return null;
+ }
+
+ string defaultBankFolder = null;
+
+ if (!settings.HasPlatforms)
+ {
+ defaultBankFolder = settings.SourceBankPath;
+ }
+ else
+ {
+ Platform platform = editorSettings.CurrentEditorPlatform;
+
+ if (platform == settings.DefaultPlatform)
+ {
+ platform = settings.PlayInEditorPlatform;
+ }
+
+ defaultBankFolder = RuntimeUtils.GetCommonPlatformPath(Path.Combine(settings.SourceBankPath, platform.BuildDirectory));
+ }
+
+ string[] bankPlatforms = EditorUtils.GetBankPlatforms();
+ string[] bankFolders = new string[bankPlatforms.Length];
+ for (int i = 0; i < bankPlatforms.Length; i++)
+ {
+ bankFolders[i] = RuntimeUtils.GetCommonPlatformPath(Path.Combine(settings.SourceBankPath, bankPlatforms[i]));
+ }
+
+ // Get all banks and set cache time to most recent write time
+ List bankFileNames = new List(Directory.GetFiles(defaultBankFolder, "*.bank", SearchOption.AllDirectories));
+ DateTime lastWriteTime = bankFileNames.Max(fileName => File.GetLastWriteTime(fileName));
+
+ // Exit early if cache is up to date
+ if (lastWriteTime == eventCache.CacheTime)
+ {
+ return null;
+ }
+
+ eventCache.CacheTime = lastWriteTime;
+
+ // Remove string banks from list
+ bankFileNames.RemoveAll(x => x.Contains(".strings"));
+
+ List stringBanks = new List(0);
+ try
+ {
+ var files = Directory.GetFiles(defaultBankFolder, "*." + StringBankExtension, SearchOption.AllDirectories);
+ stringBanks = new List(files);
+ }
+ catch
+ {
+ }
+
+ // Strip out OSX resource-fork files that appear on FAT32
+ stringBanks.RemoveAll((x) => Path.GetFileName(x).StartsWith("._"));
+
+ if (stringBanks.Count == 0)
+ {
+ ClearCache();
+ return string.Format("Directory {0} doesn't contain any banks.\nBuild the banks in Studio or check the path in the settings.", defaultBankFolder);
+ }
+
+ // Stop editor preview so no stale data being held
+ EditorUtils.StopAllPreviews();
+
+ bool reloadPreviewBanks = EditorUtils.PreviewBanksLoaded;
+ if (reloadPreviewBanks)
+ {
+ EditorUtils.UnloadPreviewBanks();
+ }
+
+ List reducedStringBanksList = new List();
+ HashSet stringBankGuids = new HashSet();
+
+ foreach (string stringBankPath in stringBanks)
+ {
+ FMOD.Studio.Bank stringBank;
+ EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank));
+
+ if (!stringBank.isValid())
+ {
+ return string.Format("{0} is not a valid bank.", stringBankPath);
+ }
+ else
+ {
+ // Unload the strings bank
+ stringBank.unload();
+ }
+
+ FMOD.GUID stringBankGuid;
+ EditorUtils.CheckResult(stringBank.getID(out stringBankGuid));
+
+ if (!stringBankGuids.Add(stringBankGuid))
+ {
+ // If we encounter multiple string banks with the same GUID then only use the first. This handles the scenario where
+ // a Studio project is cloned and extended for DLC with a new master bank name.
+ continue;
+ }
+
+ reducedStringBanksList.Add(stringBankPath);
+ }
+
+ stringBanks = reducedStringBanksList;
+
+ // Reload the strings banks
+ List loadedStringsBanks = new List();
+
+ bool eventRenameOccurred = false;
+
+ try
+ {
+ AssetDatabase.StartAssetEditing();
+
+ eventCache.EditorBanks.ForEach((x) => x.Exists = false);
+ HashSet masterBankFileNames = new HashSet();
+
+ foreach (string stringBankPath in stringBanks)
+ {
+ FMOD.Studio.Bank stringBank;
+ EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank));
+
+ if (!stringBank.isValid())
+ {
+ ClearCache();
+ return string.Format("{0} is not a valid bank.", stringBankPath);
+ }
+
+ loadedStringsBanks.Add(stringBank);
+
+ FileInfo stringBankFileInfo = new FileInfo(stringBankPath);
+
+ string masterBankFileName = Path.GetFileName(stringBankPath).Replace(StringBankExtension, BankExtension);
+ masterBankFileNames.Add(masterBankFileName);
+
+ EditorBankRef stringsBankRef = eventCache.StringsBanks.Find(x => RuntimeUtils.GetCommonPlatformPath(stringBankPath) == x.Path);
+
+ if (stringsBankRef == null)
+ {
+ stringsBankRef = ScriptableObject.CreateInstance();
+ stringsBankRef.FileSizes = new List();
+ AssetDatabase.AddObjectToAsset(stringsBankRef, eventCache);
+ AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(stringsBankRef));
+ eventCache.EditorBanks.Add(stringsBankRef);
+ eventCache.StringsBanks.Add(stringsBankRef);
+ }
+
+ stringsBankRef.SetPath(stringBankPath, defaultBankFolder);
+ string studioPath;
+ stringBank.getPath(out studioPath);
+ stringsBankRef.SetStudioPath(studioPath);
+ stringsBankRef.LastModified = stringBankFileInfo.LastWriteTime;
+ stringsBankRef.Exists = true;
+ stringsBankRef.FileSizes.Clear();
+
+ if (Settings.Instance.HasPlatforms)
+ {
+ for (int i = 0; i < bankPlatforms.Length; i++)
+ {
+ stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], stringBankFileInfo.Length));
+ }
+ }
+ else
+ {
+ stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", stringBankFileInfo.Length));
+ }
+ }
+
+ eventCache.EditorParameters.ForEach((x) => x.Exists = false);
+
+ foreach (string bankFileName in bankFileNames)
+ {
+ EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => RuntimeUtils.GetCommonPlatformPath(bankFileName) == x.Path);
+
+ // New bank we've never seen before
+ if (bankRef == null)
+ {
+ bankRef = ScriptableObject.CreateInstance();
+ AssetDatabase.AddObjectToAsset(bankRef, eventCache);
+ AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(bankRef));
+
+ bankRef.SetPath(bankFileName, defaultBankFolder);
+ bankRef.LastModified = DateTime.MinValue;
+ bankRef.FileSizes = new List();
+
+ eventCache.EditorBanks.Add(bankRef);
+ }
+
+ bankRef.Exists = true;
+
+ FileInfo bankFileInfo = new FileInfo(bankFileName);
+
+ // Update events from this bank if it has been modified,
+ // or it is a master bank (so that we get any global parameters)
+ if (bankRef.LastModified != bankFileInfo.LastWriteTime
+ || masterBankFileNames.Contains(Path.GetFileName(bankFileName)))
+ {
+ bankRef.LastModified = bankFileInfo.LastWriteTime;
+ UpdateCacheBank(bankRef, ref eventRenameOccurred);
+ }
+
+ // Update file sizes
+ bankRef.FileSizes.Clear();
+ if (Settings.Instance.HasPlatforms)
+ {
+ for (int i = 0; i < bankPlatforms.Length; i++)
+ {
+ string platformBankPath = RuntimeUtils.GetCommonPlatformPath(bankFolders[i] + bankFileName.Replace(defaultBankFolder, ""));
+ var fileInfo = new FileInfo(platformBankPath);
+ if (fileInfo.Exists)
+ {
+ bankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], fileInfo.Length));
+ }
+ }
+ }
+ else
+ {
+ string platformBankPath = RuntimeUtils.GetCommonPlatformPath(Path.Combine(Settings.Instance.SourceBankPath, bankFileName));
+ var fileInfo = new FileInfo(platformBankPath);
+ if (fileInfo.Exists)
+ {
+ bankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", fileInfo.Length));
+ }
+ }
+
+ if (masterBankFileNames.Contains(bankFileInfo.Name))
+ {
+ if (!eventCache.MasterBanks.Exists(x => RuntimeUtils.GetCommonPlatformPath(bankFileName) == x.Path))
+ {
+ eventCache.MasterBanks.Add(bankRef);
+ }
+ }
+ }
+
+ // Remove any stale entries from bank, event and parameter lists
+ eventCache.EditorBanks.FindAll((bankRef) => !bankRef.Exists).ForEach((bankRef) =>
+ {
+ eventCache.EditorEvents.ForEach((eventRef) => eventRef.Banks.Remove(bankRef));
+ DestroyImmediate(bankRef, true);
+ });
+ eventCache.EditorBanks.RemoveAll((x) => x == null);
+ eventCache.MasterBanks.RemoveAll((x) => x == null);
+ eventCache.StringsBanks.RemoveAll((x) => x == null);
+
+ eventCache.EditorEvents.FindAll((eventRef) => eventRef.Banks.Count == 0).ForEach((eventRef) =>
+ {
+ eventRef.Parameters.ForEach((paramRef) => DestroyImmediate(paramRef, true));
+ DestroyImmediate(eventRef, true);
+ });
+ eventCache.EditorEvents.RemoveAll((x) => x == null);
+
+ eventCache.EditorParameters.FindAll((paramRef) => !paramRef.Exists).ForEach((paramRef) =>
+ {
+ DestroyImmediate(paramRef, true);
+ });
+ eventCache.EditorParameters.RemoveAll((x) => x == null);
+
+ AssetDatabase.SaveAssets();
+ }
+ finally
+ {
+ // Unload the strings banks
+ loadedStringsBanks.ForEach(x => x.unload());
+ AssetDatabase.StopAssetEditing();
+
+ if (reloadPreviewBanks)
+ {
+ EditorUtils.LoadPreviewBanks();
+ }
+
+ RuntimeUtils.DebugLog("FMOD: Cache updated.");
+ }
+
+ if (eventRenameOccurred)
+ {
+ EditorApplication.delayCall += ShowEventsRenamedDialog;
+ }
+
+ return null;
+ }
+
+ private static void ShowEventsRenamedDialog()
+ {
+ bool runUpdater = EditorUtility.DisplayDialog("Events Renamed",
+ string.Format("Some events have been renamed in FMOD Studio. Do you want to run {0} " +
+ "to find and update any references to them?", EventReferenceUpdater.MenuPath), "Yes", "No");
+
+ if (runUpdater)
+ {
+ EventReferenceUpdater.ShowWindow();
+ }
+ }
+
+ private static void UpdateCacheBank(EditorBankRef bankRef, ref bool renameOccurred)
+ {
+ // Clear out any cached events from this bank
+ eventCache.EditorEvents.ForEach((x) => x.Banks.Remove(bankRef));
+
+ FMOD.Studio.Bank bank;
+ FMOD.RESULT loadResult = EditorUtils.System.loadBankFile(bankRef.Path, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out bank);
+
+ if (loadResult == FMOD.RESULT.OK)
+ {
+ // Get studio path
+ string studioPath;
+ bank.getPath(out studioPath);
+ bankRef.SetStudioPath(studioPath);
+
+ // Iterate all events in the bank and cache them
+ FMOD.Studio.EventDescription[] eventList;
+ var result = bank.getEventList(out eventList);
+ if (result == FMOD.RESULT.OK)
+ {
+ foreach (var eventDesc in eventList)
+ {
+ string path;
+ result = eventDesc.getPath(out path);
+
+ FMOD.GUID guid;
+ eventDesc.getID(out guid);
+
+ EditorEventRef eventRef = eventCache.EditorEvents.Find((x) => string.Compare(x.Path, path, StringComparison.CurrentCultureIgnoreCase) == 0);
+ if (eventRef == null)
+ {
+ eventRef = ScriptableObject.CreateInstance();
+ AssetDatabase.AddObjectToAsset(eventRef, eventCache);
+ AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(eventRef));
+ eventRef.Banks = new List();
+ eventCache.EditorEvents.Add(eventRef);
+ eventRef.Parameters = new List();
+
+ if (!renameOccurred)
+ {
+ EditorEventRef eventRefByGuid = eventCache.EditorEvents.Find((x) => x.Guid == guid);
+
+ if (eventRefByGuid != null)
+ {
+ renameOccurred = true;
+ }
+ }
+ }
+ else if (eventRef.Guid != guid)
+ {
+ renameOccurred = true;
+ }
+
+ eventRef.Banks.Add(bankRef);
+ eventRef.Guid = guid;
+ eventRef.Path = eventRef.name = path;
+ eventDesc.is3D(out eventRef.Is3D);
+ eventDesc.isOneshot(out eventRef.IsOneShot);
+ eventDesc.isStream(out eventRef.IsStream);
+ eventDesc.getMinMaxDistance(out eventRef.MinDistance, out eventRef.MaxDistance);
+ eventDesc.getLength(out eventRef.Length);
+ int paramCount = 0;
+ eventDesc.getParameterDescriptionCount(out paramCount);
+ eventRef.Parameters.ForEach((x) => x.Exists = false);
+ for (int paramIndex = 0; paramIndex < paramCount; paramIndex++)
+ {
+ FMOD.Studio.PARAMETER_DESCRIPTION param;
+ eventDesc.getParameterDescriptionByIndex(paramIndex, out param);
+ // Skip if readonly and not global
+ if ((param.flags & FMOD.Studio.PARAMETER_FLAGS.READONLY) != 0 && (param.flags & FMOD.Studio.PARAMETER_FLAGS.GLOBAL) == 0)
+ {
+ continue;
+ }
+ EditorParamRef paramRef = eventRef.Parameters.Find((x) => x.ID.Equals(param.id));
+ if (paramRef == null)
+ {
+ paramRef = ScriptableObject.CreateInstance();
+ AssetDatabase.AddObjectToAsset(paramRef, eventCache);
+ AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(paramRef));
+ eventRef.Parameters.Add(paramRef);
+ }
+
+ InitializeParamRef(paramRef, param, (labelIndex) => {
+ string label;
+ eventDesc.getParameterLabelByIndex(paramIndex, labelIndex, out label);
+ return label;
+ });
+
+ paramRef.name = "parameter:/" + Path.GetFileName(path) + "/" + paramRef.Name;
+ paramRef.Exists = true;
+ }
+ eventRef.Parameters.FindAll((x) => !x.Exists).ForEach((x) => DestroyImmediate(x, true));
+ eventRef.Parameters.RemoveAll((x) => x == null);
+ }
+ }
+
+ // Update global parameter list for each bank
+ FMOD.Studio.PARAMETER_DESCRIPTION[] parameterDescriptions;
+ result = EditorUtils.System.getParameterDescriptionList(out parameterDescriptions);
+ if (result == FMOD.RESULT.OK)
+ {
+ for (int i = 0; i < parameterDescriptions.Length; i++)
+ {
+ FMOD.Studio.PARAMETER_DESCRIPTION param = parameterDescriptions[i];
+ if ((param.flags & FMOD.Studio.PARAMETER_FLAGS.GLOBAL) == FMOD.Studio.PARAMETER_FLAGS.GLOBAL)
+ {
+ EditorParamRef paramRef = eventCache.EditorParameters.Find((x) => x.ID.Equals(param.id));
+ if (paramRef == null)
+ {
+ paramRef = ScriptableObject.CreateInstance();
+ AssetDatabase.AddObjectToAsset(paramRef, eventCache);
+ AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(paramRef));
+ eventCache.EditorParameters.Add(paramRef);
+ }
+
+ InitializeParamRef(paramRef, param, (index) => {
+ string label;
+ EditorUtils.System.getParameterLabelByID(param.id, index, out label);
+ return label;
+ });
+
+ paramRef.name = "parameter:/" + param.name;
+ EditorUtils.System.lookupPath(param.guid, out paramRef.StudioPath);
+ paramRef.Exists = true;
+ }
+ }
+ }
+ bank.unload();
+ }
+ else
+ {
+ RuntimeUtils.DebugLogError(string.Format("FMOD Studio: Unable to load {0}: {1}", bankRef.Name, FMOD.Error.String(loadResult)));
+ eventCache.CacheTime = DateTime.MinValue;
+ }
+ }
+
+ private static void InitializeParamRef(EditorParamRef paramRef, FMOD.Studio.PARAMETER_DESCRIPTION description,
+ Func getLabel)
+ {
+ paramRef.Name = description.name;
+ paramRef.Min = description.minimum;
+ paramRef.Max = description.maximum;
+ paramRef.Default = description.defaultvalue;
+ paramRef.ID = description.id;
+ paramRef.IsGlobal = (description.flags & FMOD.Studio.PARAMETER_FLAGS.GLOBAL) != 0;
+
+ if ((description.flags & FMOD.Studio.PARAMETER_FLAGS.LABELED) != 0)
+ {
+ paramRef.Type = ParameterType.Labeled;
+ paramRef.Labels = GetParameterLabels(description, getLabel);
+ }
+ else if ((description.flags & FMOD.Studio.PARAMETER_FLAGS.DISCRETE) != 0)
+ {
+ paramRef.Type = ParameterType.Discrete;
+ }
+ else
+ {
+ paramRef.Type = ParameterType.Continuous;
+ }
+ }
+
+ private static string[] GetParameterLabels(FMOD.Studio.PARAMETER_DESCRIPTION parameterDescription,
+ Func getLabel)
+ {
+ string[] labels = new string[(int)parameterDescription.maximum + 1];
+
+ for (int i = 0; i <= parameterDescription.maximum; ++i)
+ {
+ labels[i] = getLabel(i);
+ }
+
+ return labels;
+ }
+
+ static EventManager()
+ {
+ BuildStatusWatcher.OnBuildStarted += () => {
+ BuildTargetChanged();
+ CopyToStreamingAssets(EditorUserBuildSettings.activeBuildTarget);
+ };
+ BuildStatusWatcher.OnBuildEnded += () => {
+ UpdateBankStubAssets(EditorUserBuildSettings.activeBuildTarget);
+ };
+ }
+
+ public static void Startup()
+ {
+ EventReference.GuidLookupDelegate = (path) => {
+ EditorEventRef editorEventRef = EventFromPath(path);
+
+ return (editorEventRef != null) ? editorEventRef.Guid : new FMOD.GUID();
+ };
+
+ // Avoid throwing exceptions so we don't stop other startup code from running
+ try
+ {
+ RefreshBanks();
+ }
+ catch (Exception e)
+ {
+ RuntimeUtils.DebugLogException(e);
+ }
+ }
+
+ public static void ValidateEventReferences(Scene scene)
+ {
+ foreach (GameObject gameObject in scene.GetRootGameObjects())
+ {
+ MonoBehaviour[] behaviours = gameObject.GetComponentsInChildren(true);
+
+ foreach (MonoBehaviour behaviour in behaviours)
+ {
+ if (behaviour != null)
+ {
+ if (behaviour is StudioEventEmitter)
+ {
+ ValidateEventEmitter(behaviour as StudioEventEmitter, scene);
+ }
+ else
+ {
+ ValidateEventReferenceFields(behaviour, scene);
+ }
+ }
+ }
+ }
+ }
+
+ private static readonly string UpdaterInstructions =
+ string.Format("Please run {0} to resolve this issue.", EventReferenceUpdater.MenuPath);
+
+ private static void ValidateEventEmitter(StudioEventEmitter emitter, Scene scene)
+ {
+#pragma warning disable 0618 // Suppress a warning about using the obsolete StudioEventEmitter.Event field
+ if (!string.IsNullOrEmpty(emitter.Event))
+#pragma warning restore 0618
+ {
+ RuntimeUtils.DebugLogWarningFormat("FMOD: A Studio Event Emitter in scene '{0}' on GameObject '{1}' is using the "
+ + "obsolete Event field. {2}",
+ scene.name, EditorUtils.GameObjectPath(emitter), UpdaterInstructions);
+ }
+
+ bool changed;
+ if (!ValidateEventReference(ref emitter.EventReference, emitter, scene, out changed))
+ {
+ RuntimeUtils.DebugLogWarningFormat(
+ "FMOD: A Studio Event Emitter in scene '{0}' on GameObject '{1}' has an invalid event reference: {2}",
+ scene.name, EditorUtils.GameObjectPath(emitter), emitter.EventReference);
+ }
+ }
+
+ private static void ValidateEventReferenceFields(MonoBehaviour behaviour, Scene scene)
+ {
+ Type type = behaviour.GetType();
+
+ FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+ foreach (FieldInfo field in fields)
+ {
+#pragma warning disable 0618 // Suppress a warning about using the obsolete EventRefAttribute class
+ if (EditorUtils.HasAttribute(field))
+#pragma warning restore 0618
+ {
+ RuntimeUtils.DebugLogWarningFormat("FMOD: A component of type {0} in scene '{1}' on GameObject '{2}' has an "
+ + "obsolete [EventRef] attribute on field {3}. {4}",
+ type.Name, scene.name, EditorUtils.GameObjectPath(behaviour), field.Name,
+ UpdaterInstructions);
+ }
+ else if (field.FieldType == typeof(EventReference))
+ {
+ EventReference eventReference = (EventReference)field.GetValue(behaviour);
+
+ bool changed;
+ if (!ValidateEventReference(ref eventReference, behaviour, scene, out changed))
+ {
+ RuntimeUtils.DebugLogWarningFormat(
+ "FMOD: A component of type {0} in scene '{1}' on GameObject '{2}' has an "
+ + "invalid event reference in field '{3}': {4}",
+ type.Name, scene.name, EditorUtils.GameObjectPath(behaviour), field.Name, eventReference);
+ }
+
+ if (changed)
+ {
+ field.SetValue(behaviour, eventReference);
+ }
+ }
+ }
+ }
+
+ // Returns true if eventReference is valid, sets changed if eventReference was changed
+ private static bool ValidateEventReference(ref EventReference eventReference,
+ Component parent, Scene scene, out bool changed)
+ {
+ changed = false;
+
+ if (eventReference.IsNull)
+ {
+ return true;
+ }
+
+ EditorEventRef editorEventRef;
+
+ EventLinkage eventLinkage = GetEventLinkage(eventReference);
+
+ if (eventLinkage == EventLinkage.GUID)
+ {
+ editorEventRef = EventFromGUID(eventReference.Guid);
+
+ if (editorEventRef == null)
+ {
+ return false;
+ }
+
+ if (eventReference.Path != editorEventRef.Path)
+ {
+ RuntimeUtils.DebugLogWarningFormat(
+ "FMOD: EventReference path '{0}' doesn't match GUID {1} on object '{2}' in scene '{3}'. {4}",
+ eventReference.Path, eventReference.Guid, EditorUtils.GameObjectPath(parent), scene.name,
+ UpdaterInstructions);
+ }
+
+ return true;
+ }
+ else if (eventLinkage == EventLinkage.Path)
+ {
+ editorEventRef = EventFromPath(eventReference.Path);
+
+ if (editorEventRef == null)
+ {
+ return false;
+ }
+
+ if (eventReference.Guid != editorEventRef.Guid)
+ {
+ RuntimeUtils.DebugLogWarningFormat(
+ "FMOD: Changing EventReference GUID to {0} to match path '{1}' on object '{2}' in scene '{3}'. {4}",
+ editorEventRef.Guid, eventReference.Path, EditorUtils.GameObjectPath(parent), scene.name,
+ UpdaterInstructions);
+
+ eventReference.Guid = editorEventRef.Guid;
+ EditorUtility.SetDirty(parent);
+
+ changed = true;
+ }
+
+ return true;
+ }
+ else
+ {
+ throw new NotSupportedException("Unrecognized EventLinkage: " + eventLinkage);
+ }
+ }
+
+ public static void CopyToStreamingAssets(BuildTarget buildTarget)
+ {
+ if (Settings.Instance.ImportType == ImportType.AssetBundle && BuildPipeline.isBuildingPlayer)
+ {
+ return;
+ }
+
+ if (string.IsNullOrEmpty(Settings.Instance.SourceBankPath))
+ return;
+
+ Platform platform = EditorSettings.Instance.GetPlatform(buildTarget);
+
+ if (platform == Settings.Instance.DefaultPlatform)
+ {
+ RuntimeUtils.DebugLogWarningFormat("FMOD Studio: copy banks for platform {0} : Unsupported platform", buildTarget);
+ return;
+ }
+
+ string bankTargetFolder =
+ Settings.Instance.ImportType == ImportType.StreamingAssets
+ ? Settings.Instance.TargetPath
+ : Application.dataPath + (string.IsNullOrEmpty(Settings.Instance.TargetAssetPath) ? "" : '/' + Settings.Instance.TargetAssetPath);
+ bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder);
+ Directory.CreateDirectory(bankTargetFolder);
+
+ string bankTargetExtension =
+ Settings.Instance.ImportType == ImportType.StreamingAssets
+ ? ".bank"
+ : ".bytes";
+
+ string bankSourceFolder =
+ Settings.Instance.HasPlatforms
+ ? Settings.Instance.SourceBankPath + '/' + platform.BuildDirectory
+ : Settings.Instance.SourceBankPath;
+ bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder);
+
+ if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() ==
+ Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant())
+ {
+ return;
+ }
+
+ bool madeChanges = false;
+
+ try
+ {
+ // Clean out any stale .bank files
+ string[] existingBankFiles =
+ Directory.GetFiles(bankTargetFolder, "*" + bankTargetExtension, SearchOption.AllDirectories);
+
+ foreach (string bankFilePath in existingBankFiles)
+ {
+ string bankName = EditorBankRef.CalculateName(bankFilePath, bankTargetFolder);
+
+ if (!eventCache.EditorBanks.Exists(x => x.Name == bankName))
+ {
+ string assetPath = bankFilePath.Replace(Application.dataPath, AssetsFolderName);
+
+ if (AssetHasLabel(assetPath, FMODLabel))
+ {
+ AssetDatabase.MoveAssetToTrash(assetPath);
+ madeChanges = true;
+ }
+ }
+ }
+
+ // Copy over any files that don't match timestamp or size or don't exist
+ AssetDatabase.StartAssetEditing();
+ foreach (var bankRef in eventCache.EditorBanks)
+ {
+ string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank";
+ string targetPathRelative = bankRef.Name + bankTargetExtension;
+ string targetPathFull = bankTargetFolder + "/" + targetPathRelative;
+
+ FileInfo sourceInfo = new FileInfo(sourcePath);
+ FileInfo targetInfo = new FileInfo(targetPathFull);
+
+ if (!targetInfo.Exists ||
+ sourceInfo.Length != targetInfo.Length ||
+ sourceInfo.LastWriteTime != targetInfo.LastWriteTime)
+ {
+ if (targetInfo.Exists)
+ {
+ targetInfo.IsReadOnly = false;
+ }
+ else
+ {
+ EnsureFoldersExist(targetPathRelative, bankTargetFolder);
+ }
+
+ File.Copy(sourcePath, targetPathFull, true);
+ targetInfo = new FileInfo(targetPathFull);
+ targetInfo.IsReadOnly = false;
+ targetInfo.LastWriteTime = sourceInfo.LastWriteTime;
+
+ madeChanges = true;
+
+ string assetString = targetPathFull.Replace(Application.dataPath, "Assets");
+ AssetDatabase.ImportAsset(assetString);
+ UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(assetString);
+ AssetDatabase.SetLabels(obj, new string[] { FMODLabel });
+ }
+ }
+
+ RemoveEmptyFMODFolders(bankTargetFolder);
+ }
+ catch (Exception exception)
+ {
+ RuntimeUtils.DebugLogErrorFormat("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}",
+ platform.DisplayName, bankSourceFolder, bankTargetFolder);
+ RuntimeUtils.DebugLogException(exception);
+ return;
+ }
+ finally
+ {
+ AssetDatabase.StopAssetEditing();
+ }
+
+ if (madeChanges)
+ {
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+ RuntimeUtils.DebugLogFormat("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded",
+ platform.DisplayName, bankSourceFolder, bankTargetFolder);
+ }
+ }
+
+ public static void UpdateBankStubAssets(BuildTarget buildTarget)
+ {
+ if (Settings.Instance.ImportType != ImportType.AssetBundle
+ || string.IsNullOrEmpty(Settings.Instance.SourceBankPath))
+ {
+ return;
+ }
+
+ Platform platform = EditorSettings.Instance.GetPlatform(buildTarget);
+
+ if (platform == Settings.Instance.DefaultPlatform)
+ {
+ Debug.LogWarningFormat("FMOD: Updating bank stubs: Unsupported platform {0}", buildTarget);
+ return;
+ }
+
+ string bankTargetFolder = Application.dataPath;
+
+ if (!string.IsNullOrEmpty(Settings.Instance.TargetAssetPath))
+ {
+ bankTargetFolder += "/" + Settings.Instance.TargetAssetPath;
+ }
+
+ bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder);
+
+ string bankSourceFolder = Settings.Instance.SourceBankPath;
+
+ if (Settings.Instance.HasPlatforms)
+ {
+ bankSourceFolder += "/" + platform.BuildDirectory;
+ }
+
+ bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder);
+
+ if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() ==
+ Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant())
+ {
+ return;
+ }
+
+ bool madeChanges = false;
+
+ Directory.CreateDirectory(bankTargetFolder);
+
+ try
+ {
+ const string BankAssetExtension = ".bytes";
+
+ // Clean out any stale stubs
+ string[] existingBankFiles =
+ Directory.GetFiles(bankTargetFolder, "*" + BankAssetExtension, SearchOption.AllDirectories);
+
+ foreach (string bankFilePath in existingBankFiles)
+ {
+ string bankName = EditorBankRef.CalculateName(bankFilePath, bankTargetFolder);
+
+ if (!eventCache.EditorBanks.Exists(x => x.Name == bankName))
+ {
+ string assetPath = bankFilePath.Replace(Application.dataPath, AssetsFolderName);
+
+ if (AssetHasLabel(assetPath, FMODLabel))
+ {
+ AssetDatabase.MoveAssetToTrash(assetPath);
+ madeChanges = true;
+ }
+ }
+ }
+
+ // Create any stubs that don't exist, and ensure any that do exist have the correct data
+ AssetDatabase.StartAssetEditing();
+ foreach (var bankRef in eventCache.EditorBanks)
+ {
+ string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank";
+ string targetPathRelative = bankRef.Name + BankAssetExtension;
+ string targetPathFull = bankTargetFolder + "/" + targetPathRelative;
+
+ EnsureFoldersExist(targetPathRelative, bankTargetFolder);
+
+ FileInfo targetInfo = new FileInfo(targetPathFull);
+
+ string stubData = RuntimeManager.BankStubPrefix + bankRef.Name;
+
+ // Minimise asset database refreshing by only writing the stub if necessary
+ bool writeStub;
+
+ if (targetInfo.Exists && targetInfo.Length == stubData.Length)
+ {
+ using (StreamReader reader = targetInfo.OpenText())
+ {
+ string contents = reader.ReadToEnd();
+ writeStub = (contents != stubData);
+ }
+ }
+ else
+ {
+ writeStub = true;
+ }
+
+ if (writeStub)
+ {
+ // Create or update the stub
+ using (StreamWriter writer = targetInfo.CreateText())
+ {
+ writer.Write(stubData);
+ }
+
+ madeChanges = true;
+
+ if (!targetInfo.Exists)
+ {
+ string assetPath = targetPathFull.Replace(Application.dataPath, "Assets");
+ AssetDatabase.ImportAsset(assetPath);
+
+ UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(assetPath);
+ AssetDatabase.SetLabels(obj, new string[] { FMODLabel });
+ }
+ }
+ }
+ RemoveEmptyFMODFolders(bankTargetFolder);
+ }
+ catch (Exception exception)
+ {
+ Debug.LogErrorFormat("FMOD: Updating bank stubs in {0} to match {1}",
+ bankTargetFolder, bankSourceFolder);
+ Debug.LogException(exception);
+ return;
+ }
+ finally
+ {
+ AssetDatabase.StopAssetEditing();
+ }
+
+ if (madeChanges)
+ {
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+ Debug.LogFormat("FMOD: Updated bank stubs in {0} to match {1}", bankTargetFolder, bankSourceFolder);
+ }
+ }
+
+ private static void EnsureFoldersExist(string filePath, string basePath)
+ {
+ string dataPath = Application.dataPath + "/";
+
+ if (!basePath.StartsWith(dataPath))
+ {
+ throw new ArgumentException(
+ string.Format("Base path {0} is not within the Assets folder", basePath), "basePath");
+ }
+
+ int lastSlash = filePath.LastIndexOf('/');
+
+ if (lastSlash == -1)
+ {
+ // No folders
+ return;
+ }
+
+ string assetString = filePath.Substring(0, lastSlash);
+
+ string[] folders = assetString.Split('/');
+ string parentFolder = "Assets/" + basePath.Substring(dataPath.Length);
+
+ for (int i = 0; i < folders.Length; ++i)
+ {
+ string folderPath = parentFolder + "/" + folders[i];
+
+ if (!AssetDatabase.IsValidFolder(folderPath))
+ {
+ AssetDatabase.CreateFolder(parentFolder, folders[i]);
+
+ var folder = AssetDatabase.LoadAssetAtPath(folderPath);
+ AssetDatabase.SetLabels(folder, new string[] { FMODLabel });
+ }
+
+ parentFolder = folderPath;
+ }
+ }
+
+ private static void BuildTargetChanged()
+ {
+ RefreshBanks();
+#if UNITY_ANDROID
+#if UNITY_2023_1_OR_NEWER
+ Settings.Instance.AndroidUseOBB = PlayerSettings.Android.splitApplicationBinary;
+#else
+ Settings.Instance.AndroidUseOBB = PlayerSettings.Android.useAPKExpansionFiles;
+#endif //UNITY_2023_1_OR_NEWER
+#endif //UNITY_ANDROID
+ }
+
+ private static void OnCacheChange()
+ {
+ List masterBanks = new List();
+ List banks = new List();
+
+ var settings = Settings.Instance;
+ bool hasChanged = false;
+
+ foreach (EditorBankRef bankRef in eventCache.MasterBanks)
+ {
+ masterBanks.Add(bankRef.Name);
+ }
+
+ if (!CompareLists(masterBanks, settings.MasterBanks))
+ {
+ settings.MasterBanks.Clear();
+ settings.MasterBanks.AddRange(masterBanks);
+ hasChanged = true;
+ }
+
+ foreach (var bankRef in eventCache.EditorBanks)
+ {
+ if (!eventCache.MasterBanks.Contains(bankRef) &&
+ !eventCache.StringsBanks.Contains(bankRef))
+ {
+ banks.Add(bankRef.Name);
+ }
+ }
+ banks.Sort((a, b) => string.Compare(a, b, StringComparison.CurrentCultureIgnoreCase));
+
+ if (!CompareLists(banks, settings.Banks))
+ {
+ settings.Banks.Clear();
+ settings.Banks.AddRange(banks);
+ hasChanged = true;
+ }
+
+ if (hasChanged)
+ {
+ EditorUtility.SetDirty(settings);
+ }
+ }
+
+ public static DateTime CacheTime
+ {
+ get
+ {
+ if (eventCache != null)
+ {
+ return eventCache.CacheTime;
+ }
+ else
+ {
+ return DateTime.MinValue;
+ }
+ }
+ }
+
+ public static List Events
+ {
+ get
+ {
+ AffirmEventCache();
+ return eventCache.EditorEvents;
+ }
+ }
+
+ public static List Banks
+ {
+ get
+ {
+ AffirmEventCache();
+ return eventCache.EditorBanks;
+ }
+ }
+
+ public static List Parameters
+ {
+ get
+ {
+ AffirmEventCache();
+ return eventCache.EditorParameters;
+ }
+ }
+
+ public static List MasterBanks
+ {
+ get
+ {
+ AffirmEventCache();
+ return eventCache.MasterBanks;
+ }
+ }
+
+ public static bool IsLoaded
+ {
+ get
+ {
+ return Settings.Instance.SourceBankPath != null;
+ }
+ }
+
+ public static bool IsValid
+ {
+ get
+ {
+ AffirmEventCache();
+ return eventCache.CacheTime != DateTime.MinValue;
+ }
+ }
+
+ public static bool IsInitialized
+ {
+ get
+ {
+ return eventCache != null;
+ }
+ }
+
+ public static EventLinkage GetEventLinkage(EventReference eventReference)
+ {
+ if (Settings.Instance.EventLinkage == EventLinkage.Path)
+ {
+ if (string.IsNullOrEmpty(eventReference.Path) && !eventReference.Guid.IsNull)
+ {
+ return EventLinkage.GUID;
+ }
+ else
+ {
+ return EventLinkage.Path;
+ }
+ }
+ else // Assume EventLinkage.GUID
+ {
+ if (eventReference.Guid.IsNull && !string.IsNullOrEmpty(eventReference.Path))
+ {
+ return EventLinkage.Path;
+ }
+ else
+ {
+ return EventLinkage.GUID;
+ }
+ }
+ }
+
+ public static EditorEventRef EventFromPath(string pathOrGuid)
+ {
+ EditorEventRef eventRef;
+ if (pathOrGuid.StartsWith("{"))
+ {
+ eventRef = EventFromGUID(FMOD.GUID.Parse(pathOrGuid));
+ }
+ else
+ {
+ eventRef = EventFromString(pathOrGuid);
+ }
+ return eventRef;
+ }
+
+ public static EditorEventRef EventFromString(string path)
+ {
+ AffirmEventCache();
+ return eventCache.EditorEvents.Find((x) => x.Path.Equals(path, StringComparison.CurrentCultureIgnoreCase));
+ }
+
+ public static EditorEventRef EventFromGUID(FMOD.GUID guid)
+ {
+ AffirmEventCache();
+ return eventCache.EditorEvents.Find((x) => x.Guid == guid);
+ }
+
+ public static EditorParamRef ParamFromPath(string name)
+ {
+ AffirmEventCache();
+ return eventCache.EditorParameters.Find((x) => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
+ }
+
+ public class ActiveBuildTargetListener : IActiveBuildTargetChanged
+ {
+ public int callbackOrder{ get { return 0; } }
+ public void OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget)
+ {
+ BuildTargetChanged();
+ }
+ }
+
+ public class PreprocessScene : IProcessSceneWithReport
+ {
+ public int callbackOrder { get { return 0; } }
+
+ public void OnProcessScene(Scene scene, BuildReport report)
+ {
+ if (report == null) return;
+
+ ValidateEventReferences(scene);
+ }
+ }
+
+ private static bool CompareLists(List tempBanks, List banks)
+ {
+ if (tempBanks.Count != banks.Count)
+ return false;
+
+ for (int i = 0; i < tempBanks.Count; i++)
+ {
+ if (tempBanks[i] != banks[i])
+ return false;
+ }
+ return true;
+ }
+
+ private static bool AssetHasLabel(string assetPath, string label)
+ {
+ UnityEngine.Object asset = AssetDatabase.LoadAssetAtPath(assetPath);
+ string[] labels = AssetDatabase.GetLabels(asset);
+
+ return labels.Contains(label);
+ }
+
+ public static void RemoveBanks(string basePath)
+ {
+ if (!Directory.Exists(basePath))
+ {
+ return;
+ }
+
+ string[] filePaths = Directory.GetFiles(basePath, "*", SearchOption.AllDirectories);
+
+ foreach (string filePath in filePaths)
+ {
+ if (!filePath.EndsWith(".meta"))
+ {
+ string assetPath = filePath.Replace(Application.dataPath, AssetsFolderName);
+
+ if (AssetHasLabel(assetPath, FMODLabel))
+ {
+ AssetDatabase.MoveAssetToTrash(assetPath);
+ }
+ }
+ }
+
+ RemoveEmptyFMODFolders(basePath);
+
+ if (Directory.GetFileSystemEntries(basePath).Length == 0)
+ {
+ string baseFolder = basePath.Replace(Application.dataPath, AssetsFolderName);
+ AssetDatabase.MoveAssetToTrash(baseFolder);
+ }
+ }
+
+ public static void MoveBanks(string from, string to)
+ {
+ if (!Directory.Exists(from))
+ {
+ return;
+ }
+
+ if (!Directory.Exists(to))
+ {
+ Directory.CreateDirectory(to);
+ }
+
+ string[] oldBankFiles = Directory.GetFiles(from);
+
+ foreach (var oldBankFileName in oldBankFiles)
+ {
+ if (oldBankFileName.EndsWith(".meta"))
+ continue;
+ string assetString = oldBankFileName.Replace(Application.dataPath, "Assets");
+ AssetDatabase.ImportAsset(assetString);
+ UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(assetString);
+ string[] labels = AssetDatabase.GetLabels(obj);
+ foreach (string label in labels)
+ {
+ if (label.Equals("FMOD"))
+ {
+ AssetDatabase.MoveAsset(assetString, to);
+ break;
+ }
+ }
+ }
+ if (Directory.GetFiles(Path.GetDirectoryName(oldBankFiles[0])).Length == 0)
+ {
+ Directory.Delete(Path.GetDirectoryName(oldBankFiles[0]));
+ }
+ }
+
+ public static void RemoveEmptyFMODFolders(string basePath)
+ {
+ string[] folderPaths = Directory.GetDirectories(basePath, "*", SearchOption.AllDirectories);
+
+ // Process longest paths first so parent folders are cleared out when we get to them
+ Array.Sort(folderPaths, (a, b) => b.Length.CompareTo(a.Length));
+
+ foreach (string folderPath in folderPaths)
+ {
+ string assetPath = folderPath.Replace(Application.dataPath, AssetsFolderName);
+
+ if (AssetHasLabel(assetPath, FMODLabel) && Directory.GetFileSystemEntries(folderPath).Length == 0)
+ {
+ AssetDatabase.MoveAssetToTrash(assetPath);
+ }
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EventManager.cs.meta b/Assets/Plugins/FMOD/src/Editor/EventManager.cs.meta
new file mode 100644
index 00000000..965dcb31
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1fc38201a5edb994c874a4a61e96053b
+timeCreated: 1432600216
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs b/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs
new file mode 100644
index 00000000..7e6ccbcb
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs
@@ -0,0 +1,499 @@
+using System;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+using UnityEditor;
+
+namespace FMODUnity
+{
+ [CustomPropertyDrawer(typeof(EventReference))]
+ public class EventReferenceDrawer : PropertyDrawer
+ {
+ private static readonly Texture RepairIcon = EditorUtils.LoadImage("Wrench.png");
+ private static readonly Texture WarningIcon = EditorUtils.LoadImage("NotFound.png");
+ private static readonly GUIContent NotFoundWarning = new GUIContent(L10n.Tr("Event Not Found"), WarningIcon);
+
+ private static GUIStyle buttonStyle;
+
+ private static Vector2 WarningSize()
+ {
+ return GUI.skin.label.CalcSize(NotFoundWarning);
+ }
+
+ private static float GetBaseHeight()
+ {
+ return GUI.skin.textField.CalcSize(GUIContent.none).y;
+ }
+
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+ {
+ if (buttonStyle == null)
+ {
+ buttonStyle = new GUIStyle(GUI.skin.button);
+ buttonStyle.padding.top = 1;
+ buttonStyle.padding.bottom = 1;
+ }
+
+ Texture browseIcon = EditorUtils.LoadImage("SearchIconBlack.png");
+ Texture openIcon = EditorUtils.LoadImage("BrowserIcon.png");
+ Texture addIcon = EditorUtils.LoadImage("AddIcon.png");
+ Texture copyIcon = EditorUtils.LoadImage("CopyIcon.png");
+
+ using (new EditorGUI.PropertyScope(position, label, property))
+ {
+ HandleDragEvents(position, property);
+
+ EventReference eventReference = property.GetEventReference();
+ EditorEventRef editorEventRef = GetEditorEventRef(eventReference);
+
+ float baseHeight = GetBaseHeight();
+
+ Rect headerRect = position;
+ headerRect.width = EditorGUIUtility.labelWidth;
+ headerRect.height = baseHeight;
+
+ property.isExpanded = EditorGUI.Foldout(headerRect, property.isExpanded, label, true);
+
+ Rect addRect = new Rect(position.xMax - addIcon.width - 7, position.y, addIcon.width + 7, baseHeight);
+ Rect openRect = new Rect(addRect.x - openIcon.width - 7, position.y, openIcon.width + 6, baseHeight);
+ Rect searchRect = new Rect(openRect.x - browseIcon.width - 9, position.y, browseIcon.width + 8, baseHeight);
+ Rect pathRect = position;
+ pathRect.xMin = headerRect.xMax;
+ pathRect.xMax = searchRect.x - 3;
+ pathRect.height = baseHeight;
+
+ SerializedProperty pathProperty = GetPathProperty(property);
+
+ using (var scope = new EditorGUI.ChangeCheckScope())
+ {
+ EditorGUI.PropertyField(pathRect, pathProperty, GUIContent.none);
+
+ if (scope.changed)
+ {
+ SetEvent(property, pathProperty.stringValue);
+ }
+ }
+
+ if (GUI.Button(searchRect, new GUIContent(browseIcon, L10n.Tr("Search")), buttonStyle))
+ {
+ var eventBrowser = ScriptableObject.CreateInstance();
+
+ eventBrowser.ChooseEvent(property);
+ var windowRect = position;
+ windowRect.xMin = pathRect.xMin;
+ windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position);
+ windowRect.height = openRect.height + 1;
+ windowRect.width = Mathf.Max(windowRect.width, 300f);
+ eventBrowser.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 400));
+
+ }
+ if (GUI.Button(addRect, new GUIContent(addIcon, L10n.Tr("Create New Event in Studio")), buttonStyle))
+ {
+ var addDropdown = EditorWindow.CreateInstance();
+
+ addDropdown.SelectEvent(property);
+ var windowRect = position;
+ windowRect.xMin = pathRect.xMin;
+ windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position);
+ windowRect.height = openRect.height + 1;
+ windowRect.width = Mathf.Max(windowRect.width, 300f);
+ addDropdown.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 500));
+
+ }
+ if (GUI.Button(openRect, new GUIContent(openIcon, L10n.Tr("Open In Browser")), buttonStyle))
+ {
+ EventBrowser.ShowWindow();
+ EventBrowser eventBrowser = EditorWindow.GetWindow();
+ eventBrowser.FrameEvent(pathProperty.stringValue);
+ }
+
+ if (editorEventRef != null)
+ {
+ float labelY = headerRect.y + baseHeight;
+
+ MismatchInfo mismatch = GetMismatch(eventReference, editorEventRef);
+
+ if (mismatch != null)
+ {
+ Rect warningRect = pathRect;
+ warningRect.xMax = position.xMax;
+ warningRect.y = labelY;
+ warningRect.height = WarningSize().y;
+
+ DrawMismatchUI(warningRect, openRect.x, openRect.width, mismatch, property);
+
+ labelY = warningRect.yMax;
+ }
+
+ if (property.isExpanded)
+ {
+ using (new EditorGUI.IndentLevelScope())
+ {
+ Rect labelRect = EditorGUI.IndentedRect(headerRect);
+ labelRect.y = labelY;
+
+ Rect valueRect = labelRect;
+ valueRect.xMin = labelRect.xMax;
+ valueRect.xMax = position.xMax - copyIcon.width - 7;
+
+ GUI.Label(labelRect, new GUIContent("GUID"));
+ GUI.Label(valueRect, eventReference.Guid.ToString());
+
+ Rect copyRect = valueRect;
+ copyRect.xMin = valueRect.xMax;
+ copyRect.xMax = position.xMax;
+
+ if (GUI.Button(copyRect, new GUIContent(copyIcon, L10n.Tr("Copy To Clipboard"))))
+ {
+ EditorGUIUtility.systemCopyBuffer = eventReference.Guid.ToString();
+ }
+
+ valueRect.xMax = position.xMax;
+
+ labelRect.y += baseHeight;
+ valueRect.y += baseHeight;
+
+ GUI.Label(labelRect, new GUIContent(L10n.Tr("Banks")));
+ GUI.Label(valueRect, string.Join(", ", editorEventRef.Banks.Select(x => x.Name).ToArray()));
+ labelRect.y += baseHeight;
+ valueRect.y += baseHeight;
+
+ GUI.Label(labelRect, new GUIContent(L10n.Tr("Panning")));
+ GUI.Label(valueRect, editorEventRef.Is3D ? "3D" : "2D");
+ labelRect.y += baseHeight;
+ valueRect.y += baseHeight;
+
+ GUI.Label(labelRect, new GUIContent(L10n.Tr("Stream")));
+ GUI.Label(valueRect, editorEventRef.IsStream.ToString());
+ labelRect.y += baseHeight;
+ valueRect.y += baseHeight;
+
+ GUI.Label(labelRect, new GUIContent(L10n.Tr("Oneshot")));
+ GUI.Label(valueRect, editorEventRef.IsOneShot.ToString());
+ labelRect.y += baseHeight;
+ valueRect.y += baseHeight;
+ }
+ }
+ }
+ else
+ {
+ EditorEventRef renamedEvent = GetRenamedEventRef(eventReference);
+
+ if (renamedEvent != null)
+ {
+ MismatchInfo mismatch = new MismatchInfo() {
+ Message = string.Format(L10n.Tr("Moved to {0}"), renamedEvent.Path),
+ HelpText = string.Format(
+ L10n.Tr("This event has been moved in FMOD Studio.\nYou can click the repair button to update the path to the new location, or run the {0} command to scan your project for similar issues and fix them all."),
+ EventReferenceUpdater.MenuPath),
+ RepairTooltip = string.Format(L10n.Tr("Repair: set path to {0}"), renamedEvent.Path),
+ RepairAction = (p) => {
+ p.FindPropertyRelative("Path").stringValue = renamedEvent.Path;
+ },
+ };
+
+ using (new EditorGUI.IndentLevelScope())
+ {
+ Rect mismatchRect = pathRect;
+
+ mismatchRect.xMin = position.xMin;
+ mismatchRect.xMax = position.xMax;
+ mismatchRect.y += baseHeight;
+ mismatchRect.height = baseHeight;
+
+ mismatchRect = EditorGUI.IndentedRect(mismatchRect);
+
+ DrawMismatchUI(mismatchRect, openRect.x, openRect.width, mismatch, property);
+ }
+ }
+ else
+ {
+ Rect labelRect = pathRect;
+ labelRect.xMax = position.xMax;
+ labelRect.y += baseHeight;
+ labelRect.height = WarningSize().y;
+
+ GUI.Label(labelRect, NotFoundWarning);
+ }
+ }
+ }
+ }
+
+ private static void HandleDragEvents(Rect position, SerializedProperty property)
+ {
+ Event e = Event.current;
+
+ if (e.type == EventType.DragPerform && position.Contains(e.mousePosition))
+ {
+ if (DragAndDrop.objectReferences.Length > 0 &&
+ DragAndDrop.objectReferences[0] != null &&
+ DragAndDrop.objectReferences[0].GetType() == typeof(EditorEventRef))
+ {
+ EditorEventRef eventRef = DragAndDrop.objectReferences[0] as EditorEventRef;
+
+ property.SetEventReference(eventRef.Guid, eventRef.Path);
+
+ GUI.changed = true;
+ e.Use();
+ }
+ }
+
+ if (e.type == EventType.DragUpdated && position.Contains(e.mousePosition))
+ {
+ if (DragAndDrop.objectReferences.Length > 0 &&
+ DragAndDrop.objectReferences[0] != null &&
+ DragAndDrop.objectReferences[0].GetType() == typeof(EditorEventRef))
+ {
+ DragAndDrop.visualMode = DragAndDropVisualMode.Move;
+ DragAndDrop.AcceptDrag();
+ e.Use();
+ }
+ }
+ }
+
+ private class MismatchInfo
+ {
+ public string Message;
+ public string HelpText;
+ public string RepairTooltip;
+ public Action RepairAction;
+ }
+
+ private static void DrawMismatchUI(Rect rect, float repairButtonX, float repairButtonWidth,
+ MismatchInfo mismatch, SerializedProperty property)
+ {
+ rect = EditorUtils.DrawHelpButton(rect, () => new SimpleHelp(mismatch.HelpText, 400));
+
+ Rect repairRect = new Rect(repairButtonX, rect.y, repairButtonWidth, GetBaseHeight());
+
+ if (GUI.Button(repairRect, new GUIContent(RepairIcon, mismatch.RepairTooltip), buttonStyle))
+ {
+ mismatch.RepairAction(property);
+ }
+
+ Rect labelRect = rect;
+ labelRect.xMax = repairRect.xMin;
+
+ GUI.Label(labelRect, new GUIContent(mismatch.Message, WarningIcon));
+ }
+
+ private static MismatchInfo GetMismatch(EventReference eventReference, EditorEventRef editorEventRef)
+ {
+ if (EventManager.GetEventLinkage(eventReference) == EventLinkage.Path)
+ {
+ if (eventReference.Guid != editorEventRef.Guid)
+ {
+ return new MismatchInfo() {
+ Message = L10n.Tr("GUID doesn't match path"),
+ HelpText = string.Format(
+ L10n.Tr("The GUID on this EventReference doesn't match the path.\nYou can click the repair button to update the GUID to match the path, or run the {0} command to scan your project for similar issues and fix them all."),
+ EventReferenceUpdater.MenuPath),
+ RepairTooltip = string.Format(L10n.Tr("Repair: set GUID to {0}"), editorEventRef.Guid),
+ RepairAction = (property) => {
+ property.FindPropertyRelative("Guid").SetGuid(editorEventRef.Guid);
+ },
+ };
+ }
+ }
+ else // EventLinkage.GUID
+ {
+ if (eventReference.Path != editorEventRef.Path)
+ {
+ return new MismatchInfo() {
+ Message = L10n.Tr("Path doesn't match GUID"),
+ HelpText = string.Format(
+ L10n.Tr("The path on this EventReference doesn't match the GUID.\nYou can click the repair button to update the path to match the GUID, or run the {0} command to scan your project for similar issues and fix them all."),
+ EventReferenceUpdater.MenuPath),
+ RepairTooltip = string.Format(L10n.Tr("Repair: set path to '{0}'"), editorEventRef.Path),
+ RepairAction = (property) => {
+ property.FindPropertyRelative("Path").stringValue = editorEventRef.Path;
+ },
+ };
+ }
+ }
+
+ return null;
+ }
+
+ private static void SetEvent(SerializedProperty property, string path)
+ {
+ EditorEventRef eventRef = EventManager.EventFromPath(path);
+
+ if (eventRef != null)
+ {
+ property.SetEventReference(eventRef.Guid, eventRef.Path);
+ }
+ else
+ {
+ property.SetEventReference(new FMOD.GUID(), path);
+ }
+ }
+
+ private static SerializedProperty GetGuidProperty(SerializedProperty property)
+ {
+ return property.FindPropertyRelative("Guid");
+ }
+
+ private static SerializedProperty GetPathProperty(SerializedProperty property)
+ {
+ return property.FindPropertyRelative("Path");
+ }
+
+ private static EditorEventRef GetEditorEventRef(EventReference eventReference)
+ {
+ if (EventManager.GetEventLinkage(eventReference) == EventLinkage.Path)
+ {
+ return EventManager.EventFromPath(eventReference.Path);
+ }
+ else // Assume EventLinkage.GUID
+ {
+ return EventManager.EventFromGUID(eventReference.Guid);
+ }
+ }
+
+ private static EditorEventRef GetRenamedEventRef(EventReference eventReference)
+ {
+ if (Settings.Instance.EventLinkage == EventLinkage.Path && !eventReference.Guid.IsNull)
+ {
+ EditorEventRef editorEventRef = EventManager.EventFromGUID(eventReference.Guid);
+
+ if (editorEventRef != null && editorEventRef.Path != eventReference.Path)
+ {
+ return editorEventRef;
+ }
+ }
+
+ return null;
+ }
+
+ public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
+ {
+ float baseHeight = GetBaseHeight();
+
+ EventReference eventReference = property.GetEventReference();
+ EditorEventRef editorEventRef = GetEditorEventRef(eventReference);
+
+ if (editorEventRef == null)
+ {
+ return baseHeight + WarningSize().y;
+ }
+ else
+ {
+ float height;
+
+ if (property.isExpanded)
+ {
+ height = baseHeight * 6; // 5 lines of info
+ }
+ else
+ {
+ height = baseHeight;
+ }
+
+ if (GetMismatch(eventReference, editorEventRef) != null)
+ {
+ height += WarningSize().y;
+ }
+
+ return height;
+ }
+ }
+ }
+
+#pragma warning disable 0618 // Suppress the warning about using the obsolete EventRefAttribute class
+ [CustomPropertyDrawer(typeof(EventRefAttribute))]
+#pragma warning restore 0618
+ public class LegacyEventRefDrawer : PropertyDrawer
+ {
+ private GUIStyle RichTextStyle;
+
+ private static readonly string HelpText =
+ string.Format(L10n.Tr("This field has the [EventRef] attribute, which is obsolete.\nTo resolve this issue:\n* Add a field of type EventReference to this class\nSet the MigrateTo property on the [EventRef] attribute: [EventRef(MigrateTo=\"\")]\n Run the {0} command to automatically migrate values from this field to the EventReference field"), EventReferenceUpdater.MenuPath);
+ private static readonly Texture InfoIcon = EditorGUIUtility.IconContent("console.infoicon.sml").image;
+ private static readonly Texture WarningIcon = EditorUtils.LoadImage("NotFound.png");
+
+ private void AffirmStyles()
+ {
+ if (RichTextStyle == null)
+ {
+ RichTextStyle = new GUIStyle(GUI.skin.label) { richText = true };
+ }
+ }
+
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+ {
+ AffirmStyles();
+
+ label = EditorGUI.BeginProperty(position, label, property);
+
+ Rect pathRect = position;
+ pathRect.height = EditorGUIUtility.singleLineHeight;
+
+ pathRect = EditorGUI.PrefixLabel(pathRect, label);
+ EditorGUI.PropertyField(pathRect, property, GUIContent.none);
+
+ using (new EditorGUI.IndentLevelScope())
+ {
+ GUIContent content = StatusContent(property);
+
+ Rect infoRect = EditorGUI.IndentedRect(position);
+ infoRect.y = pathRect.yMax;
+ infoRect.height = StatusSize(content).y;
+
+ infoRect = EditorUtils.DrawHelpButton(infoRect, () => new SimpleHelp(HelpText, 400));
+
+ GUI.Label(infoRect, content, RichTextStyle);
+ }
+
+ EditorGUI.EndProperty();
+ }
+
+ private GUIContent StatusContent(SerializedProperty property)
+ {
+#pragma warning disable 0618 // Suppress the warning about using the obsolete EventRefAttribute class
+ string migrationTarget = (attribute as EventRefAttribute).MigrateTo;
+#pragma warning restore 0618
+
+ if (string.IsNullOrEmpty(migrationTarget))
+ {
+ return new GUIContent(L10n.Tr("[EventRef] is obsolete - use the EventReference type instead."),
+ WarningIcon);
+
+ }
+ else
+ {
+ int parentPathLength = property.propertyPath.LastIndexOf('.');
+
+ if (parentPathLength >= 0)
+ {
+ migrationTarget = string.Format("{0}.{1}", property.propertyPath.Remove(parentPathLength), migrationTarget);
+ }
+
+ SerializedProperty targetProperty = property.serializedObject.FindProperty(migrationTarget);
+
+ if (targetProperty != null)
+ {
+ return new GUIContent(string.Format(L10n.Tr("Will be migrated to {0}"), targetProperty.displayName),
+ InfoIcon);
+ }
+ else
+ {
+ return new GUIContent(string.Format(L10n.Tr("Migration target {0} is missing"), migrationTarget),
+ WarningIcon);
+ }
+ }
+ }
+
+ private Vector2 StatusSize(GUIContent content)
+ {
+ AffirmStyles();
+
+ return Vector2.Max(RichTextStyle.CalcSize(content), EditorUtils.GetHelpButtonSize());
+ }
+
+ public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
+ {
+ return EditorGUIUtility.singleLineHeight + StatusSize(StatusContent(property)).y;
+ }
+ }
+}
diff --git a/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs.meta b/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs.meta
new file mode 100644
index 00000000..7799839f
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventRefDrawer.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 29a86a77bf7568e499243d9b47b7e88e
+timeCreated: 1432696197
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/FMOD/src/Editor/EventReferenceUpdater.cs b/Assets/Plugins/FMOD/src/Editor/EventReferenceUpdater.cs
new file mode 100644
index 00000000..3d9ddbc4
--- /dev/null
+++ b/Assets/Plugins/FMOD/src/Editor/EventReferenceUpdater.cs
@@ -0,0 +1,2458 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using UnityEditor.Experimental.SceneManagement;
+using UnityEditor.SceneManagement;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+#if UNITY_INPUTSYSTEM_EXIST
+using UnityEngine.InputSystem;
+#endif
+
+namespace FMODUnity
+{
+ public class EventReferenceUpdater : EditorWindow
+ {
+ public const string MenuPath = "FMOD/Update Event References";
+
+ private const int EventReferenceTransitionVersion = 0x00020200;
+
+ private const BindingFlags DefaultBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
+
+ private static readonly string HelpText =
+ string.Format(L10n.Tr("Click Scan to search your project for obsolete event references."));
+
+ private readonly string[] SearchFolders = {
+ "Assets",
+ };
+
+ private SceneSetup[] sceneSetup;
+
+ private IEnumerator processingState;
+
+ private SearchProgress prefabProgress;
+ private SearchProgress sceneProgress;
+ private SearchProgress scriptableObjectProgress;
+
+ [SerializeField]
+ private List assets = new List();
+
+ [SerializeField]
+ private List components = new List();
+
+ [SerializeField]
+ private List tasks = new List();
+
+ private int executableTaskCount = 0;
+
+ private TreeViewState taskViewState = new TreeViewState();
+
+ private TaskView taskView;
+
+ [NonSerialized]
+ private GUIContent status = GUIContent.none;
+
+ [NonSerialized]
+ private Task selectedTask;
+
+ [NonSerialized]
+ private Vector2 manualDescriptionScrollPosition;
+
+ [NonSerialized]
+ private static GUIContent AssetContent = new GUIContent(L10n.Tr("Asset"));
+ private static GUIContent ComponentTypeContent = new GUIContent(L10n.Tr("Component Type"));
+ private static GUIContent GameObjectContent = new GUIContent(L10n.Tr("Game Object"));
+
+ private string ExecuteButtonText()
+ {
+ return string.Format(L10n.Tr("Execute {0} Selected Tasks"), executableTaskCount);
+ }
+
+ [MenuItem(MenuPath)]
+ public static void ShowWindow()
+ {
+ EventReferenceUpdater updater = GetWindow(L10n.Tr("FMOD Event Reference Updater"));
+ updater.minSize = new Vector2(800, 600);
+
+ updater.SetStatus(HelpText);
+
+ updater.Show();
+ }
+
+ public static bool IsUpToDate()
+ {
+ return Settings.Instance.LastEventReferenceScanVersion >= EventReferenceTransitionVersion;
+ }
+
+ private void BeginSearching()
+ {
+ if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
+ {
+ tasks.Clear();
+ executableTaskCount = 0;
+ taskView.SetSelection(new List(), TreeViewSelectionOptions.FireSelectionChanged);
+ taskView.Reload();
+
+ processingState = SearchProject();
+ }
+ }
+
+ private void StopProcessing(bool isComplete)
+ {
+ processingState = null;
+
+ if (isComplete)
+ {
+ if (tasks.Count == 0)
+ {
+ SetStatus(L10n.Tr("No required tasks found. Event references are up to date."));
+ Settings.Instance.LastEventReferenceScanVersion = FMOD.VERSION.number;
+ EditorUtility.SetDirty(Settings.Instance);
+
+ SetupWizardWindow.SetUpdateTaskComplete(SetupWizardWindow.UpdateTaskType.UpdateEventReferences);
+ }
+ else if (tasks.All(x => x.HasExecuted))
+ {
+ SetStatus(L10n.Tr("Finished executing tasks. New tasks may now be required. Please re-scan your project."));
+ }
+ else
+ {
+ SetStatus(L10n.Tr("Finished scanning. Please execute the tasks above."));
+ }
+ }
+ else
+ {
+ SetStatus(L10n.Tr("Cancelled."));
+ }
+ }
+
+ private void BeginExecuting()
+ {
+ Task[] enabledTasks = tasks.Where(t => t.CanExecute()).ToArray();
+
+ if (enabledTasks.Length == 0)
+ {
+ return;
+ }
+
+ Asset[] affectedAssets = enabledTasks.Select(t => assets[t.AssetIndex]).Distinct().ToArray();
+
+ int prefabCount = affectedAssets.Count(a => IsPrefab(a.Type));
+ int sceneCount = affectedAssets.Count(a => a.Type == AssetType.Scene);
+
+ string warningText = string.Format(
+ L10n.Tr("Executing these {0} tasks will change {1} prefabs and {2} scenes on disk.\n\nPlease ensure you have committed any outstanding changes to source control before continuing!"),
+ enabledTasks.Length, prefabCount, sceneCount);
+
+ if (!EditorUtility.DisplayDialog(L10n.Tr("Confirm Bulk Changes"), warningText, ExecuteButtonText(), L10n.Tr("Cancel")))
+ {
+ return;
+ }
+
+ if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
+ {
+ processingState = ExecuteTasks(enabledTasks);
+ }
+ }
+
+ private void Cancel()
+ {
+ if (IsProcessing)
+ {
+ StopProcessing(false);
+ }
+ else
+ {
+ Close();
+ }
+ }
+
+ private bool IsProcessing { get { return processingState != null; } }
+
+ private struct SearchProgress
+ {
+ private int maximum;
+ private int current;
+
+ public float Fraction()
+ {
+ return (maximum > 0) ? (current / (float)maximum) : 1;
+ }
+
+ public void Increment()
+ {
+ if (current < maximum)
+ {
+ ++current;
+ }
+ }
+
+ public SearchProgress(int total)
+ {
+ this.maximum = total;
+ this.current = 0;
+ }
+ }
+
+ private IEnumerator SearchProject()
+ {
+ string[] prefabGuids = AssetDatabase.FindAssets("t:GameObject", SearchFolders);
+ string[] sceneGuids = AssetDatabase.FindAssets("t:Scene", SearchFolders);
+ string[] scriptableObjectGuids =
+ AssetDatabase.FindAssets("t:ScriptableObject", SearchFolders).Distinct().ToArray();
+
+ prefabProgress = new SearchProgress(prefabGuids.Length);
+ sceneProgress = new SearchProgress(sceneGuids.Length);
+ scriptableObjectProgress = new SearchProgress(scriptableObjectGuids.Length);
+
+ return SearchPrefabs(prefabGuids)
+ .Concat(SearchScriptableObjects(scriptableObjectGuids))
+ .Concat(SearchScenes(sceneGuids))
+ .GetEnumerator();
+ }
+
+ private IEnumerable SearchPrefabs(string[] guids)
+ {
+ foreach (string guid in guids)
+ {
+ string path = AssetDatabase.GUIDToAssetPath(guid);
+
+ yield return string.Format(L10n.Tr("Searching {0}"), path);
+
+ GameObject prefab = AssetDatabase.LoadAssetAtPath(path);
+
+ int assetIndex = -1;
+
+ foreach (Task task in SearchGameObject(prefab, prefab))
+ {
+ if (assetIndex < 0)
+ {
+ assetIndex = AddAsset(GetAssetType(prefab), path);
+ }
+
+ task.AssetIndex = assetIndex;
+
+ AddTask(task);
+ }
+
+ prefabProgress.Increment();
+ }
+ }
+
+ private IEnumerable SearchScriptableObjects(string[] guids)
+ {
+ foreach (string guid in guids)
+ {
+ string path = AssetDatabase.GUIDToAssetPath(guid);
+
+ yield return string.Format(L10n.Tr("Searching {0}"), path);
+
+ IEnumerable scriptableObjects =
+ AssetDatabase.LoadAllAssetsAtPath(path).OfType();
+
+ int assetIndex = -1;
+
+ foreach (ScriptableObject scriptableObject in scriptableObjects)
+ {
+ int componentIndex = -1;
+
+ foreach (Task task in GetUpdateTasks(scriptableObject))
+ {
+ if (assetIndex < 0)
+ {
+ assetIndex = AddAsset(AssetType.ScriptableObject, path);
+ }
+
+ if (componentIndex < 0)
+ {
+ componentIndex = AddComponent(scriptableObject);
+ }
+
+ task.AssetIndex = assetIndex;
+ task.ComponentIndex = componentIndex;
+
+ AddTask(task);
+ }
+ }
+
+ scriptableObjectProgress.Increment();
+ }
+ }
+
+ private IEnumerable SearchScenes(string[] guids)
+ {
+ sceneSetup = EditorSceneManager.GetSceneManagerSetup();
+
+ foreach (string guid in guids)
+ {
+ string path = AssetDatabase.GUIDToAssetPath(guid);
+
+ yield return string.Format(L10n.Tr("Searching {0}"), path);
+
+ Scene scene = SceneManager.GetSceneByPath(path);
+
+ if (!scene.IsValid())
+ {
+ scene = EditorSceneManager.OpenScene(path, OpenSceneMode.Single);
+ }
+
+ int assetIndex = -1;
+
+ foreach (GameObject gameObject in scene.GetRootGameObjects())
+ {
+ foreach (Task task in SearchGameObject(gameObject, null))
+ {
+ if (assetIndex < 0)
+ {
+ assetIndex = AddAsset(AssetType.Scene, path);
+ }
+
+ task.AssetIndex = assetIndex;
+
+ AddTask(task);
+ }
+ }
+
+ sceneProgress.Increment();
+ }
+
+ if (sceneSetup.Length > 0)
+ {
+ EditorSceneManager.RestoreSceneManagerSetup(sceneSetup);
+ }
+ }
+
+ private IEnumerable SearchGameObject(GameObject gameObject, GameObject root)
+ {
+ MonoBehaviour[] behaviours = gameObject.GetComponentsInChildren