团结 - 绕着立方体走来走去

时间:2013-10-07 08:41:05

标签: unity3d unityscript

我有一个问题,试图让一个'对象(角色)'绕过Unity内的多维数据集(所有方面)。我附上了一张图片和视频,展示了我想要实现的目标。我试图在视觉上向你展示,而不是试图解释。当角色掉落在边缘上时,它会旋转90度,然后像重力一样站起来。然后角色可以跳步等。

This is an example of someone else that posted a video showing exactly what im trying to achieve

我已经浏览了论坛,无法找到我之后的内容。我试图附上图表,但该网站不会让我。任何建议将不胜感激!

此致

尼克

1 个答案:

答案 0 :(得分:0)

您可以考虑几个选项。

当角色从立方体的一个面退出到另一个面时,一个是触发重力变化。为实现此目的,您将在每个边缘和面上都有触发区域并使用[Bob went from Face A to Edge ANorth -> Switch Gravity to go in X direction]

这适用于重力开关也必须影响其他物体但对你的玩家有利的情况(例如,从侧面行走使敌人脱落并死亡)。

但是,如果您希望所有实体都坚持其相对侧面,那么我们需要自定义引力!要做到这一点比你想象的要容易,因为引力只是9.8的向下加速。因此,关闭引擎原始重力并创建“个人引力”组件:

private Vector3 surfaceNormal;
private Vector3 personalNormal;
private float personalGravity = 9.8f;
private float normalSwitchRange = 5.0f;

public void Start()
{    
    personalNormal = transform.up; // Start with "normal" normal
    rigidbody.freezeRotation = true; // turn off physics rotation    
}

public void FixedUpdate()
{
    // Apply force taking into account character normal as personal gravity:
    rigidbody.AddForce(-personalGravity * rigidbody.mass * personalNormal);
} 

旋转你的角色并改变他的正常状态取决于你的情况或游戏机制,无论你是通过光线投射做到这一点,如果你站在一个表面上来检测何时改变它或者只是想要重力改变时你达到了上升或类似 - 实验,看看有什么作用。如果您有任何疑问,请提供更多评论!

编辑:

作为您关联的视频的补充。您可以在跳转状态上保持状态变量,并在每个轴方向上进行光线投射,以检查在刚刚滚动的情况下哪个面最近。

public void Update()
{
    // we don't update personal normals in the case of jumping
    if(!jumping)
    {
        UpdatePersonalNormal();
    }

}

public void UpdatePersonalNormal()
{
    RaycastHit hit; //hit register
    // list of valid normals to check (all 6 axis)
    Ray[] rays = 
        {
        Vector3.up, Vector3.down, 
        Vector3.left, Vector3.right, 
        Vector3.forward, Vector3.backward
        };

    //for each valid normal...
    foreach(Ray rayDirection in rays)
    {
        //check if we are near a cube face...
        if(Physics.Raycast(rayDirection , hit, normalSwitchRange)
        {
             personalNormal = hit.Normal; //set personal normal ...
             return; // and return as we are done
        }
    }
}

请记住,上面的内容是完全手写的,未经过测试,但可以使用它,这个伪启动应该让你知道该怎么做。