Почему хитовая частица для умения «Нова» появляется в случайных местах по всей карте Unity? ⇐ C#
Почему хитовая частица для умения «Нова» появляется в случайных местах по всей карте Unity?
В настоящее время я разрабатываю ролевую игру в Unity 3D и столкнулся с проблемой с эффектами частиц для определенного навыка, а именно навыка «Нова». Проблема в том, что частица Hit, которая в идеале должна была появиться вокруг игрока, вместо этого появляется в, казалось бы, случайных местах по всей карте.
Вот фрагмент моего класса SkillProjectile, где, как я подозреваю, может возникнуть проблема:
public void PlayHitParticle() { если (нажмите != ноль) { GameObject hitInstance = PoolManager.Instance.GetPool(hitName).Get(); hitInstance.transform.position = GameManager.weapon.transform.position; Invoke("ReleaseHitParticle", 1f); } } А вот как я обрабатываю навык Nova в классе SkillBehavior:
public void NovaTarget() { Collider[] hitColliders = Physics.OverlapSphere(GameManager.weapon.transform.position,killData.splash, targetLayer); foreach (столкновение коллайдера в hitColliders) { Цель IDamageable = столкновение.gameObject.GetComponent(); если (цель!= ноль) { target.TakeDamage(skillData.damage); } } } Ниже приведены все скрипты.
публичный класс PoolManager: MonoBehaviour { общественный статический экземпляр PoolManager {get; частный набор; } пулы public Dictionary; общедоступный пул GameObject PoolObjectParent; частная пустота Пробуждение() { если (экземпляр == ноль) { Экземпляр = это; пулы = новый словарь(); poolObjectParent = новый GameObject("PoolObjects"); } еще { Уничтожить (игровой объект); } } частная пустота Старт() { foreach (SkillPrefab GameObject в SkillManager.Instance.allSkillPrefabs) { SkillBehavior навыкBehavior = навыкPrefab.GetComponent(); CreatePool(skillPrefab.name,killPrefab); CreatePool(skillBehavior.projectile.name,killBehavior.projectile); CreatePool(skillBehavior.hit.name,killBehavior.hit); CreatePool(skillBehavior.flash.name,killBehavior.flash); } } общедоступный ObjectPool GetPool (идентификатор строки) { если (!pools.ContainsKey(id)) { Debug.Log(id + "키가 없어"); } вернуть пулы [id]; } public void CreatePool (идентификатор строки, префаб GameObject, int InitialSize = 50) { ObjectPool newPool = новый ObjectPool ( createFunc: () => Instantiate(prefab, GameManager.weapon.transform.position, Quaternion.identity), actionOnGet: экземпляр => { экземпляр.transform.position = GameManager.weapon.transform.position; экземпляр.SetActive(истина); }, actionOnRelease: экземпляр => { экземпляр.SetActive(ложь); экземпляр.transform.position = GameManager.weapon.transform.position; экземпляр.transform.SetParent(poolObjectParent.transform, false); }, defaultCapacity: начальный размер ); pools.Add(id, newPool); } } открытый класс SkillBehavior: MonoBehaviour { общедоступные данные навыковSkillData; публичный снаряд GameObject; публичное попадание GameObject; общедоступная флэш-память GameObject; публичный GameObject[] Отсоединен; общественная LayerMask targetLayer; общественная LayerMask groundLayer; частный плавающий поискRadius = 1500f; частная трансформация targetTransform; частный кватернион targetQuaternion; частная пустота Старт() { УстановитьЦель(); if (skillData.skillType == SkillType.Nova) { СоздатьПроектил(); НоваТаржет(); возвращаться; } переключатель (skillData.shotType) { случай ShotType.Burst: StartCoroutine (CreateProjectileBurst()); перерыв; случай ShotType.Multi: СоздатьПроектилМульти(); перерыв; по умолчанию: СоздатьПроектил(); перерыв; } } частная пустота SetTarget() { НайтиБлижайшуюЦель(); если (targetTransform!= ноль) { targetQuaternion = Quaternion.LookRotation(targetTransform.position - Transform.position); } } Private void FindNearTarget() // 리스트 내에서 가장 가까운 타겟 검사 { float NearDistance = searchRadius; foreach (Враг-враг в EnemySpawner.currentEnemies) { если (враг == ноль) { продолжать; } float distanceToTarget = (enemy.transform.position - Transform.position).sqrMagnitude; если (distanceToTarget < близкое расстояние) { NearDistance = DistanceToTarget; targetTransform = враг.трансформация; } } } публичная недействительность CreateProjectile() { Навык GameObject = PoolManager.Instance.GetPool(projectile.name).Get(); SkillProjectile навыкProjectile = навык.GetComponent(); навыкProjectile.projectileName = снаряд.имя; навыкProjectile.hitName = hit.name; навыкProjectile.flashName = flash.name; навыкProjectile.targetTransform = targetTransform; SkillProjectile.type = SkillData.skillType; навыкProjectile.hit = попадание; навыкProjectile.flash = вспышка; навыкProjectile.Detached = Отсоединен; навыкProjectile.isPierceHitPlay = навыкData.isPierceHitPlay; навыкProjectile.targetLayer = targetLayer; навыкProjectile.groundLayer = groundLayer; навыкПроект.скорость = данные навыка.скорость; навыкProjectile.splash = навыкData.splash; SkillProjectile.damage = SkillData.damage; навыкProjectile.lifeTime = навыкData.lifeTime; } частный IEnumerator CreateProjectileBurst() { float BurstInterval = SkillData.shotTypeValue * 0.1f; for (int i = 0; я
В настоящее время я разрабатываю ролевую игру в Unity 3D и столкнулся с проблемой с эффектами частиц для определенного навыка, а именно навыка «Нова». Проблема в том, что частица Hit, которая в идеале должна была появиться вокруг игрока, вместо этого появляется в, казалось бы, случайных местах по всей карте.
Вот фрагмент моего класса SkillProjectile, где, как я подозреваю, может возникнуть проблема:
public void PlayHitParticle() { если (нажмите != ноль) { GameObject hitInstance = PoolManager.Instance.GetPool(hitName).Get(); hitInstance.transform.position = GameManager.weapon.transform.position; Invoke("ReleaseHitParticle", 1f); } } А вот как я обрабатываю навык Nova в классе SkillBehavior:
public void NovaTarget() { Collider[] hitColliders = Physics.OverlapSphere(GameManager.weapon.transform.position,killData.splash, targetLayer); foreach (столкновение коллайдера в hitColliders) { Цель IDamageable = столкновение.gameObject.GetComponent(); если (цель!= ноль) { target.TakeDamage(skillData.damage); } } } Ниже приведены все скрипты.
публичный класс PoolManager: MonoBehaviour { общественный статический экземпляр PoolManager {get; частный набор; } пулы public Dictionary; общедоступный пул GameObject PoolObjectParent; частная пустота Пробуждение() { если (экземпляр == ноль) { Экземпляр = это; пулы = новый словарь(); poolObjectParent = новый GameObject("PoolObjects"); } еще { Уничтожить (игровой объект); } } частная пустота Старт() { foreach (SkillPrefab GameObject в SkillManager.Instance.allSkillPrefabs) { SkillBehavior навыкBehavior = навыкPrefab.GetComponent(); CreatePool(skillPrefab.name,killPrefab); CreatePool(skillBehavior.projectile.name,killBehavior.projectile); CreatePool(skillBehavior.hit.name,killBehavior.hit); CreatePool(skillBehavior.flash.name,killBehavior.flash); } } общедоступный ObjectPool GetPool (идентификатор строки) { если (!pools.ContainsKey(id)) { Debug.Log(id + "키가 없어"); } вернуть пулы [id]; } public void CreatePool (идентификатор строки, префаб GameObject, int InitialSize = 50) { ObjectPool newPool = новый ObjectPool ( createFunc: () => Instantiate(prefab, GameManager.weapon.transform.position, Quaternion.identity), actionOnGet: экземпляр => { экземпляр.transform.position = GameManager.weapon.transform.position; экземпляр.SetActive(истина); }, actionOnRelease: экземпляр => { экземпляр.SetActive(ложь); экземпляр.transform.position = GameManager.weapon.transform.position; экземпляр.transform.SetParent(poolObjectParent.transform, false); }, defaultCapacity: начальный размер ); pools.Add(id, newPool); } } открытый класс SkillBehavior: MonoBehaviour { общедоступные данные навыковSkillData; публичный снаряд GameObject; публичное попадание GameObject; общедоступная флэш-память GameObject; публичный GameObject[] Отсоединен; общественная LayerMask targetLayer; общественная LayerMask groundLayer; частный плавающий поискRadius = 1500f; частная трансформация targetTransform; частный кватернион targetQuaternion; частная пустота Старт() { УстановитьЦель(); if (skillData.skillType == SkillType.Nova) { СоздатьПроектил(); НоваТаржет(); возвращаться; } переключатель (skillData.shotType) { случай ShotType.Burst: StartCoroutine (CreateProjectileBurst()); перерыв; случай ShotType.Multi: СоздатьПроектилМульти(); перерыв; по умолчанию: СоздатьПроектил(); перерыв; } } частная пустота SetTarget() { НайтиБлижайшуюЦель(); если (targetTransform!= ноль) { targetQuaternion = Quaternion.LookRotation(targetTransform.position - Transform.position); } } Private void FindNearTarget() // 리스트 내에서 가장 가까운 타겟 검사 { float NearDistance = searchRadius; foreach (Враг-враг в EnemySpawner.currentEnemies) { если (враг == ноль) { продолжать; } float distanceToTarget = (enemy.transform.position - Transform.position).sqrMagnitude; если (distanceToTarget < близкое расстояние) { NearDistance = DistanceToTarget; targetTransform = враг.трансформация; } } } публичная недействительность CreateProjectile() { Навык GameObject = PoolManager.Instance.GetPool(projectile.name).Get(); SkillProjectile навыкProjectile = навык.GetComponent(); навыкProjectile.projectileName = снаряд.имя; навыкProjectile.hitName = hit.name; навыкProjectile.flashName = flash.name; навыкProjectile.targetTransform = targetTransform; SkillProjectile.type = SkillData.skillType; навыкProjectile.hit = попадание; навыкProjectile.flash = вспышка; навыкProjectile.Detached = Отсоединен; навыкProjectile.isPierceHitPlay = навыкData.isPierceHitPlay; навыкProjectile.targetLayer = targetLayer; навыкProjectile.groundLayer = groundLayer; навыкПроект.скорость = данные навыка.скорость; навыкProjectile.splash = навыкData.splash; SkillProjectile.damage = SkillData.damage; навыкProjectile.lifeTime = навыкData.lifeTime; } частный IEnumerator CreateProjectileBurst() { float BurstInterval = SkillData.shotTypeValue * 0.1f; for (int i = 0; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Генерация случайных чисел с использованием библиотеки случайных чисел C++11.
Anonymous » » в форуме C++ - 0 Ответы
- 96 Просмотры
-
Последнее сообщение Anonymous
-