更新:如以下注释中所述,目标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;
}
答案 0 :(得分:2)
TargetManager似乎没有在任何地方实例化。
答案 1 :(得分:1)
您需要将TargetManager设置为内存分配。这是通过实例化完成的。
您可以为聚合类创建一个构造器,以通过实例化变量来分配此内存,也可以在主函数中将target_manager设置为一些新的内存分配。
public Targeting target_manager = new Targeting();
C#很快。而且,我们不能指望在声明指针后不久就看到实例化的对象。我知道系统中其他地方有一个游戏对象最终会分配给它,但是对于您的调试脚本,这还没有发生。
如果要始终在其中构造东西,则需要将其分配给构造函数内部的空对象。尤其是如果您编写了一行代码,在声明其存在之后将立即对其进行访问。不要依赖于其他对象中存在的其他代码。在计算机上,该代码距离很远。
这不会伤害您以后的分配,因为重新分配不会破坏任何东西,它只会在其他地方分配更多的内存。
如果您担心内存泄漏,请在重新声明该对象之前将其处置。