Экземпляр класса null после создания - PullRequest
1 голос
/ 23 июня 2019

Обновление: как указано в комментариях ниже, Targeting target_manager;(в MakeAbility) является нулевым.Похоже, это корень проблемы, но почему она нулевая?

===========

В приведенном ниже коде я создаю экземплярКласс PartAttack, а затем назначьте ему ссылку для моего целевого менеджера.

Первый журнал отладки возвращает PartAttack.Второй возвращает ноль.

public Targeting target_manager (в первом сценарии) назначается в инспекторе игровому объекту со сценарием Targeting на нем.

Что я делаю не так?Почему это не назначает целевой менеджер правильно?

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

public class MakeAbility : MonoBehaviour
{
    public BlockScriptableObject block;

    public IDictionary<string, IAbility> abilities_parts = new Dictionary<string, IAbility>();


    public Targeting target_manager;
    public PartAttack part_attack = new PartAttack();

    private void Start()
    {
        part_attack.block_attack_damage = block.attack_damage;
        part_attack.target_manager = target_manager;
        Debug.Log(part_attack);
        Debug.Log(part_attack.target_manager);

        abilities_parts.Add("part_attack", part_attack);

    }

}

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


[System.Serializable]
public class PartAttack: IAbility
{
    public Targeting target_manager;

    public void Use()
    {

    }

}


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

public class Targeting : MonoBehaviour
{
    public int max_targets = 3;
    public string current_target = null;
    public List<Combatant> list_of_targetable = new List <Combatant>();

    public BlockScriptableObject block; // The abilityblock

    public GameObject target_clickfield_char1;
    public Combatant character_slot_1;

}

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

TargetManager, похоже, нигде не создается.

1 голос
/ 23 июня 2019

Вам необходимо установить TargetManager для выделения памяти.Это делается с помощью создания экземпляров.

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

public Targeting target_manager = new Targeting();

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

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

Это не повредит вашему последующему назначению, так как переназначение ничего не сломает, оно просто выделяет больше памяти где-то еще.

Если вы 'Если вас беспокоит утечка памяти, избавьтесь от объекта перед его повторным выделением.

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