簡體   English   中英

如何統一移動游戲預制件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM