У меня тут есть неплохой скриптик стрельбы для FPS, но у меня никак не получяется сделать врага, то есть урон. У меня unity почемуто не хочет распознавать тег объекта столкновения. может я что то не так делаю? вот мой скрипт:
Code
var Helf = 100; var UziBulletDamage = 10;
function DamageUziBullet(){ Helf -= UziBulletDamage; if (Helf <1){ Destroy(gameObject); } } function OnTriggerEnter (collider : Collider) { if (collider.tag == ("UziBullet")){ DamageUziBullet(); } }
и вот скрипт оружия:
Code
var Bullet : Collider; var Launcher : GameObject; var BulletReload : float = 0.0; var ReloadTime : float = 0.00; var Body : Transform; var Potrons = 10; var MaxPotrons = 10; var Zapas = 5; var ReloadSound : GameObject; var CanShoot = true; var CanReload = true; var CanCam = true; var PritselTexture : GUITexture; var Pritsel1 : Texture2D; var Pritsel2 : Texture2D; var WalkSound : GameObject; var kamera : Camera; var hit : RaycastHit;
function Update () { if (Input.GetButton("Fire1")){ Fire(); Bulletreload(); } if (Input.GetKey("r")){ Reload(); } if (Input.GetButtonDown("Fire2")){ kamera.camera.fieldOfView = 35; PritselTexture.texture = Pritsel1; kamera.animation.CrossFade("Camera1"); } if (Input.GetButtonUp("Fire2")){ kamera.camera.fieldOfView = 60; PritselTexture.texture = Pritsel2; kamera.animation.CrossFade("Camera2"); } if (Input.GetKey("w")){ Body.animation.CrossFade("Walk"); WalkSound.audio.Play(); } if (Input.GetKey("d")){ Body.animation.CrossFade("Walk"); } if (Input.GetKey("s")){ Body.animation.CrossFade("Walk"); } if (Input.GetKey("a")){ Body.animation.CrossFade("Walk"); } } function Fire(){ if (CanShoot) if (Potrons > 0){ if ( Physics.Raycast( Launcher.transform.position, Launcher.transform.forward, hit ) ) { Instantiate( Bullet, hit.point, Quaternion.LookRotation( hit.normal ) );
Если при первом затыке бросать проект, то лучше вообще не начинать. По делу. Что значит "Не работает?" Ошибки есть? Знакомо такое - Debug.Log? Можете использовать его? Что выдает в логе?
Cкорее всего коллайдеры на пулях малы, а скорость большая и пули пролетают сквозь обьект не успев зафиксировать попадание. Физика в Юнити далеко не идеальна. Иногда приходиться извращаться.
VolkOrievith, с телефона не особо удобно смотретьс крипт, так что смразу спрошу: я атк понимаю, у тебя стрельба не через Raycast-систему, ведь так? а почему не сделать стрельбу именно по ней? всё же намного проще станет. Да, и уроков много - посмотришь готовые скрипты, разберешься, напишешь/перепишешь под себя.
Я вот не понял - зачем Вы ее создаете в месте попадания? Смысл? Если Вы хотите видеть пулю - нужно создавать ее в месте вылета из оружия и отправлять в полет к месту попадания. Если Вы ее создали в месте попадания - Вы ее не увидите. Значит Вам не нужно видеть пулю. Но если так - зачем ее вообще создавать?
Я не знаю других методов для урона, кроме OnCollisionEnter и OnTriggerEnter. Если Вы мне посоветуете другие способы, я буду очень рад. Я пробовал создавать пулю возле ствола и отправлять её по адресу, но почему то скрипт игнорировал некоторые строки.
Сообщение отредактировал VolkOrievith - Пт, 23 Ноя 2012, 19:58
Доброго времени суток! Вопрос может уже и не актуален, но я делал это так:
1. Создаю префаб с объектом снаряда 2. На объект вешаю rigidbody и скрипт, в котором делаю: if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), out hit, 1)) { obj = hit.collider.gameObject; if(obj.tag == "Enemy"){ .............................. } } 3. Создаю дочерний, от дула орудия, пустой объект в месте, из которого ЯКОБЫ должен вылететь снаряд, на который вешаю скрипт опроса нажатия клавиши "ОГОНЬ!!!" и при true событии создаю из префаба объект снаряда и даю ему AddForce. 4. Работая, скрипт из п.2 дает ссыль на объект, в которм уменьшаем HP.