Unity3D按下F开门

 文章目录


前言

试着想象一下,当你在unity3D导入精美的建筑模型并完成移动代码后,迫不及待地准备进入游戏准备看看建筑的内部效果,结果撞在了门上。

一、解决方案

那我们应该如何在Unity3D中解决开关门呢?

答:直接把全地图的门都给卸了!

漏 漏 漏,这种方法过于简单粗暴了,而且会极度影响玩家的游戏体验,比如你在做一个恐怖游戏,想要在门后面整一个鬼脸,开门时直接贴脸吓人,如果把门拆了,玩家大老远就会看到鬼脸,那还有啥意思?

那我们该怎么办呢?话不多说直接开搞!

首先我们要了解unity中使用C#的转向方法,代码如下:

transform.Rotate(X,Y,Z);

让门沿着某个轴旋转90°,比如我的门沿Z轴转就能打开,所以我的代码是:

transform.Rotate(0f,0f,90);

 另外两个轴不用动,直接写“0f”就可以了!

接下来关门,就是倒着转90°,也就是转-90°:

transform.Rotate(0f,0f,-90);

搞好了转向还不行,接下来我们还需要搞出各种判断,毕竟我们做的不是自动门而是手动的。

二、开发步骤

1.Door

接下来料比较多,直接拼一起,方便大家Ctrl c再Ctrl v:

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

public class Door : MonoBehaviour
{
    Transform tf;
    private bool isOpen = false;

    void Start()
    {
        tf = gameObject.GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
    }

    public void OpenDoorMethod()
    {
        tf.Rotate(0f,0f,90);
        Debug.Log("open");
        isOpen = !isOpen;

    }
    public void CloseDoorMethod()
    {
        tf.Rotate(0f,0f,-90);
        Debug.Log("close");
        isOpen = !isOpen;
    }

    public bool GetIsOpen()
    {
        return isOpen;
    }
    public void SetIsOpen(bool b)
    {
        isOpen = b;
    }
}

 以上是给门的代码,其中“tf = gameObject.GetComponent<Transform>()”就是用tf代替Transform,来帮助各位偷懒。Debug.Log就是在控制台输出。

2.Trigger

各位不要急,门的代码好了,但是我们要弄个触发器,只有在范围内按下F才有用,直接在门的地下建一个空对象。命名为doorTrigger。

 然后为doorTrigger写入下面的代码:

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

public class Trigger : MonoBehaviour
{
    private Door m_Door;
    private bool enterCollide = false;
    // Start is called before the first frame update
    void Start()
    {
        m_Door = GameObject.Find("Door").GetComponent<Door>();
    }


    void OnTriggerEnter(Collider collider)
    {
        Debug.Log("enter");
        enterCollide = true;
    }

    void OnTriggerExit(Collider collider)
    {
        Debug.Log("exit");
        enterCollide = false;
    }
    // Update is called once per frame
    void Update()
    {
        if (enterCollide)
        {
            if (Input.GetKeyDown(KeyCode.F))
            {
                if (m_Door.GetIsOpen())
                {
                    m_Door.CloseDoorMethod();

                }
                else
                {
                    m_Door.OpenDoorMethod();
                }
            }
        }

    }
}

 把“m_Door = GameObject.Find("Door").GetComponent<Door>()”中括号里的Door改成自己的门的名字就可以了!!

(新加的:)忘记说了,还需要添加Box Collider组件

然后勾选“是触发器”。 


总结

终于学废了,还不快点赞收藏加关注!!

### 实现触发器开门功能 为了实现在Unity3D中通过触发器来控制门的开关操作,可以按照如下方式构建逻辑: #### 创建场景与设置对象属性 确保场景中的地面和墙体由`Cube`组成,并移除这些物体上的盒子碰撞器以减少不必要的物理交互影响[^3]。 #### 编写并附加脚本至相应游戏对象上 针对门控机制需准备两个主要部分:一是处理门本身动作的方法;二是定义当玩家进入或离开特定区域时应执行的动作。具体做法是在门的游戏对象以及可能作为触发源的角色或其他实体上分别挂载相应的C#脚本文件。 对于门的行为管理,可参照以下简化版示例代码片段展示如何完成基本开闭效果: ```csharp using UnityEngine; public class DoorControl : MonoBehaviour { public float speed = 1.5f; private bool isOpening = false; private bool isClosing = false; // 开门动画函数 private void OpenDoorAni(){ if (!isOpening && transform.localPosition.x <= 1.8f){ isOpening = true; while (transform.localPosition.x < 1.8f){ transform.Translate(Vector3.right * Time.deltaTime * speed); yield return null; // 这里应该使用协程而非直接循环, 此处仅为示意 } isOpening = false; } } // 关门动画函数 private IEnumerator CloseDoorAni(){ if(!isClosing && transform.localPosition.x >= 0){ isClosing = true; while(transform.localPosition.x > 0){ transform.Translate(-Vector3.right * Time.deltaTime * speed); yield return null; } isClosing = false; } yield break; } } ``` 请注意上述代码中的注释提到应当采用协程(`IEnumerator`)形式实现平滑过渡而不是简单的while循环,因为后者会阻塞主线程造成帧率下降等问题。实际应用时建议调整为正确的方式。 接着,在另一个负责检测事件发生的脚本内(通常放置于具有Collider组件且其Is Trigger选项已勾选的对象之上),可以通过类似下面这样的结构去调用前面定义好的方法来进行互动响应: ```csharp using UnityEngine; public class TriggerHandler : MonoBehaviour { private DoorControl doorCtrl; void Start () { doorCtrl = GameObject.Find("YourDoorObjectName").GetComponent<DoorControl>(); } void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "Player"){ // 使用标签代替名称匹配更灵活可靠 Debug.Log("Player Entered"); StartCoroutine(doorCtrl.OpenDoorAni()); } } void OnTriggerExit(Collider other) { if(other.gameObject.tag == "Player"){ Debug.Log("Player Exited"); StartCoroutine(doorCtrl.CloseDoorAni()); } } } ``` 此段代码展示了怎样利用`OnTriggerEnter()` 和 `OnTriggerExit()` 方法监听进出事件,并据此启动对应的门状态变化过程。同时推荐使用Tag标记目标对象以便更加高效准确地识别不同类型的碰撞体[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值