Как сделать отдачу при стрельбе с помощью raycast?

Программирование на Юнити.

Как сделать отдачу при стрельбе с помощью raycast?

Сообщение KiR_Ka 07 дек 2018, 01:27

Как сделать отдачу при стрельбе с помощью raycast?
Сам кулстори:
Решил запилить шутер на юньке, из многочисленных способов реализации стрельбы выбрал raycast. Все вроде работает, НО хочу реализовать отдачу (резкий отброс камеры вверх после выстрела(еще желательно немного в правую или левую сторону)) всё испробовал, не получилось. Вместе с камерой само тело игрока начинает валится назад, вбок, а потом вместо того чтобы нормально ходить, как-то криво летает по всей сцене :(( ! Вообщем, я кину скрипт ходьбы, mouselook, и рейкастинга(самой стрельбы). Пожалуйта помогите! Буду очень рад!

Рейкаст (стрельба):
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class RayShooter : MonoBehaviour

{

    private Camera _camera;
    void Start()
    {
        _camera = GetComponent<Camera>();

        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 point = new Vector3(
            _camera.pixelWidth / 2, _camera.pixelHeight / 2, 0);
          Ray ray = _camera.ScreenPointToRay(point);
          RaycastHit hit;

            if (Physics.Raycast(ray, out hit)){
                GameObject hitObject = hit.transform.gameObject;
                ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();
                if (target != null)
                {
                    target.ReactToHit();
                }
                else
                {
                    StartCoroutine(SphereIndicator(hit.point));
                }
            }
        }
    }
    private IEnumerator SphereIndicator(Vector3 pos)
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = pos;
        yield return new WaitForSeconds(1);
        Destroy(sphere);
    }
}


Mouselook:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour {

    public enum RotationAxes
    {
        MouseXAndY = 0,
        MouseX = 1,
        MouseY = 2
    }
    public RotationAxes axes = RotationAxes.MouseXAndY;

    public float sensitivityHor = 9.0f;
    public float sensitivityVert = 9.0f;

    public float minimumVert = -45.0f;
    public float maximumVert = 45.0f;

    private float _rotationX = 0;

    // Use this for initialization
    void Start () {
        Rigidbody body = GetComponent<Rigidbody>();
        if (body != null)
        body.freezeRotation = true;
    }
       
        // Update is called once per frame
        void Update () {
                if (axes == RotationAxes.MouseX)
        {
            transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);
        }
        else if (axes == RotationAxes.MouseY)
        {
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;

            _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);


            float rotationY = transform.localEulerAngles.y;

            transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
        }
        else {
            _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;

            _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);


            float delta = Input.GetAxis("Mouse X") * sensitivityHor;

            float rotationY = transform.localEulerAngles.y + delta;


            transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
        }
        }
}
 


Ходьба(FPSinput):
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]
[AddComponentMenu("Control Script/FPS Input")]

public class FPSInput : MonoBehaviour {

    public float speed = 6.0f;
    public float gravity = -9.8f;

    private CharacterController _charController;

        // Use this for initialization
        void Start () {
        _charController = GetComponent<CharacterController>();
        }
       
        // Update is called once per frame
        void Update () {
        float deltaX = Input.GetAxis("Horizontal") * speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
        Vector3 movement = new Vector3(deltaX, 0,deltaZ);
        movement = Vector3.ClampMagnitude(movement, speed);
        movement.y = gravity;

        movement *= Time.deltaTime;
        movement = transform.TransformDirection(movement);
        _charController.Move(movement);
    }
}
 
KiR_Ka
UNец
 
Сообщения: 13
Зарегистрирован: 07 дек 2018, 00:55
Откуда: Тюмень
Skype: Kote Kotin

Re: Как сделать отдачу при стрельбе с помощью raycast?

Сообщение DimaJoke 07 дек 2018, 20:20

А зачем рейкаст?
Просто намудри что-нибудь с самим оружием. Так и реалистичнее будет
Что бы повзрослеть, человек должен преодолеть ошибки юности.

Поэтому я снова здесь..
Аватара пользователя
DimaJoke
UNITрон
 
Сообщения: 293
Зарегистрирован: 12 авг 2018, 18:59
Откуда: Ульяновск
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 10