public static void Start() { GameObject go = Selection.activeGameObject; GameObject prefab = GameObject.Instantiate(go); LightmapData[] datas = LightmapSettings.lightmaps; Renderer[] renderers = go.GetComponentsInChildren <Renderer>(); foreach (Renderer renderer in renderers) { if (renderer.lightmapIndex != -1) { GameObject tg = PublicTools.FindChild(prefab, renderer.gameObject.name); LightmapGameObject ll = tg.AddComponent <LightmapGameObject>(); ll.lightmapIndex = renderer.lightmapIndex; ll.lightmapScaleOffset = renderer.lightmapScaleOffset; } } Scene scene = prefab.AddComponent <Scene>(); scene.farTextures = new Texture2D[datas.Length]; scene.nearTextures = new Texture2D[datas.Length]; for (int i = 0; i < datas.Length; i++) { scene.farTextures[i] = datas[i].lightmapFar; scene.nearTextures[i] = datas[i].lightmapNear; } scene.fieldOfView = Camera.main.fieldOfView; scene.ambientLight = RenderSettings.ambientLight; scene.ambientIntensity = RenderSettings.ambientIntensity; scene.fog = RenderSettings.fog; scene.fogColor = RenderSettings.fogColor; scene.fogStartDistance = RenderSettings.fogStartDistance; scene.fogEndDistance = RenderSettings.fogEndDistance; string path = "Assets/Arts/map/" + go.name + ".prefab"; PrefabUtility.CreatePrefab(path, prefab); GameObject.DestroyImmediate(prefab); AssetBundleTools.SetAssetBundleName(path, go.name); SuperDebug.Log("场景Prefab构造完成!"); }
public static void CombinePart(GameObject _main, GameObject[] _parts, string[] _jointNames, float[] _partScales) { SkinnedMeshRenderer skinnedMeshRenderer = _main.GetComponentInChildren <SkinnedMeshRenderer>(); Mesh oldMesh = skinnedMeshRenderer.sharedMesh; RenderTexture resultTexture = new RenderTexture(512, 256, 0); Graphics.SetRenderTarget(resultTexture); GL.LoadPixelMatrix(0, 512, 256, 0); Graphics.DrawTexture(new Rect(0, 0, 512, 256), skinnedMeshRenderer.sharedMaterial.mainTexture); // Graphics.SetRenderTarget (null); Vector3[] vertices = oldMesh.vertices; Vector3[] normals = oldMesh.normals; Vector2[] uvs = oldMesh.uv; Vector2[] uv2s = oldMesh.uv2; BoneWeight[] boneWeights = oldMesh.boneWeights; int[] triangles = oldMesh.triangles; int nowVertexCount = oldMesh.vertexCount; List <Texture> partTextureList = new List <Texture> (); for (int i = 0; i < _parts.Length; i++) { int uvFixIndex = -1; for (int m = 0; m < partTextureList.Count; m++) { if (_parts[i].GetComponent <MeshRenderer> ().sharedMaterial.mainTexture == partTextureList[m]) { uvFixIndex = m; break; } } if (uvFixIndex == -1) { uvFixIndex = partTextureList.Count; // MeshRenderer mmm = _parts[i].GetComponent<MeshRenderer> (); partTextureList.Add(_parts[i].GetComponent <MeshRenderer> ().sharedMaterial.mainTexture); Graphics.DrawTexture(COMBINE_PART_TEXTURE_RECT_ARR[uvFixIndex], _parts[i].GetComponent <MeshRenderer> ().sharedMaterial.mainTexture); } Mesh partMesh = _parts[i].GetComponent <MeshFilter>().sharedMesh; GameObject dummy = PublicTools.FindChild(_main, _jointNames[i]); int boneIndex = -1; for (int n = 0; n < skinnedMeshRenderer.bones.Length; n++) { if (skinnedMeshRenderer.bones[n].name == dummy.transform.parent.name) { boneIndex = n; break; } } Array.Resize <Vector3>(ref vertices, nowVertexCount + partMesh.vertexCount); Array.Resize <Vector3>(ref normals, nowVertexCount + partMesh.vertexCount); Array.Resize <Vector2>(ref uvs, nowVertexCount + partMesh.vertexCount); Array.Resize <Vector2>(ref uv2s, nowVertexCount + partMesh.vertexCount); // if(partMesh.uv2.Length > 0){ // // Array.ConstrainedCopy(partMesh.uv2,0,uv2s,nowVertexCount,partMesh.vertexCount); // } Array.Resize <BoneWeight>(ref boneWeights, nowVertexCount + partMesh.vertexCount); Matrix4x4 mm = Matrix4x4.Scale(new Vector3(_partScales[i], _partScales[i], _partScales[i])); Matrix4x4 dummyBindposes = skinnedMeshRenderer.sharedMesh.bindposes[boneIndex].inverse * (dummy.transform.worldToLocalMatrix * dummy.transform.parent.localToWorldMatrix).inverse * mm; for (int m = 0; m < partMesh.vertexCount; m++) { int index = m + nowVertexCount; vertices[index] = dummyBindposes.MultiplyPoint3x4(partMesh.vertices[m]); normals[index] = dummyBindposes.MultiplyVector(partMesh.normals[m]); uvs[index] = new Vector2(partMesh.uv[m].x * COMBINE_PART_UV_FIX_ARR[uvFixIndex].x + COMBINE_PART_UV_FIX_ARR[uvFixIndex].y, partMesh.uv[m].y * COMBINE_PART_UV_FIX_ARR[uvFixIndex].z + COMBINE_PART_UV_FIX_ARR[uvFixIndex].w); if (partMesh.uv2.Length == 0) { uv2s[index] = new Vector2(-1, 0); } else { uv2s[index] = new Vector2(-1, partMesh.uv2[m].y); } BoneWeight boneWeight = new BoneWeight(); boneWeight.boneIndex0 = boneIndex; boneWeight.weight0 = 1; boneWeights[index] = boneWeight; } int trianglesNum = triangles.Length; Array.Resize <int>(ref triangles, trianglesNum + partMesh.triangles.Length); for (int m = 0; m < partMesh.triangles.Length; m++) { triangles[m + trianglesNum] = nowVertexCount + partMesh.triangles[m]; } nowVertexCount = nowVertexCount + partMesh.vertexCount; } Mesh resultMesh = new Mesh(); resultMesh.bindposes = oldMesh.bindposes; resultMesh.vertices = vertices; resultMesh.normals = normals; resultMesh.uv = uvs; resultMesh.uv2 = uv2s; resultMesh.triangles = triangles; resultMesh.boneWeights = boneWeights; skinnedMeshRenderer.sharedMesh = resultMesh; skinnedMeshRenderer.material.mainTexture = resultTexture; // skinnedMeshRenderer.material.SetInt ("_PartIndex", 1); }
private static void AllLoadOK <T>(string _mainHandWeaponJoint, string _offHandWeaponJoint, float _weaponScale, float _horseScale, string[] _particleJoints, GameObject _hero, RuntimeAnimatorController _animatorController, GameObject _mainHandWeapon, GameObject _offHandWeapon, GameObject _horse, GameObject[] _particles, GameObject[] _mainHandWeaponParticles, GameObject[] _offHandWeaponParticles, GameObject _wing, Action <GameObject> _callBack, bool _addHeroControl, bool isDownHouse) where T : HeroController { Animator animator = _hero.GetComponent <Animator> (); if (animator.runtimeAnimatorController == null && _animatorController != null) { animator.runtimeAnimatorController = _animatorController; AnimatorFactory.Instance.AddUseNum(_animatorController); } if (_addHeroControl) { HeroController heroController = null; GameObject horseContainer = null; GameObject body = _hero.GetComponentInChildren <Renderer>().gameObject; HeroControllerDispatcher heroControllerDispatcher = _hero.GetComponent <HeroControllerDispatcher>(); if (heroControllerDispatcher == null) { _hero.AddComponent <HeroControllerDispatcher>(); } if (_horse != null) { horseContainer = new GameObject(_hero.name + "ma"); _horse.transform.SetParent(horseContainer.transform, false); heroController = horseContainer.AddComponent <T> (); heroController.horse = _horse.GetComponentInChildren <Renderer>().gameObject; _horse.transform.localScale = new Vector3(_horseScale, _horseScale, _horseScale); if (isDownHouse) { _hero.transform.localPosition = Vector3.zero; _hero.transform.SetParent(horseContainer.transform, false); } else { GameObject bone = PublicTools.FindChild(_horse, HORSE_CHAIN_BONE_NAME); bone.transform.localScale = new Vector3(1 / _horseScale, 1 / _horseScale, 1 / _horseScale); _hero.transform.SetParent(bone.transform, true); _hero.transform.localPosition = Vector3.zero; } } else { heroController = _hero.AddComponent <T> (); } heroController.body = body; if (_particles != null) { for (int i = 0; i < _particles.Length; i++) { PublicTools.AddChild(_hero, _particles[i], _particleJoints[i]); } heroController.particles = _particles; } if (_mainHandWeapon != null) { GameObject mainWeaponContainer = new GameObject(); //为了让武器上的粒子配合武器进行缩放 所以添加了这个容器 mainWeaponContainer.name = "mainHandWeapon"; heroController.mainHandWeaponContainer = mainWeaponContainer; mainWeaponContainer.transform.localScale = new Vector3(_weaponScale, _weaponScale, _weaponScale); PublicTools.AddChild(_hero, mainWeaponContainer, _mainHandWeaponJoint); if (!MERGE_WEAPON) { heroController.mainHandWeapon = _mainHandWeapon; _mainHandWeapon.transform.SetParent(mainWeaponContainer.transform, false); } if (_mainHandWeaponParticles != null) { heroController.mainHandWeaponParticles = _mainHandWeaponParticles; for (int i = 0; i < _mainHandWeaponParticles.Length; i++) { _mainHandWeaponParticles[i].transform.SetParent(mainWeaponContainer.transform, false); } } } if (_offHandWeapon != null) { GameObject offWeaponContainer = new GameObject(); //为了让武器上的粒子配合武器进行缩放 所以添加了这个容器 offWeaponContainer.name = "offHandWeapon"; heroController.offHandWeaponContainer = offWeaponContainer; offWeaponContainer.transform.localScale = new Vector3(_weaponScale, _weaponScale, _weaponScale); PublicTools.AddChild(_hero, offWeaponContainer, _offHandWeaponJoint); if (!MERGE_WEAPON) { heroController.offHandWeapon = _offHandWeapon; _offHandWeapon.transform.SetParent(offWeaponContainer.transform, false); } if (_offHandWeaponParticles != null) { heroController.offHandWeaponParticles = _offHandWeaponParticles; for (int i = 0; i < _offHandWeaponParticles.Length; i++) { _offHandWeaponParticles[i].transform.SetParent(offWeaponContainer.transform, false); } } } if (_wing != null) { GameObject heroDummy = PublicTools.FindChild(_hero, WING_DUMMY_NAME); GameObject wingDummy = PublicTools.FindChild(_wing, WING_DUMMY_NAME); _wing.transform.localPosition = (wingDummy.transform.worldToLocalMatrix * wingDummy.transform.parent.localToWorldMatrix).MultiplyPoint(_wing.transform.localPosition); _wing.transform.SetParent(heroDummy.transform, false); heroController.wing = _wing.GetComponentInChildren <Renderer>().gameObject; } heroController.Init(); if (_horse != null) { PublicTools.SetGameObjectVisible(horseContainer, true); _callBack(horseContainer); } else { PublicTools.SetGameObjectVisible(_hero, true); _callBack(_hero); } } else { _callBack(_hero); } }