我创建了一个Prefab
,然后使用以下代码将其加载到Awake
函数中:
GameObject bulletPrefab = Resources.Load<GameObject>("Enemy/Bullet");
bulletPrefab.transform.position = new Vector3(0,0,0);
问题是bulletPrefab
不会出现在游戏场景中。其activeSelf
属性为true
,但其activeInHierarchy
属性为false
。有谁知道为什么会这样,以及如何在场景中制作bulletprefab
节目?
答案 0 :(得分:2)
不要修改预制件。您尝试bulletPrefab.transform.position = ...
bulletPrefab
是一个加载的GameObject,它只存储在内存中。要查看它,您必须使用Instantiate函数对其进行实例化。您似乎已经在其他question中完成了此操作,但出于某种原因决定删除此问题中的关键部分。
看看你的上一篇question,看来你的问题就是拍摄预制件。您不要通过将子弹的位置设置到一个框架中的另一个位置来拍摄预制件。您可以使用协程并在多个帧上执行该操作,或者您可以使用Rigidbody
。我建议使用Rigidbody
,因为这是为它制作的东西。
确保Rigidbody
附加到您要加载的预制件上。加载预制件,实例化它然后连接Rigidbody
。将子弹移动到播放器+相机的前面,然后使用Rigidbody.velocity
或Rigidbody.AddForce
将子弹射向CameraTransform.forward
方向,这样子弹将朝相机方向移动面对。
请参阅下文,了解按下空格键时加载和拍摄子弹预制件的示例。
GameObject bulletPrefab;
Transform cameraTransform;
public float bulletSpeed = 300;
private void Start()
{
//Load Prefab
bulletPrefab = Resources.Load<GameObject>("Enemy/Bullet");
//Get camera transform
cameraTransform = Camera.main.transform;
}
void Update()
{
//Shoot bullet when space key is pressed
if (Input.GetKeyDown(KeyCode.Space))
{
shootBullet();
}
}
void shootBullet()
{
//Instantiate prefab
GameObject tempObj = Instantiate(bulletPrefab) as GameObject;
//Set position of the bullet in front of the player
tempObj.transform.position = transform.position + cameraTransform.forward;
//Get the Rigidbody that is attached to that instantiated bullet
Rigidbody projectile = GetComponent<Rigidbody>();
//Shoot the Bullet
projectile.velocity = cameraTransform.forward * bulletSpeed;
}