统一位置与更新功能不同



在此代码中,当我试图获得transform.position_attackPoint.position。值一直是(0,0,0)但是当我在Update方法中得到转换时,它打印正常。

public class MeleeWeapon : Weapon
{
[SerializeField] private Transform _attackPoint;
[SerializeField] private float _attackRange;
[SerializeField] private LayerMask _enemyLayers;
private void Update()
{
Debug.Log(transform.position); // Prints right
}
public override void Attack()
{
Debug.Log(transform.position); // Prints 0,0,0
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(_attackPoint.position, _attackRange, _enemyLayers);
Debug.Assert(hitEnemies.Length > 0); // Assertion failed
foreach(Collider2D enemy in hitEnemies)
{
Debug.Log($"We hit {enemy.name}");
CharacterStats stats = enemy.GetComponent<CharacterStats>();
if (stats == null) continue;
stats.ApplyDamage(damage);
}
}
}

游戏视图我正在实例化MeleeWeapon,如bellow

foreach (PivotToTransform pivot in pivotPoints)
{
if (pivot.slot == item.initialSlot)
{
// Instantiate prefab
GameObject it = Instantiate(item.prefab, pivot.point.position, Quaternion.identity);
if (!item.isDisposable) // If item not disposable set parent transform
it.transform.SetParent(pivot.point);
// Set current prefab
_currentPrefab = it;
}
}

这里是枢轴:

枢轴点

这是MeleeWeapon预制件:

MeleeWeapon预制

我用

进攻
try
{
var equippedItems = EquipmentManager.Instance.equippedItems;
var selectedSlot = EquipmentManager.Instance.selectedSlot;
if (equippedItems.ContainsKey(selectedSlot))
{
// Try to get weapon
Item equippedItem = equippedItems[selectedSlot];
Weapon weapon = equippedItem.prefab.GetComponent<Weapon>();
if (weapon == null) throw new System.Exception();
// Actualy attack
weapon.Attack();
if (equippedItem.isDisposable)
{
RemoveState state = Inventory.Instance.RemoveItem(equippedItem, 1);
// Unequip item if removed
switch (state)
{
case RemoveState.Removed:
EquipmentManager.Instance.UnEquip(equippedItem.initialSlot);
break;
case RemoveState.Error:
throw new System.Exception();
}
}
// Set cooldown
sm.StartCoroutine(Cooldown(equippedItem.cooldown));
}
else
{
sm.ChangeState(sm.IdleState);
}
}
catch (System.Exception)
{
sm.ChangeState(sm.IdleState);
}

你在打电话:

Weapon weapon = equippedItem.prefab.GetComponent<Weapon>();

当我读到这篇文章时,看起来你得到的是预制而不是实例。为什么不从Item中检索Weapon脚本?你得到:

Item equippedItem = equippedItems[selectedSlot];

,我认为你需要把武器从equippedItem上拿下来,而不是预制件上。

Weapon weapon = equippedItem.GetComponent<Weapon>();

当你从预制件中获取脚本时,你将获得一个未被实例化的GameObject中未激活的脚本。

你试过使用transform吗?localPosition ?

gameObject的父对象可以引起这个

看起来做父母没什么问题。当我尝试攻击时,我使用的是未实例化的预制。我修改了攻击脚本,像这样,它解决了。

EquipmentManager.Instance.currentPrefab.GetComponent<MeleeWeapon>().Attack();

最新更新