繁体   English   中英

Unity 2D Platformer-使我的敌人看不到墙

Unity 2D Platformer - making my enemy not see through walls

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

基本上,我在寻找一个主意。 如何使我的敌人巡逻,但当它到达玩家时-会冲刺并造成伤害,但同时当它到达墙壁且玩家站在墙壁后面时,请勿攻击。 你知道-我不想让他们穿过墙壁。

我已经做了一个简单的Game Object(矩形)来指出它的视线,它可以正常工作,但是我想对其进行一些改进。

为了使它更加怪异……我只想让敌人攻击我,却不让我穿过墙壁

一些代码:

[DamageFromEnemy.cs]

private void FixedUpdate()
{
    isThatPlayer = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, PlayerLayer);

    isThatWall = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, gameObject.GetComponent<EnemyScript>().WallLayer);

    if (isThatWall == true && gameObject.GetComponent<EnemyScript>().movingRight == true)
    {
        PlayerDetector.transform.Translate(new Vector3(changePosX, 0, 0));

        //playerDetectX -= PlayerDetector.transform.position.x; // Lowering size. Not Working

        changePosX = (playerDetectX / 2) * (1 / enemyScaleX) + (enemyScaleX / 2) * (1 / enemyScaleX);

        Debug.Log("pozycja x: " + changePosX);
    }

    if (isThatWall == true && gameObject.GetComponent<EnemyScript>().movingRight == false)
    {
        PlayerDetector.transform.Translate(new Vector3(- changePosX, 0, 0));

        //playerDetectX -= PlayerDetector.transform.position.x; // Lowering size. Not Working

        changePosX = (playerDetectX / 2) * (1 / enemyScaleX) + (enemyScaleX / 2) * (1 / enemyScaleX);

        Debug.Log("pozycja x: " + changePosX);
    }

    DetectPlayer();

    AttackTimer();
}
void OnDrawGizmosSelected()
{
    Gizmos.color = Color.blue;
    Gizmos.DrawWireCube(PlayerDetector.position, new Vector3(playerDetectX, playerDetectY));
}

[EnemyScript.cs]

void Update ()
{
    trap = Physics2D.OverlapCircle(ColideDetector.position, detectorRadius, TrapLayer);
    otherEnemy = Physics2D.OverlapCircle(ColideDetector.position, detectorRadius, EnemyLayer);

    if (health <= 0)
    {
        Destroy(gameObject);
    }

    transform.Translate(Vector2.right * speed * Time.deltaTime );

    RaycastHit2D groundInfo = Physics2D.Raycast(groundDetection.position, Vector2.down, distance);

    RaycastHit2D wallInfoR = Physics2D.Raycast(wallDetection.position, Vector2.right, distance, WallLayer);

    RaycastHit2D wallInfoL = Physics2D.Raycast(wallDetection.position, Vector2.left, -distance, WallLayer);


    if (groundInfo.collider == false || trap == true || otherEnemy == true || wallInfoR == true || wallInfoL == true)
    {
        if(movingRight == true)
        {
            transform.eulerAngles = new Vector3(0, -180, 0);
            movingRight = false; 
        }
        else
        {
            transform.eulerAngles = new Vector3(0, 0, 0);
            movingRight = true;
        }
    }
}

一些Gif反馈

在最后的gif帧中,您可以看到它有时会出错。

    public PlayerControls player;
public LayerMask WallLayer;

player = FindObjectOfType<PlayerControls>();
        RaycastHit2D checkWallsToHero = Physics2D.Raycast(wallToHeroRay.position, player.transform.position, 150,WallLayer);

    if (checkWallsToHero == true)
    {
        playerCheck = false;
    }

    void OnDrawGizmosSelected()
{
    Gizmos.color = Color.blue;
    Gizmos.DrawWireCube(PlayerDetector.position, new Vector3(playerDetectX, playerDetectY));
    Gizmos.DrawLine(wallToHeroRay.position, player.transform.position);
}

[新代码示例-可能是错误的]:

