если будет полезен для ответа, вот мой скрипт стрельбы:
Синтаксис:
Используется javascript
var range = 100.0;
var fireRate = 0.05;
var force = 100.0;
var damage = 5.0;
var bulletsPerClip = 17;
var clips = 2;
var reloadTime = 0.7;
var accuracy = 1;
var currentMode = fireMode.semi;
var soundFire : AudioClip;
var soundReload : AudioClip;
var soundEmpty : AudioClip;
var bulletHolePrefab : GameObject;
var layerMask : LayerMask;
var muzzleFlash : Renderer;
enum fireMode { none, semi, auto}
private var bulletsLeft : int = 0;
private var allBullets;
private var nextFireTime = 0.0;
private var mainCamera;
private var sound : AudioSource;
private var reload : boolean;
function Start () {
bulletsLeft = bulletsPerClip;
allBullets = clips*bulletsPerClip;
mainCamera = GameObject.FindWithTag("MainCamera");
sound = gameObject.transform.parent.GetComponent.<AudioSource>();
}
function Update() {
//если не идет перезарядка, то можно стрелять и перезаряжать, иначе нельзя стрелять и перезаряжать пока перезарядка не пройдет.
if (reload==false) {
if (Input.GetKeyDown("r")){
Reload();
}
if (Input.GetButtonDown("Fire1")){
if (bulletsLeft >0) {
if (currentMode == fireMode.semi) {
Fire();
}
} else {
sound.PlayOneShot(soundEmpty);
}
}
if (Input.GetButton("Fire1")){
if (currentMode == fireMode.auto) {
Fire();
}
}
}
print(Mathf.Ceil(parseFloat(allBullets)/parseFloat(bulletsPerClip)) +"/"+ bulletsLeft);
}
function Fire () {
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time - fireRate > nextFireTime)
nextFireTime = Time.time - Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime < Time.time && bulletsLeft != 0) {
FireOneShot();
nextFireTime += fireRate;
}
}
function FireOneShot () {
//var direction = transform.TransformDirection(Vector3.forward);
var direction = transform.TransformDirection(Vector3(Random.Range(-0.01, 0.01) * accuracy, Random.Range(-0.01, 0.01) * accuracy,1));
var hit : RaycastHit;
//Debug.DrawLine(mainCamera.transform.position,direction*range,Color.red); //для отладки
// Проверяем попала ли куда-нибудь пуля
if (Physics.Raycast (mainCamera.transform.position, direction, hit, range,layerMask.value)) {
var rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
// если пуля попадает в физический объект то двигаем его
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
// если пуля попала в объект "Untagged" то сделать на нем дырку и приклеить ее к объекту
if (hit.transform.tag == "Untagged") {
var bulletHole : GameObject = Instantiate (bulletHolePrefab, hit.point, rotation);
bulletHole.transform.parent = hit.transform;
hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
}
sound.PlayOneShot(soundFire);
bulletsLeft--;
StartCoroutine(ShowMuzzleFlash());
}
// перезарядка
function Reload () {
if (allBullets >0 && bulletsLeft != bulletsPerClip) {
if (allBullets > bulletsPerClip) {
reload = true;
sound.PlayOneShot(soundReload);
yield WaitForSeconds(reloadTime);
allBullets-= bulletsPerClip-bulletsLeft;
bulletsLeft =bulletsPerClip;
reload = false;
} else {
reload = true;
sound.PlayOneShot(soundReload);
yield WaitForSeconds(reloadTime);
var bullet = Mathf.Clamp(bulletsPerClip,allBullets,bulletsLeft+allBullets);
allBullets -= (bullet-bulletsLeft);
bulletsLeft = bullet;
reload = false;
}
}
}
// показать вспышку от выстрела
function ShowMuzzleFlash () {
muzzleFlash.transform.localRotation *= Quaternion.Euler(0, 0, Random.Range(-360, 360));
//muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
muzzleFlash.enabled = true;
yield WaitForSeconds(0.05f);
muzzleFlash.enabled = false;
}
var fireRate = 0.05;
var force = 100.0;
var damage = 5.0;
var bulletsPerClip = 17;
var clips = 2;
var reloadTime = 0.7;
var accuracy = 1;
var currentMode = fireMode.semi;
var soundFire : AudioClip;
var soundReload : AudioClip;
var soundEmpty : AudioClip;
var bulletHolePrefab : GameObject;
var layerMask : LayerMask;
var muzzleFlash : Renderer;
enum fireMode { none, semi, auto}
private var bulletsLeft : int = 0;
private var allBullets;
private var nextFireTime = 0.0;
private var mainCamera;
private var sound : AudioSource;
private var reload : boolean;
function Start () {
bulletsLeft = bulletsPerClip;
allBullets = clips*bulletsPerClip;
mainCamera = GameObject.FindWithTag("MainCamera");
sound = gameObject.transform.parent.GetComponent.<AudioSource>();
}
function Update() {
//если не идет перезарядка, то можно стрелять и перезаряжать, иначе нельзя стрелять и перезаряжать пока перезарядка не пройдет.
if (reload==false) {
if (Input.GetKeyDown("r")){
Reload();
}
if (Input.GetButtonDown("Fire1")){
if (bulletsLeft >0) {
if (currentMode == fireMode.semi) {
Fire();
}
} else {
sound.PlayOneShot(soundEmpty);
}
}
if (Input.GetButton("Fire1")){
if (currentMode == fireMode.auto) {
Fire();
}
}
}
print(Mathf.Ceil(parseFloat(allBullets)/parseFloat(bulletsPerClip)) +"/"+ bulletsLeft);
}
function Fire () {
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time - fireRate > nextFireTime)
nextFireTime = Time.time - Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime < Time.time && bulletsLeft != 0) {
FireOneShot();
nextFireTime += fireRate;
}
}
function FireOneShot () {
//var direction = transform.TransformDirection(Vector3.forward);
var direction = transform.TransformDirection(Vector3(Random.Range(-0.01, 0.01) * accuracy, Random.Range(-0.01, 0.01) * accuracy,1));
var hit : RaycastHit;
//Debug.DrawLine(mainCamera.transform.position,direction*range,Color.red); //для отладки
// Проверяем попала ли куда-нибудь пуля
if (Physics.Raycast (mainCamera.transform.position, direction, hit, range,layerMask.value)) {
var rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
// если пуля попадает в физический объект то двигаем его
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
// если пуля попала в объект "Untagged" то сделать на нем дырку и приклеить ее к объекту
if (hit.transform.tag == "Untagged") {
var bulletHole : GameObject = Instantiate (bulletHolePrefab, hit.point, rotation);
bulletHole.transform.parent = hit.transform;
hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
}
sound.PlayOneShot(soundFire);
bulletsLeft--;
StartCoroutine(ShowMuzzleFlash());
}
// перезарядка
function Reload () {
if (allBullets >0 && bulletsLeft != bulletsPerClip) {
if (allBullets > bulletsPerClip) {
reload = true;
sound.PlayOneShot(soundReload);
yield WaitForSeconds(reloadTime);
allBullets-= bulletsPerClip-bulletsLeft;
bulletsLeft =bulletsPerClip;
reload = false;
} else {
reload = true;
sound.PlayOneShot(soundReload);
yield WaitForSeconds(reloadTime);
var bullet = Mathf.Clamp(bulletsPerClip,allBullets,bulletsLeft+allBullets);
allBullets -= (bullet-bulletsLeft);
bulletsLeft = bullet;
reload = false;
}
}
}
// показать вспышку от выстрела
function ShowMuzzleFlash () {
muzzleFlash.transform.localRotation *= Quaternion.Euler(0, 0, Random.Range(-360, 360));
//muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
muzzleFlash.enabled = true;
yield WaitForSeconds(0.05f);
muzzleFlash.enabled = false;
}
буду очень благодарен за помощь!!!