A multiplayer VR framework w/voice chat
at main 111 lines 3.3 kB view raw
1// NOTE: Very WIP, Does not work!! 2 3use anyhow::bail; 4use bevy::{prelude::*, transform::components::Transform}; 5use unity_asset::environment::{Environment, EnvironmentObjectRef}; 6use unity_asset_binary::unity_version::UnityVersion; 7use unity_asset_decode::mesh::MeshParser; 8 9use crate::{BevyObject, BevyObjectData, unity::{component::{Component, mesh_renderer::MeshRenderer, transform::into_bevy_transform}, unity_value::try_unity_mesh_to_bevy}}; 10 11mod component; 12mod unity_value; 13 14#[derive(Debug)] 15pub struct UnityGameObject{ 16 pub name: String, 17 pub active: bool, 18 19 pub transform: Transform, 20 pub mesh_renderer: Option<MeshRenderer>, 21 pub mesh_filter: Option<Mesh>, 22} 23 24pub fn load( path: &'static str ) -> anyhow::Result<Vec<BevyObject>>{ 25 let mesh_parser = MeshParser::new(UnityVersion::parse_version("2020.3.12f1").unwrap()); 26 27 let mut env = Environment::new(); 28 env.load(path)?; 29 30 let mut gameobjects = vec![]; 31 32 for obj in env.objects(){ 33 match obj{ 34 EnvironmentObjectRef::Binary(v) => { 35 if v.object.class_id() == 1{ 36 let obj = v.object.read()?; 37 let go = obj.as_gameobject().unwrap(); 38 39 let mut components: Vec<Box<dyn Component>> = vec![]; 40 41 let mut transform = None; 42 let mut mesh_renderer = None; 43 let mut mesh_filter = None; 44 45 let comps = obj.get("m_Component").unwrap().as_array().unwrap(); 46 47 for comp in comps{ 48 let obj = comp.as_object().unwrap().get("component").unwrap(); 49 let path_id = obj.as_object().unwrap().get("m_PathID").unwrap().as_i64().unwrap(); 50 51 let comp = env.find_binary_object(path_id).unwrap(); 52 let comp = comp.read().unwrap(); 53 54 match comp.class_id(){ 55 4 => transform = Some(into_bevy_transform(comp)), // Normal Transform 56 224 => transform = Some(into_bevy_transform(comp)), // Rect Transform (gonna just treat it as normal) 57 58 23 => mesh_renderer = Some(MeshRenderer::from(comp)), 59 33 => { 60 let mesh = comp.get("m_Mesh").unwrap(); 61 let path_id = mesh.as_object().unwrap().get("m_PathID").unwrap().as_i64().unwrap(); 62 63 let mesh = env.find_binary_object(path_id).unwrap(); 64 let mesh_obj = mesh.read().unwrap(); 65 66 if let Some(mesh) = try_unity_mesh_to_bevy(mesh_obj, &mesh_parser){ 67 mesh_filter = Some(mesh); 68 } else{ 69 println!("[WARN] Failed to load mesh for: {}", go.name); 70 } 71 }, 72 73 _ => {} 74 } 75 } 76 77 if transform.is_none(){ bail!("Cannot find transform for object {}", go.name); } 78 79 let gameobject = UnityGameObject { 80 name: go.name, 81 active: go.active, 82 83 transform: transform.unwrap(), 84 mesh_renderer, 85 mesh_filter 86 }; 87 88 gameobjects.push(gameobject); 89 break; 90 } 91 }, 92 _ => {} 93 } 94 } 95 96 let mut objs = vec![]; 97 98 for go in gameobjects{ 99 if go.active{ 100 if let Some(mesh) = go.mesh_filter{ 101 objs.push(BevyObject { 102 name: go.name, 103 transform: go.transform, 104 data: BevyObjectData::Mesh(mesh) 105 }); 106 } 107 } 108 } 109 110 Ok(objs) 111}