[英]How to move a Game prefab in unity
下面是我的代碼,但我不知道為什么當_lazerPrefab
生成時它不會移動,即使_lazerSpeed != 0
也是如此。 我不知道問題出在哪里。
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(_lazerPrefab, transform.position, Quaternion.identity);
_lazerPrefab.transform.Translate(Vector3.up * _lazerSpeed * Time.deltaTime);
}
您不能移動預制件本身,因為預制件就像用於構建真實 object 實例的“藍圖”,因此得名。 您確實可以移動這些實例。 Instantiate() 將返回對新創建的副本/實例的引用!
if (Input.GetKeyDown(KeyCode.Space))
{
GameObject new_lazer = Instantiate(_lazerPrefab, transform.position, Quaternion.identity);
new_lazer.transform.Translate(Vector3.up * _lazerSpeed * Time.deltaTime);
}
但是,當您按空格鍵時,此代碼將始終生成一個新實例。 一旦你產生了第二個,你將不再移動第一個,因為第一個實例的Translate
調用不再完成。
所以你需要調整你的邏輯。 要么在 lazers 上放置“移動/加速前進”腳本,要么將Instantiate()
返回的引用保存在列表中並維護它們及其生命周期。
僅當Input.GetKeyDown(KeyCode.Space)
為真時,您才移動_lazerprefab
。
如果您想在按下空格鍵后多次移動gameObject
,則需要將移動代碼添加到游戲對象的Update()
方法本身中。
您需要將此腳本附加到_lazerprefab
游戲對象。
示例腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveObstacles : MonoBehaviour {
[SerializeField]
private float _lazerSpeed = 10f;
private void FixedUpdate() {
gameObject.transform.Translate(Vector3.up * _lazerSpeed * Time.deltaTime);
}
}
我們現在可以調用Instantiate()
Function 並且實例化GameObject
對象將在每一幀自動移動。
移動調用示例:
if (Input.GetKeyDown(KeyCode.Space)) {
Instantiate(_lazerPrefab, transform.position, Quaternion.identity);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.