isThatPlayer = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, PlayerLayer);

    isThatWall = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, gameObject.GetComponent<EnemyScript>().WallLayer);


    RaycastHit2D checkWallsToHero = Physics2D.Raycast(wallToHeroRay.position, player.transform.position, 0, gameObject.GetComponent<EnemyScript>().WallLayer);

    if (checkWallsToHero.collider != true /*&& isThatPlayer == true*/)
    {
        Debug.Log("Pierwszy state");
        Debug.Log(checkWallsToHero.collider);

        //Debug.Log(isThatPlayer);
        //Debug.Log("Hit: " + checkWallsToHero.collider.gameObject.name);

        playerCheck = false;
        enemyAttackReady = false;
        coolDownTimer = 0;

        enemyAttackCD = 0;
    }
    else if (checkWallsToHero.collider == true && isThatPlayer == true)
    {
        Debug.Log(checkWallsToHero.collider);
        Debug.Log("Drugi state");
        ReadyToAttack(); //charging enemy
        DetectPlayer(); //bool to true when OverlapBox hits player

        AttackTimer(); //cd between enemy attacks
    }
1 个回复
if (Physics2D.Raycast2D
(wallToHeroRay.position,player.transform.position,out hit,10)
 &&hit.transform.gameObject.tag == "Player") 
     {                       
         RayHit = true;  
     }
else {             
         RayHit = false;
     }

要使用此功能,您必须将您的播放器标记为“玩家”,然后,如果它的光线击中了播放器本身而不是墙,则它只会给您命中

编辑:这是我按照评论中@ Draco18s的想法整理的代码,如果对您有用,请告诉他谢谢您。 我只是认为这很有意义,他应该把它当作答案

1 为什么从后面看不到我的墙?

我目前正在研究一个Java项目,该项目涉及创建3D迷宫游戏,但是墙壁有问题。 确实,当我们围墙行走时,它消失了; 就像从后面看不到墙。 这是我的代码(主要来自YouTube用户“ thecherno ”): 我认为问题来自于此: 为什么代码中包含导致墙壁消失的线条,以及 ...

2015-04-12 22:19:49 2 60   java/ 3d
2 Unity3D看不到哈萨克语字母

我是Unity3D的新开发人员。 当我写像ҚӨӘІҢUnity的哈萨克语字母时????? 我需要做什么? 如果我从json获取数据,它将正确显示。 ...

2019-05-28 09:13:29 1 39   unity3d
4 Teamcity的unity3d-plugin似乎看不到Unity文件夹

问候大家! 我正在尝试开始使用Teamcity Unity3d-runner-plugin。 在服务器上成功安装并在项目中设置构建步骤后,将无法构建项目。 项目无法开始处理警告消息: 警告:没有为此构建配置启用兼容的代理。 请注册一个构建代理或调整构建配置要求。 在“代 ...

5 使看不到变化?

方案1: 我签出了一个项目,并对源文件进行了一些更改,然后进行了更改,然后make看到了更改。 方案2: 我再次将项目检出到其他目录(由于某些原因),在此处复制了修改后的源文件,并进行了make操作,但没有任何反应,如果运行程序,我看不到更改,make看不到我所做的操作更改为此 ...

2010-10-22 08:37:57 4 1067   makefile
6 启动游戏后看不到敌人的精灵

我正在学习 python,现在我在 pygame 中。 有一些我从教程开始写的教程游戏,但是在自动启动它之后,敌人的弹簧从右向左移动。 我整天都在寻找一个错误,我的代码是否有任何更改,但看不到任何更改,但是在我启动我的应用程序后(使用 Replit 可能很重要),只有玩家精灵,但没有敌人。 我做错了 ...

7 所有人都看不到Facebook墙

您好,我正在使用以下代码将墙发布到我的Facebook,它将墙添加到我的Facebook,但是 我的朋友看不到。 我怎样才能做到这一点 ...

8 Unity看不到所附的动画

如标题中所述,统一看不到通过代码附加到它的动画,这反过来又是我放入检查器中的动画 我的播放器具有一个选中了BoxCollider2D的IsTrigger ,以便它可以获取值并运行 我已经检查了动画的存在(已经在代码中),但是他说他看不到动画 ...

9 Unity-我在屏幕上看不到鼠标

我在Unity中制作了一个简单的3D游戏,大部分情况下一切正常,但是当我的玩家死亡时,在死亡屏幕上看不到鼠标。 我还有另外两个场景,在我看来它们具有完全相同的设置,但是可以看到这些场景上的鼠标。 ...

2017-04-25 06:04:07 1 296   unity3d
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM