实例化后,类实例为null

时间:2019-06-23 20:25:20

标签: c# unity3d

更新:如以下注释中所述,目标Target_manager; (在MakeAbility中)为null。这似乎是问题的根源,但是为什么它为null?

===========

在下面的代码中,我创建了PartAttack类的实例,然后将其分配给目标管理器的引用。

第一个调试日志返回PartAttack。第二个返回null。

在检查器中将公共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 个答案:

答案 0 :(得分:2)

TargetManager似乎没有在任何地方实例化。

答案 1 :(得分:1)

您需要将TargetManager设置为内存分配。这是通过实例化完成的。

您可以为聚合类创建一个构造器,以通过实例化变量来分配此内存,也可以在主函数中将target_manager设置为一些新的内存分配。

public Targeting target_manager = new Targeting();

C#很快。而且,我们不能指望在声明指针后不久就看到实例化的对象。我知道系统中其他地方有一个游戏对象最终会分配给它,但是对于您的调试脚本,这还没有发生。

如果要始终在其中构造东西,则需要将其分配给构造函数内部的空对象。尤其是如果您编写了一行代码,在声明其存在之后将立即对其进行访问。不要依赖于其他对象中存在的其他代码。在计算机上,该代码距离很远。

这不会伤害您以后的分配,因为重新分配不会破坏任何东西,它只会在其他地方分配更多的内存。

如果您担心内存泄漏,请在重新声明该对象之前将其处置。