【问题标题】:Make a GameObject indestructible使游戏对象坚不可摧
【发布时间】:2019-05-16 17:22:32
【问题描述】:

我正在使用 Unity 中的 Raycast 制作射击游戏。我有一个游戏对象,它是一个立方体(我的游戏的地面)。可以使用Destroy() 方法销毁该立方体。如何使它坚不可摧,即使在使用Destroy() 方法后也不会被破坏?

到目前为止,这是我的 FPS 枪脚本:

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

public class Gun : MonoBehaviour
{
    public float damage = 20f;
    public float range = 150f;
    //public GameObject ground;
    public Camera fpsCamera;
    void Start()
    {
        //DontDestroyOnLoad(ground);
    }
    void Update()
    {
        if (Input.GetButtonDown("Fire1")) {
            Shoot();
        }
    }
    void Shoot()
    {
        RaycastHit hitObject;
        if (Physics.Raycast(fpsCamera.transform.position, fpsCamera.transform.forward, out hitObject, range) && hitObject.transform.name != "Ground") {
            Destroy(hitObject.transform.gameObject);
        }
    }

【问题讨论】:

  • 这可以通过不使用Destroy()方法来完成
  • 您也可以使用 DontDestroyOnLoad 来标记在加载新场景时不要销毁的对象。 docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html
  • 我正在使用 Raycast 制作射击游戏,因此与 Raycast 碰撞的对象被销毁。
  • 可以添加破坏对象的部分代码吗?
  • 将脚本添加到问题中

标签: c# visual-studio unity3d


【解决方案1】:

听起来您想对哪些对象以某种方式被破坏进行排序。最简单的方法当然是一开始就不对该对象调用 Destroy 方法。

但是,由于您在 cmets 中说明您希望射击并摧毁一些物体,但不是全部。在你的情况下,我会制作一个脚本来检查标签、图层或在每个对象的脚本中调用方法。

例如,您尝试类似这样的操作:

ObjectProperties : MonoBehaviour{
    public boolean CanBeDestroyed = true;
}

将该脚本添加到您拍摄的对象中。

然后,当您的光线投射击中一个物体时,在拍摄的物体上使用GetComponent 尝试从该物体获取ObjectProperties。如果对象命中的ObjectProperties 不为空,并且ObjectPropertiesCanBeDestroyed 设置为真。然后你就可以销毁这个对象了。

【讨论】:

    【解决方案2】:

    实现这一点的最简单方法是使用标签。通过突出显示对象来创建标签。在检查器中打开标签选项卡。然后创建一个标签并将其分配给您的对象。您需要做的最后一件事是在代码中检查您点击的对象具有哪个标签。

    if (Physics.Raycast(fpsCamera.transform.position, fpsCamera.transform.forward, out hitObject, range) && hitObject.transform.name != "Ground") { switch (hitObject.tag) { case "immortal": //Nothing happens break; case "veryweak": //Objects with this tag get destroyed Destroy(hitObject.transform.gameObject); break; default: //Objects that do not have a tag and do not match any of the above get destroyed Destroy(hitObject.transform.gameObject); break; } }

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 2016-03-28
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多