Проект «Искореженный металл» по мотивам Twisted Metal 4. UNITY. Часть 6

Поделиться.

Всем доброго времени суток, сегодня мы запрограммируем стрельбу. Что нам для этого понадобиться? Во первых модель оружия из которого мы собираемся вести стрельбу.

Во вторых PNG изображение прицела, их валом в интернете, но я нарисовал свой.

В третьих эффект попадания и эффект выстрела, и опять за основу я беру готовый пак эффектов, который можно бесплатно скачать с магазина Unity Assets Store, он называется KTK Effect Sample set 1.1 

В четвертых два скрипта: первый будет отвечать за прицел, а второй за стрельбу. Напишем скрипт отвечающих за прицел, логика его такова: Приравнивать позицию объекта на котором висит скрипт к позиции курсора и делать курсор невидимым. В виде кода C# это выглядит так:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ControlPos : MonoBehaviour {
private GameObject Aim;
public bool CursorVisible;
// Use this for initialization
void Start () {
Aim = gameObject;
if(CursorVisible == false){
Cursor.visible = false;
}
}

// Update is called once per frame
void Update () {
Aim.transform.position = Input.mousePosition;

}
}

Повесим скрипт на прицел, разумеется он является компонентом UI, UI это 2D компоненты которые проецируются на плоскость экрана. Посмотрим что вышло.

Все работает как надо. теперь напишем скрипт стрельбы, он слегка сложнее, логика его такова: Из центра нашей камеры каждые 0.02 секунды мы пускаем невидимый луч в позицию фронтальную курсору, определяем точку попадания и разворачиваем оружие в в сторону этой точки — теперь наше оружие будет смотреть туда куда смотрит прицел. Далее при нажатии на левую кнопку мыши создается еще один луч, он движется из центра оружия  строго вперед, а в точке столкновения создается эффект попадания, в этот же момент  в точке которая расположена у основания ствола создается эффект выстрела. Если у объекта попадания есть компонент физики, то мы создаем силу направленную вперед относительно направления оружия. В виде кода C# это выглядит так:

using UnityEngine;
using System.Collections;

public class Shoot : MonoBehaviour {

public int Damage = 25;
public Camera cameraTR;
private RaycastHit hit;
private RaycastHit hitor;
private Ray ray;
private Ray rayor;
public GameObject Eff;
public GameObject Eff2;
public GameObject Spawn;
public Vector3 TarLerp;
public float Speed = 5f;
public float ForseShoot = 1000;

void Start(){
cameraTR = Camera.main;
}

void FixedUpdate ()
{
TarLerp = Vector3.Lerp (TarLerp, hitor.point, Time.deltaTime * Speed);
rayor = cameraTR.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (rayor, out hitor, 1000)) {
transform.LookAt (TarLerp);
}

if (Input.GetKeyDown (KeyCode.Mouse0))
{
Shooting();
}
}
void Shooting()
{

ray = new Ray (transform.position, transform.forward);
if (Physics.Raycast (ray, out hit, 1000f))
{
GameObject go = Instantiate (Eff2, Spawn.transform.position, Spawn.transform.rotation);
Instantiate (Eff, hit.point, hit.transform.rotation);
go.transform.parent = Spawn.transform;
if (hit.collider.gameObject.GetComponent<Rigidbody>() != null) {
hit.collider.gameObject.GetComponent<Rigidbody>().AddForce (transform.forward * ForseShoot);
}
}
}
}

Проверим что получилось.

Все работает как и было задумано, но я заметил, что после каждого выстрела создаются эффекты и они остаются на сцене после своего завершения, да они невидимые, но компонент положения все равно обрабатывается и нагружает нашу игру, Чтоб это исправить я написал небольшой скрипт который удаляет объект со сцены по прошествии заданного времени. Выглядит он так

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AllDestroy : MonoBehaviour {
public float Timer;
// Use this for initialization
void Start () {
Destroy (gameObject, Timer);
}

// Update is called once per frame
void Update () {

}
}

Отлично все функционирует. В следующей статье мы добавим возможность сетевого взаимодействия. Всем удачи и до скорых встреч 🙂 !


Поделиться.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *