Добавить сценарий, наследующий от сценария объекта к игровому объекту - PullRequest
0 голосов
/ 15 мая 2018

У меня есть скрипт под названием Weapon.cs, который является объектом сценариев.

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

public abstract class Weapon : ScriptableObject {

protected Camera _mainCamera;
protected Transform _weaponTransform;
protected int _damage;
protected int _fireRatePerSecond;
protected bool _isAutomaticWeapon;

protected void FireWeapon()
{
    //if the weapon is automatic
    if (_isAutomaticWeapon)
    {
        ShootRapidFireOnMouseHold();
    }
    //if the weapon is semi automatic
    else
    {
        ShootSingleBulletOnMouseClick();
    }
}

protected void MoveWeaponWithCamera(Transform weaponTransform)
{
    _weaponTransform.rotation = _mainCamera.transform.rotation; //temporary way of making sure the gun moves with the camera
}

protected void ShootSingleBulletOnMouseClick()
{
    if (Input.GetKeyDown(KeyCode.Mouse0)) //if left mouse button is clicked
    {
        CastRay();
    }
}

protected void ShootRapidFireOnMouseHold()
{
    if (Input.GetKey(KeyCode.Mouse0)) //if left mouse button is held down
    {
        CastRay(); //rapid fire
        //PlayShootAnimation();
    }
}

protected void CastRay()
{
    RaycastHit hit;
    if (Physics.Raycast(_mainCamera.transform.position, _mainCamera.transform.forward, out hit, 100))
    {
        Debug.Log(hit.transform.name);
    }
}
//protected abstract void PlayShootAnimation();
}

У меня есть второй скрипт с именем MachineGun.cs, который наследуется от Weapon.cs и, следовательно, косвенно от объекта сценариев.

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

public class MachineGun : Weapon{

private GameObject _machineGunBarrel;

//private float _animationVelocity;

// Use this for initialization
void Start () {
    //initialize the basic properties of a weapon
    _damage = 7;
    _fireRatePerSecond = 10;
    _isAutomaticWeapon = true;

    _weaponTransform = GameObject.Find("Weapon_MachineGun").transform;
    _machineGunBarrel = GameObject.Find("machinegun_p1");

    _mainCamera = Camera.main;

}

// Update is called once per frame
void Update () {
    MoveWeaponWithCamera(_weaponTransform);
    FireWeapon();
}

//protected override void Shoot()
//{
//    RaycastHit hit;
//    if(Physics.Raycast(_mainCamera.transform.position, _mainCamera.transform.forward, out hit, 100))
//    {
//        Debug.Log(hit.transform.name);
//    }
//}

void PlayShootAnimation()
{
    _machineGunBarrel.transform.RotateAround(_machineGunBarrel.transform.up, _fireRatePerSecond * Time.deltaTime);
    PlayShootAnimation(); //play the shoot animation of the gun
}
}

В настоящее время это невозможно, так как MachineGun.cs больше не наследует монобихиоролик.

У меня есть игровой объект с оружием в моей сцене, и вот мой вопрос: Как мне добавить скрипт MachineGun.cs в качестве компонента моего игрового объекта оружия? Или, поскольку это невозможно,

Как мне построить систему оружия с помощью общего сценария Weapon.cs, из которого все оружие может наследовать основные функции и поля / переменные?

РЕДАКТИРОВАТЬ 1: предоставил код для моего поста и добавил «почему я хочу это сделать».

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

ScriptableObjects в основном следует использовать ориентированным на данные способом, они очень удобны и достаточно эффективны для выполнения задачи. Кроме того, преследование вашего проекта MonoBehaviour является очень плохой (и широко распространенной) практикой.

IMO , у вас должен быть MonoBehaviour с управлением логикой оружия, а ваши ScriptableObjects должны быть вашими данными о оружии (что интерпретируется путем загрузки их в ваш Оружие MonoBehaviour ), такое, что у вас есть Minigun, Glock, Katana .. объекты сценариев с такими данными, как скорость атаки, скорость перезарядки, размер зарядного устройства, модель оружия / текстуры, ссылка на Модель Hitbox, Ядадаяда. (У вас может быть общее оружие MonoBehaviour , но вы можете получить оружие, оружие, лезвие и т. Д. Для очень специфического управления, но для него все равно потребуются данные из ScriptableObjects )

Короче говоря, ваши MonoBehaviours определяют использование и взаимодействие, а ваши ScriptableObjects определяют характеристики

0 голосов
/ 15 мая 2018

ScriptableObject говорит:

Описание

Класс, который вы можете получить, если хотите создавать объекты, которые не необходимо прикрепить к игровым объектам .

Так что либо вы не должны прикреплять этот скрипт к игровому объекту, либо извлекать свой объект из "MonoBehaviour", если вы хотите прикрепить его к игровому объекту.

Почему вы взяли его из ScriptableObject?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...