C# 为什么将刚体添加到门上时,在运行游戏时,门自动打开时启用运动学为真?

C# 为什么将刚体添加到门上时,在运行游戏时,门自动打开时启用运动学为真?,c#,unity3d,C#,Unity3d,这个想法是在一些门上添加一个刚体,使用是运动学的,所以当npc/敌人穿过这些门时,他们会打开/关闭 但当我运行游戏时,门会自动打开,不会触发任何动作。 也许我没有将刚体添加到门的正确位置正确的对象/子对象 门的屏幕截图是我仅有的几个门之一: 每个碰撞(1)到碰撞(11)都附加了一个长方体碰撞器。在每一个Is触发器上都未选中 水平门套件附带了一个盒子碰撞器,并且触发器已启用检查!还附带了一个脚本Hori Door Manager: using UnityEngine; using System.

这个想法是在一些门上添加一个刚体,使用是运动学的,所以当npc/敌人穿过这些门时,他们会打开/关闭

但当我运行游戏时,门会自动打开,不会触发任何动作。 也许我没有将刚体添加到门的正确位置正确的对象/子对象

门的屏幕截图是我仅有的几个门之一:

每个碰撞(1)到碰撞(11)都附加了一个长方体碰撞器。在每一个Is触发器上都未选中

水平门套件附带了一个盒子碰撞器,并且触发器已启用检查!还附带了一个脚本Hori Door Manager:

using UnityEngine;
using System.Collections;

public class HoriDoorManager : MonoBehaviour
{
    public DoorHori door1;
    public DoorHori door2;
    public static bool doorLockState;

    void OnTriggerEnter()
    {
        if (doorLockState == false)
        {
            if (door1 != null)
            {
                door1.OpenDoor();
            }

            if (door2 != null)
            {
                door2.OpenDoor();
            }
        }
    }
}
Wall\u Door\u Long\u 01已附加网格渲染器

Door_Left和Door_Right有一个网格渲染器、音频源、一个脚本和一个未选中触发器的框碰撞器

脚本将附着到门左侧和门右侧:

using UnityEngine;
using System.Collections;

public class DoorHori : MonoBehaviour {

    public float translateValue;
    public float easeTime;
    public OTween.EaseType ease;
    public float waitTime;

    private Vector3 StartlocalPos;
    private Vector3 endlocalPos;

    private void Start(){
        StartlocalPos = transform.localPosition;    
        gameObject.isStatic = false;
    }

    public void OpenDoor(){
        OTween.ValueTo( gameObject,ease,0.0f,-translateValue,easeTime,0.0f,"StartOpen","UpdateOpenDoor","EndOpen");
        GetComponent<AudioSource>().Play();
    }

    private void UpdateOpenDoor(float f){       
        Vector3 pos = transform.TransformDirection( new Vector3( 1,0,0));
        transform.localPosition = StartlocalPos + pos*f;

    }

    private void UpdateCloseDoor(float f){      
        Vector3 pos = transform.TransformDirection( new Vector3( -f,0,0)) ;

        transform.localPosition = endlocalPos-pos;

    }

    private void EndOpen(){
        endlocalPos = transform.localPosition ;
        StartCoroutine( WaitToClose());
    }

    private IEnumerator WaitToClose(){

        yield return new WaitForSeconds(waitTime);
        OTween.ValueTo( gameObject,ease,0.0f,translateValue,easeTime,0.0f,"StartClose","UpdateCloseDoor","EndClose");
        GetComponent<AudioSource>().Play();
    }
}
使用UnityEngine;
使用系统集合;
公共类DoorHori:单一行为{
公共价值;
公共时间;
公共OTween.ease类型ease;
公共浮动等待时间;
私人向量机3;
私有向量3 endlocalPos;
私有void Start(){
startOcalPos=transform.localPosition;
gameObject.isStatic=false;
}
公共空间开放门(){
OTween.ValueTo(gameObject,ease,0.0f,-translateValue,easeTime,0.0f,“StartOpen”,“UpdateEndoor”,“Endoin”);
GetComponent().Play();
}
私有void updateEndor(float f){
Vector3 pos=变换变换方向(新的Vector3(1,0,0));
transform.localPosition=startOcalPos+pos*f;
}
私有void UpdateCloseDoor(float f){
Vector3 pos=变换变换方向(新的Vector3(-f,0,0));
transform.localPosition=endlocalPos;
}
私家侦探(){
endlocalPos=transform.localPosition;
startcroutine(WaitToClose());
}
私有IEnumerator WaitToClose(){
返回新的WaitForSeconds(waitTime);
OTween.ValueTo(游戏对象,易用,0.0f,translateValue,易用时间,0.0f,“开始关闭”,“更新关闭门”,“结束关闭”);
GetComponent().Play();
}
}
当我添加刚体时,它被添加到父墙_门_长_01中,还添加了一个长方体碰撞器

