小编Hel*_*ium的帖子

什么会导致NavMesh代理计算无效路径?

问题描述

我与我的导航网格代理挣扎的同时有计算路径无效obvisously没有理由.当问题已经以初始有效路径移动时,问题会不时发生.

特工无法找到自己的方式

在上图中,目的地是左上角的圆锥体.(不要介意NavMeshAgent的方向箭头,我试图用手移动代理,以试图"解锁"他)

  • 实例化时,我要求我的代理计算它们到NavMesh上给定目标点的路径(我使用NavMesh.SamplePosition确保目标点在NavMesh上).一切正常.经纪人找到了自己的方式并开始向目标迈进
  • 但是,在旅途中,突然之间,他失去了自己,而NavMesh自第一步以来没有改变.我没有问他什么,没有新的计算方法.

测试解决方案

  1. 检查目的地是否在NavMesh上

    public Vector3 GetCharacterPositionOnNavMesh( Vector3 position )
    {
        NavMeshHit hit;
        bool positionFound = NavMesh.SamplePosition( position, out hit, 500, NavMesh.AllAreas );
    
        if ( !positionFound )
            Debug.LogWarning( "No valid position found !" );
    
        return positionFound ? hit.position : position;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查我的代理的区域掩码,以确保他们可以找到目的地的路径,尽管NavMesh的各个区域

  3. 如果代理的路径无效,则几乎检查每个帧.如果是,请使用CalculatePath或计算新的SetDestination.有时,它有效,有时不行.

    protected virtual void Update()
    {
        if ( !Running || !agent.enabled || !agent.isOnNavMesh )
            return; …
    Run Code Online (Sandbox Code Playgroud)

artificial-intelligence unity-game-engine navmesh

17
推荐指数
1
解决办法
2620
查看次数

释放ThreeJS应用程序的内存

我目前在使用ThreeJS应用程序时释放内存时遇到问题.

我知道有关于这个问题的几个问题:

用我做了以下打字稿函数处理我的对象:

function dispose( object3D: THREE.Object3D ): void
{
    // Dispose children first
    for ( let childIndex = 0; childIndex < object3D.children.length; ++childIndex )
    {
        this.dispose( object3D.children[childIndex] );
    }

    object3D.children = [];

    if ( object3D instanceof THREE.Mesh )
    {
        // Geometry
        object3D.geometry.dispose();

        // Material(s)
        if ( object3D.material instanceof THREE.MultiMaterial )
        {
            for ( let matIndex = 0; matIndex < object3D.material.materials.length; ++matIndex )
            {
                object3D.material.materials[matIndex].dispose();
                object3D.material.materials[matIndex] = null;
            }
            object3D.material.materials = []; …
Run Code Online (Sandbox Code Playgroud)

javascript memory three.js

9
推荐指数
1
解决办法
744
查看次数

禁用游戏对象时检测 OnTriggerExit

我面临着一个关于触发器的非常简单的问题,但我看不到任何解决方法。我只想在触发器内的OnTriggerExit对象被禁用时调用该函数。

这是在空场景中重现问题的方法:

  1. 在 (0,0,0) 处创建一个立方体,使用碰撞器作为触发器和非常简单的以下脚本:

    public class OnTriggerExitTest : MonoBehaviour
    {
        private void OnTriggerExit( Collider other )
        {
            Debug.Log( "Exiting : " + other.name );
        }
        private void OnTriggerEnter( Collider other )
        {
            Debug.Log( "Entering : " + other.name );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用球体碰撞器和不使用重力的刚体在 (0,0,0) 处创建球体

  3. 将球体移出盒子,OnTriggerExit被调用

  4. 将球体移回 (0,0,0),OnTriggerEnter被调用

  5. 禁用球,OnTriggerExit不是

  6. 启用回球体,OnTriggerEnter 称为

触发退出测试

显然,OnTriggerExit当我禁用球体时,我想被调用。你知道任何解决方案吗?

我正在使用 Unity 5.4.1f

我当然可以在OnDisable我的领域的功能中使用事件,但它不是很干净。我只是不明白为什么OnTriggerExit不是被调用而是OnTriggerEnter被调用。

unity-game-engine game-physics

5
推荐指数
1
解决办法
3572
查看次数

创建本机插件以实现官方Unity Facebook SDK的缺失功能

我想给我的游戏玩家提供可能性,发布他们的Facebook Feed图片和存储在他们设备上的视频.

Facebook SDK似乎没有提供此功能FB.FeedShare.只能在该mediaSource字段中引用已托管的媒体.

几个问题已经被问这个问题(1,2,3)

但是,Android SDKiOS SDK 确实提供了它.Facebook SDK不是包装原生SDK的简单"抽象层"吗?为什么还没有实现所有原生SDK功能?


知道另一种解决方案是使用Graph API上传媒体并从FB.FeedShare函数中引用.

编辑:正如@misorude所提到的,publish_actions权限已被删除


TL; DR

是否有可能创建调用用于共享存储在用户设备上的媒体的本机功能的Android和iOS插件?

如果是这样,你知道怎么可能"引用"本机Facebook SDK而不将它们捆绑到我将创建的插件中?(因为他们已经在我的项目中的Unity Facebook SDK中).

编辑:似乎有人已经尝试创建一个包装器,但"它没有发挥好"

我也对其他建议持开放态度.我的最终目标是让用户发布视频.我很想用意图打开Facebook应用程序,但iOS没有这样的功能.


提前致谢.

facebook unity-game-engine

5
推荐指数
0
解决办法
103
查看次数

使用遮罩隐藏对象的一部分 (EffectComposer)

问题描述

我目前正在发现EffectComposerThree.js 并且正在寻找使用掩码隐藏另一个对象的一部分的方法。

假设您有一个简单的场景:相机和圆柱体之间的立方体。立方体将起到遮罩的作用并将圆柱体隐藏在其后面:

立方体将圆柱体隐藏在其后面

已测试的解决方案

我已经使用了以下 ThreeJS 示例,并尝试调整它们以获得我想要的结果,但没有成功:

我猜问题出在通行证的使用上。

我尝试了两种解决方案(检查下面的代码片段以了解添加的通行证的类型):

1-添加 maskPass,然后添加 renderPass,以便场景的渲染仅在蒙版内绘制

  composer = new THREE.EffectComposer(renderer, renderTarget);
  composer.addPass(maskPass1);
  composer.addPass(renderPass);
  composer.addPass(clearMaskPass);
  composer.addPass(outputPass);
Run Code Online (Sandbox Code Playgroud)

2-添加 renderPass,然后添加反转蒙版,然后添加clearPass 以删除像素

  maskPass1.inverse = true;
  composer = new THREE.EffectComposer(renderer, renderTarget);
  composer.addPass(renderPass);
  composer.addPass(maskPass1);
  composer.addPass(clearPass);
  composer.addPass(clearMaskPass);
  composer.addPass(outputPass);
Run Code Online (Sandbox Code Playgroud)

下面,您将找到一个代码片段,显示我到目前为止所做的事情。我用了DotScreenPass只是为了看看maskPass的效果。

在下图中,您将看到我使用左侧代码片段得到的结果以及我想要的结果在右侧

面具

代码片段

  composer = new THREE.EffectComposer(renderer, renderTarget);
  composer.addPass(maskPass1);
  composer.addPass(renderPass);
  composer.addPass(clearMaskPass);
  composer.addPass(outputPass);
Run Code Online (Sandbox Code Playgroud)
  maskPass1.inverse = true;
  composer = new THREE.EffectComposer(renderer, renderTarget);
  composer.addPass(renderPass);
  composer.addPass(maskPass1);
  composer.addPass(clearPass);
  composer.addPass(clearMaskPass);
  composer.addPass(outputPass);
Run Code Online (Sandbox Code Playgroud)
var composer, renderer;
var box, torus;

init();
animate(); …
Run Code Online (Sandbox Code Playgroud)

mask three.js

3
推荐指数
1
解决办法
6092
查看次数

在if语句中更容易使用'或'运算符(C#)

我正在制作一个统一的游戏,我有这个'如果声明',每5个波浪我的商店菜单将变得可见.代码确实有效,但我确信我做错了什么或者可以做些更好的事情!

if (waveCount == 5 || waveCount == 10 || waveCount == 15 || waveCount == 20 || waveCount == 25 || waveCount == 30 || waveCount == 35 || waveCount == 40 || waveCount == 45 || waveCount == 50)
{
    // yield return new WaitForSeconds(shopWait);
    shopPanel.SetActive(true);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到'if语句'不那么好,通常它会一直持续到waveCount == 100但我把它剪掉了.必须有一个更简单或更简洁的方法来做到这一点:/但我只是无法绕过它:(

编辑1:

谢谢,我对modulo知之甚少,知道我知道我要阅读的内容:)

c# if-statement or-operator

1
推荐指数
1
解决办法
172
查看次数

Unity3D:如何检测按钮何时被按下和释放

我有一个用户界面按钮。我想在用户按下按钮时显示文本,并在用户释放按钮时隐藏文本。

我怎样才能做到这一点?

user-interface button unity-game-engine

1
推荐指数
1
解决办法
2万
查看次数

将字符串拆分为数组c#

我在C#中有一个字符串.它在开始时是空白的,但最终会变成类似的东西

public string info12 = "0, 50, 120, 10";
Run Code Online (Sandbox Code Playgroud)

你们其中一个人可能在想,是吗?是不是整数数组?那么它需要暂时保持一个字符串,它必须是一个字符串.

如何将此字符串转换为字符串数组(变量info13),以便最终将其引用到更多变量中.

info 14 = info13[0];
info 15 = info13[1];
Run Code Online (Sandbox Code Playgroud)

请注意:这不是一个重复的问题.如果你读完整件事,我清楚地说我有一个字符串数组而不是整数.

c# arrays string

0
推荐指数
1
解决办法
2万
查看次数