#概要
こんにちは。Unity関連の質問と思いましたので、こちらに書かせていただきます。
私は、現在Unityを使用しているゲーム(Cities: Skylines)において、パーティクルを使用して雪を降らせ、積雪を可能にするmod制作を行っております。
多くの方のご協力もあって、雪を降らせることはできました。
しかし、次のステップにあたる、ゲーム内の建物に積雪させることができずに、悩んでいます。
具体的には、雪のパーティクルと、ゲーム内の建物にそれぞれColliderを追加したのですが、ゲーム内の建物のColliderだけが反映されません。
雪のパーティクルのColliderにつきましては、ゲーム内でCubeを作成したところ、問題なく動作したため、問題はゲーム内の建物につけようとしたColliderだと思います。
なお、調べたところ、ゲーム内のオブジェクト原本? は弄ることができなかったため、Instantiate関数で複製したものにColliderをつけようとしています。(その後、位置や回転を調整し、Materialで透明にして、表向きは原本だけ見えるようにするつもりです)
#詳細
Unityのバージョンは5.6.6f2です。
ソースコードは以下の通りです。
C#
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using ICities; 5using UnityEngine; 6using ColossalFramework; 7using ColossalFramework.IO; 8using ColossalFramework.Plugins; 9 10namespace UnlimitedAccumulateSnow 11{ 12 13 public class UASInfo : IUserMod 14 { 15 16 public string Name 17 { 18 get { return "UnlimitedAccumulateSnow"; } 19 } 20 21 public string Description 22 { 23 get { return "UnlimitedAccumulateSnow"; } 24 25 } 26 } 27 28 public class UASLoad : ILoadingExtension 29 { 30 public void OnCreated(ILoading loading) 31 { 32 33 } 34 35 public void OnLevelLoaded(LoadMode mode) 36 { 37 38 GameObject config = new GameObject(); 39 40 config.AddComponent<UASUpdate>(); 41 } 42 43 public void OnLevelUnloading() 44 { 45 46 } 47 48 public void OnReleased() 49 { 50 51 } 52 53 54 55 56 57 } 58 59 public class UASUpdate : MonoBehaviour 60 { 61 Material snowMaterial; 62 63 ParticleSystem snowParticle; 64 65 GameObject snow; 66 67 void Start() 68 { 69 GameObject originBuildings = BuildingManager.instance.m_buildings.m_buffer[13432].Info.gameObject; 70 Instantiate(originBuildings, new Vector3(-331.5078f, 500f, -592.5841f), Quaternion.identity); 71 72 originBuildings.AddComponent<MeshCollider>(); 73 MeshCollider buildingsCollider = originBuildings.GetComponent<MeshCollider>(); 74 buildingsCollider.enabled = true; 75 buildingsCollider.isTrigger = false; 76 77 78 79 80 81 82 GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); 83 cube.transform.position = new Vector3(0, 200f, 0); 84 cube.transform.localScale = new Vector3(100f, 1f, 100f); 85 cube.AddComponent<BoxCollider>(); 86 BoxCollider cubeCollider = cube.GetComponent<BoxCollider>(); 87 cubeCollider.enabled = true; 88 cubeCollider.isTrigger = false; 89 90 91 92 transform.position = new Vector3(-331.5078f, 1000f, -592.5841f); 93 94 95 snow = GameObject.CreatePrimitive(PrimitiveType.Sphere); 96 Mesh snowMesh = snow.GetComponent<MeshFilter>().sharedMesh; 97 98 99 100 Destroy(snow); 101 102 103 Shader snowShader = Shader.Find("Legacy Shaders/Diffuse"); 104 snowMaterial = snowShader == null ? null : new Material(snowShader); 105 106 snowParticle = gameObject.AddComponent<ParticleSystem>(); 107 snowParticle.Stop(); 108 ParticleSystem.MainModule mainModule = snowParticle.main; 109 ParticleSystem.ShapeModule snowShapeModule = snowParticle.shape; 110 ParticleSystem.EmissionModule snowDensity = snowParticle.emission; 111 ParticleSystem.CollisionModule snowCollision = snowParticle.collision; 112 ParticleSystemRenderer rendererModule = GetComponent<ParticleSystemRenderer>(); 113 114 snowCollision.enabled = true; 115 snowCollision.type = ParticleSystemCollisionType.World; 116 snowCollision.sendCollisionMessages = false; 117 snowCollision.quality = ParticleSystemCollisionQuality.High; 118 snowCollision.enableDynamicColliders = true; 119 120 121 ParticleSystem.MinMaxCurve snowBounce = snowCollision.bounce; 122 snowBounce.constant = 0; 123 snowCollision.bounce = snowBounce; 124 125 ParticleSystem.MinMaxCurve snowDampen = snowCollision.dampen; 126 snowDampen.constant = 1; 127 snowCollision.dampen = snowDampen; 128 129 130 131 snowDensity.rateOverTime = 100000; 132 133 snowShapeModule.radius = 1000.0f; 134 135 mainModule.startSpeed = 0.1f; 136 mainModule.startSize = 10.0f; 137 mainModule.maxParticles = 1000; 138 mainModule.gravityModifier = 0.5f; 139 mainModule.startLifetime = 300.0f; 140 141 142 snowMaterial.color = Color.white; 143 rendererModule.mesh = snowMesh; 144 rendererModule.renderMode = ParticleSystemRenderMode.Mesh; 145 rendererModule.sharedMaterial = snowMaterial; 146 } 147 148 void Update() 149 { 150 151 152 if (Input.GetMouseButtonDown(1)) 153 { 154 155 snowParticle.Play(); 156 157 158 } 159 } 160 161 void OnDestroy() 162 { 163 Destroy(snowMaterial); 164 } 165 } 166 167}
なお、UASUpdateクラス以外はCities: Skylines独自のスクリプトですので、今回はおそらく無関係だと思います。
また、BuildingManager.instance.m_buildings.m_buffer[13432].Info.gameObject;
の部分が、ゲーム内の建物を】呼び出している部分です。
C#
1GameObject originBuildings = BuildingManager.instance.m_buildings.m_buffer[13432].Info.gameObject; 2 Instantiate(originBuildings, new Vector3(-331.5078f, 500f, -592.5841f), Quaternion.identity); 3 4 originBuildings.AddComponent<MeshCollider>(); 5 MeshCollider buildingsCollider = originBuildings.GetComponent<MeshCollider>(); 6 buildingsCollider.enabled = true; 7 buildingsCollider.isTrigger = false;
以上の部分で、Colliderを設定しようとしました。座標が細かいのは、無視していただければ幸いです。
スクリプトの一部を切り取ってしまうと、問題が発生するのではと思ったので、全文載せさせていただいております。
つたない質問ですが、ご回答宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。