然后当运行游戏时,门自动打开,没有任何触发,就像npc敌人角色一样

门工作正常,当我移动FPS控制器通过门时,它们可以正常打开和关闭。我的问题是,当游戏开始时,npc/角色通过门自动移动时,我找不到可以使角色与刚体一起正常行走的角色,因此我决定在门上添加刚体。但现在,当运行游戏时,门会自动打开

我使用此脚本来检查门是否使用公共静态doorLockState变量锁定或解锁:

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

public class DoorsLockManager : MonoBehaviour
{
    public bool locked;
    public bool lockStateRealTime = false;
    public Renderer rend;

    private Shader unlitcolor;
    private GameObject[] doorPlanes;

    private void Start()
    {
        doorPlanes = GameObject.FindGameObjectsWithTag("DoorPlane");
        ChangeColors(new Color32(255, 0, 0, 255), new Color32(0, 255, 0, 255));
    }

    private void ChangeMaterialSettings()
    {
        unlitcolor = Shader.Find("Unlit/Color");
        rend.material.shader = unlitcolor;
        rend.material.SetFloat("_Metallic", 1);
    }

    private void ChangeColors(Color32 lockedColor, Color32 unlockedColor)
    {
        for (int i = 0; i < doorPlanes.Length; i++)
        {
            rend = doorPlanes[i].GetComponent<Renderer>();
            ChangeMaterialSettings();
            if (locked)
            {
                HoriDoorManager.doorLockState = true;
                rend.material.color = lockedColor;
            }
            else
            {
                HoriDoorManager.doorLockState = false;
                rend.material.color = unlockedColor;
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (lockStateRealTime)
        {
            ChangeColors(new Color32(255, 0, 0, 255), new Color32(0, 255, 0, 255));
            lockStateRealTime = false;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类DoorsLockManager:MonoBehavior
{
公共厕所上锁;
public bool lockStateRealTime=false;
公开渲染;
私有颜色;
私人游戏对象[]门平面;
私有void Start()
{
门平面=GameObject.FindGameObjectsSwithTag(“门平面”);
更改颜色(新颜色32(255,0,0,255),新颜色32(0,255,0,255));
}
私有void changemaerialsettings()
{
unlitcolor=Shader.Find(“unlight/Color”);
rend.material.shader=取消颜色;
格式材料设置浮动(“金属”,1);
}
私有void ChangeColors(Color32锁定颜色、Color32解锁颜色)
{
对于(int i=0;i
我认为您的问题在于车门碰撞检测。门上的刚体本身应该没有效果

第一:您的
OnTriggerEnter
函数没有正确的工作模式,因为它缺少
Collider-collidername
参数

private void OnTriggerEnter(Collider other)
{
}
您可以随意调用collider(IntelliSense默认为
其他
),但您的方法必须有这样一个参数才能被Unity识别为
OnTriggerCenter
函数

第二:你永远不会检查触发碰撞器的对象是否就是你想要打开门的对象

试着用类似于
player
之类的标签来标记你的玩家和NPC

然后,检查碰撞对象是否附加了此标签,并且仅打开门

大概是这样的:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        //do stuff
    }
    if(other.CompareTag("NPC"))
    {
        //do other stuff
    }
}
或者,如果每个标记只有一个操作:

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player") || other.CompareTag("NPC"))
    {
        //do stuff
    }
}

请注意,要检测碰撞,一个或多个碰撞的对象需要附加一个刚体组件,所以你并没有完全错。

我在下面提供了一个答案,只是出于好奇:为什么
门锁状态是静态的?@tehmightypota它是静态的原因是我在其他脚本中使用它来检查门是否处于锁定状态或解锁,以及我以这种方式添加到门上的飞机门上的灯光是否发生了变化