如何消失和生成模型

问题描述 投票:0回答:1

我正在为我正在从事的项目制作一个小点击切片。 有意识地瞄准一些非常简单且容易做的事情。 我的目标本质上是一款第一人称 PoV 3D 游戏,您不需要离开现场,而是在房间之间移动并与 NPC 互动。

进入房间后,你应该找到NPC(非常简单)并点击他们。 导致 NPC 消失,然后在镜头前重生。

这就是我的问题。 我似乎找不到任何关于如何消失/生成模型的好的来源或说明(或想法)? 这个想法很简单:

Screenshot of basic pure programming stage of development 单击远处模型(蓝色圆柱体)。 蓝色圆柱体消失/变得不活动。 然后相机正前方的蓝色圆柱体就会产生/变得活跃。

然后玩家(应该)能够做同样的事情,但相反。 (也就是说,点击玩家面前的模型,模型消失,上一个模型返回)

老实说,我并没有真正取得任何进展。 我试图寻找产卵或消失等的来源,但我找到的几乎所有来源都专门从产卵障碍或重复多次或随机产卵的角度谈论它。 我似乎找不到任何可靠的东西可以让我去追求。 (也许只有我无法正确找到我要找的东西)

c# unity-game-engine 3d spawn
1个回答
0
投票

最流行的“消失和重生”方式可能是根本不消失。许多游戏给人一种“消失”的错觉,但实际上,他们只是将其移动或将其设置为不活动。这种方式可以在运行时节省内存,因为不需要创建/销毁任何东西。一个例子是:

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

public class DespawnRespawn : MonoBehaviour {
    public Transform object1;
    public Transform object2;

    void Update() {
        //if user presses left mouse button
        if(Input.GetMouseButtonDown(0)){
            //if player is looking at object1, despawn object1 and respawn object2
            if (Vector3.Dot(Camera.main.transform.forward, object1.position - Camera.main.transform.position) > 0) {
                object1.gameObject.SetActive(false);
                object2.gameObject.SetActive(true);
            }

            //if player is looking at object2, despawn object2 and respawn object1
            if (Vector3.Dot(Camera.main.transform.forward, object2.position - Camera.main.transform.position) > 0) {
                object2.gameObject.SetActive(false);
                object1.gameObject.SetActive(true);
            }
        }
    }
}

但是,如果你想在运行时真正实例化一个对象(创建一个新对象),你可以使用instantiate。您可以在此处了解有关实例化的更多信息:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html

这是第二种方式的示例:

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

public class DespawnRespawn : MonoBehaviour {
    public GameObject aliveObject;//the currently visible object
    public GameObject prefab; //asset you want to spawn in

    public Vector3 spawnPosition1;
    public Vector3 spawnPosition2;
    void Update() {
        //if user presses left mouse button
        if(Input.GetMouseButtonDown(0)){
            //if player is looking at aliveObject, destroy aliveObject and respawn new aliveObject at spawnPosition2
            if (Vector3.Dot(Camera.main.transform.forward, aliveObject.position - Camera.main.transform.position) > 0) {
                Destroy(aliveObject);
                aliveObject = Instantiate(prefab, spawnPosition2, Quaternion.identity);
            }

            //if player is looking at aliveObject, destroy aliveObject and respawn new aliveObject at spawnPosition1
            if (Vector3.Dot(Camera.main.transform.forward, aliveObject.position - Camera.main.transform.position) < 0) {
                Destroy(aliveObject);
                aliveObject = Instantiate(prefab, spawnPosition1, Quaternion.identity);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.