【问题标题】:My Bullet is not getting instantiated where my Player is. It is getting instantiated from center only我的 Bullet 没有在我的 Player 所在的位置实例化。它仅从中心实例化
【发布时间】:2023-01-11 02:41:55
【问题描述】:

我是 Unity 和 Stackoverflow 的新手。需要你的帮助,因为我陷入了下面提到的这种情况。 当我产生我的弹丸(子弹)时,它应该在玩家的当前位置实例化但它没有改变。子弹仅从中心生成(而不是从玩家的位置生成)。请指教。 image is for reference

SpawnobjectController 脚本


public class SpawnobjectController : MonoBehaviour
{
    [SerializeField]
     GameObject projectilereference;
    
    [SerializeField]
     GameObject enemyreference;

    [SerializeField]
     GameObject playerreference;

    void Start()
    {
        StartCoroutine(Enemycoroutine());
        StartCoroutine(ProjectileCoroutine());
 }

     
    void SpawnProjectile() 
    {
        
        Instantiate(projectilereference, new Vector3(playerreference.transform.position.x,projectilereference.transform.position.y,0.0f), Quaternion.identity);
    }

    IEnumerator ProjectileCoroutine() 
    {
        while (true)
        {
            SpawnProjectile();
            yield return new WaitForSeconds(2.0f);
        }
    }



    IEnumerator Enemycoroutine()
    {
        while (true) { 
        SpawnEnemy();
        yield return new WaitForSeconds(1.0f);
    }
    }
    void SpawnEnemy() 
    {
        Instantiate(enemyreference, enemyreference.transform.position, Quaternion.identity);
    }
}

玩家控制器脚本

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

public class PlayerController : MonoBehaviour
{
    float _horizontalAxisPlayer;
    float _playerSpeed = 5f;
    float _maxXBoundry = 2.31f;
    void Start()
    {
        
    }

    
    void Update()
    {
        ControlPlayerBoundries();
        PlayerMovement();
    }

    void PlayerMovement() 
    {
        _horizontalAxisPlayer = Input.GetAxis("Horizontal")*_playerSpeed*Time.deltaTime;
        transform.Translate(new Vector3(_horizontalAxisPlayer, 0.0f, 0.0f));
    }

    void ControlPlayerBoundries() 
    {
        if (transform.position.x>_maxXBoundry)
        {
            transform.position = new Vector3(_maxXBoundry,transform.position.y,0.0f);
        }
        else if (transform.position.x<-_maxXBoundry)
        {
            transform.position = new Vector3(-_maxXBoundry, transform.position.y, 0.0f);
        }

    }
}

敌人控制器

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

public class EnemyController : MonoBehaviour
{
    [SerializeField]
    private float enemeySpeed = 2f;
    void Start()
    {
        
    }

    
    void Update()
    {
        transform.Translate(Vector3.down * enemeySpeed * Time.deltaTime);
    }
}

弹丸控制器脚本

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

public class ProjectileController : MonoBehaviour
{
    [SerializeField]
   private GameObject Playerref;
    [SerializeField]
    private float projectile_speed = 2f;
    void Start()
    {
        
    }

    
    void Update()
    {
      //  print(Playerref.transform.position);
        
       
    }

    private void LateUpdate()
    {
        transform.Translate(new Vector3(transform.position.x, 0.5f) * projectile_speed * Time.deltaTime);
    }
}

【问题讨论】:

  • SpawnProjectile 正在使用来自播放器的xy,而不是xzy up,所以尝试使用玩家的xz来匹配玩家的位置,并使用正值y来设置子弹开始的高度。
  • @ps2goat 首先,非常感谢您的及时回复。我如下更改了 Spawnprojectile 方法:但仍然得到相同的结果。子弹仅从中心生成。抱歉,如果我误解了您的回答请求您提供帮助。 void SpawnProjectile() { Instantiate(projectilereference, new Vector3(playerreference.transform.position.x,projectilereference.transform.position.y,playerreference.transform.position.z), Quaternion.identity); }
  • 您的 spawn 对象使用播放器作为 x,但使用预制件作为 y。所以可能为零。
  • 嗨@BugFinder,谢谢。您能否帮我解决一下我需要在此代码中进行哪些更改,以便获得预期的结果。请指教。

标签: unity3d game-development unityscript


【解决方案1】:

您的问题可能出在翻译项目符号的脚本中。 由于您共享的代码完全符合您的要求。假设我们在前视图中。

我已经通过使用你的脚本和敌人脚本的副本来代替将它们移动到Vector3.Up方向的子弹来验证这一点。 还要确保你

【讨论】:

  • 你好 ephb,我刚刚在这里添加了我的 ProjectileController 脚本(翻译 Bullet)。请检查并帮助我。
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多