Задать вопрос
  • Почему Instantiate иногда создаёт объект не в том месте?

    @Cheezy_one Автор вопроса
    Как я уже написал - нулевая, при этом периодически спавнится там, где и должна , а также при любом движении её положение становится правильным( этого бы не происходило, будь у меня ошибка в префабе)
  • Почему Instantiate иногда создаёт объект не в том месте?

    @Cheezy_one Автор вопроса
    Мимокрокодил, Насчёт нерабочего кода - я не заметил при копировании, почему-то просто пропала часть , хотя она там, естественно, везде есть. Спасибо за советы, попробую протестировать предложенные Вами варианты, если ничего не получится - постараюсь выкрутиться как-то иначе, но ,опять же, спасибо за уделённое время
  • Почему Instantiate иногда создаёт объект не в том месте?

    @Cheezy_one Автор вопроса
    Ещё замечу, что делал DrawRay по совету человека повыше - опять же рисуется луч из точки, которая явно выше оружия. В самом коде пока что есть несколько временных костылей для простоты проверки работоспособности, поэтому сложно читаться будет, наверное
  • Почему Instantiate иногда создаёт объект не в том месте?

    @Cheezy_one Автор вопроса
    У оружия коллайдера нет в принципе. К тому же при первом касании коллайдера пуля уничтожается.
    У пули пытался полностью отключить скрипт - не повлияло ни на что, полностью комментировал и скрипт оружия( кроме строки Instantiate ) - эффекта тоже не было. Зато, как я уже писал чуть выше, проблема прошла, когда перезапустил unity , при этом при создании нового оружия - появляется на нём
    Тут скрипт пистолета :
    public class Pistol : MonoBehaviour
    {
    [SerializeField] private GameObject Bullet;
    [SerializeField] private Camera PlayerCam;
    [SerializeField] private bool AddBulletSpread = true;
    private Vector3 BulletSpread = new Vector3(0.05f, 0.05f, 0.05f);
    [SerializeField] private ParticleSystem ShootingParticle;
    [SerializeField] private Transform BulletSpawnPoint;
    private float Range = 10000f;
    [SerializeField] private LayerMask IgnorePlayer;
    void Update()
    {
    if (Input.GetMouseButtonDown(0))
    {
    if (transform.parent != null)
    {
    if (transform.parent.gameObject.layer == 3)
    {
    Shoot();
    }
    }
    }
    }
    private void Shoot()
    {
    Instantiate(ShootingParticle, BulletSpawnPoint);
    Vector3 BulletDirection = PlayerCam.transform.forward;
    BulletDirection = GetDirection();
    Physics.Raycast(PlayerCam.transform.position, BulletDirection, out RaycastHit hit, Range, IgnorePlayer);
    GameObject BulletObj = Instantiate(Bullet, BulletSpawnPoint.position, Quaternion.identity) as GameObject;
    Debug.DrawRay(BulletSpawnPoint.position, BulletDirection * 100f, Color.red);
    BulletObj.GetComponent().hit = hit;
    BulletObj.GetComponent().BulletDirection = BulletDirection;
    BulletObj.GetComponent().Shooter = gameObject;
    BulletObj.GetComponent().StartPosition = PlayerCam.transform.position;
    BulletObj.GetComponent().velocity = (hit.point - BulletSpawnPoint.position).normalized * 15;
    }

    private Vector3 GetDirection()
    {
    Vector3 BulletDirection = PlayerCam.transform.forward;
    if (AddBulletSpread)
    {
    BulletDirection += new Vector3
    (
    Random.Range(-BulletSpread.x, BulletSpread.x),
    Random.Range(-BulletSpread.y, BulletSpread.y),
    Random.Range(-BulletSpread.z, BulletSpread.z)
    );
    BulletDirection.Normalize();
    }
    return BulletDirection;
    }

    Вот и скрипт пули

    public class Bullet : MonoBehaviour
    {
    public float BulletDamage = 10f;
    public ParticleSystem ImpactParticle;
    public RaycastHit hit;
    public Vector3 StartPosition;
    public Vector3 BulletDirection;
    private int ShotObjectLayer=10;
    private int NormalLayer;

    [SerializeField] private LayerMask ShotObject;
    public GameObject Shooter;
    //public GameObject Shooter;

    private void Update()
    {
    Destroy(gameObject, 8f);
    }
    private void OnCollisionEnter(Collision collision)
    {
    if (collision.transform.GetComponent() == null)
    {
    Hit(collision);
    }
    else if (collision.transform.GetComponent().Shooter != Shooter)
    {
    Hit(collision);
    }
    }
    private void Hit(Collision collision)
    {
    NormalLayer = collision.gameObject.layer;
    collision.gameObject.layer = ShotObjectLayer;
    if (collision.transform.GetComponent() != null)
    {
    collision.transform.GetComponent().takeDamage(BulletDamage);
    }
    Vector3 fromPosition = StartPosition;
    Vector3 toPosition = collision.contacts[0].point;
    Vector3 direction = toPosition - fromPosition;

    Physics.Raycast(StartPosition, direction, out RaycastHit hit, 10000f, ShotObject);
    if (!(hit.normal == Vector3.zero))
    {
    ParticleSystem Particle = Instantiate(ImpactParticle, hit.point, Quaternion.LookRotation(hit.normal));
    }
    collision.gameObject.layer = NormalLayer;

    Destroy(gameObject);
    }

    }
    Насчёт корявости самого кода - особо не судите, опыта написания почти нет.
  • Почему Instantiate иногда создаёт объект не в том месте?

    @Cheezy_one Автор вопроса
    Если я правильно понял, через RayCast придётся урон делать одновременно с выстрелом, что мне не особо понравилось, а ещё пули могут друг друга сбить, что я решил добавить к себе, поэтому делаю через GameObject. Насчёт совета - луч рисуется не из того места( а из того, где появляется пуля). Случайно выяснил, что перезапуск unity фиксит баг, но если создаю новый пистолет/автомат, то они снова будут багованные (до следующего перезапуска)