1

我在尝试让“对象(字符)”在 Unity 中围绕立方体(所有面)走动时遇到问题。我附上了一张图片和视频,展示了我想要实现的目标。我试图以视觉方式向您展示,而不是试图解释。当角色从边缘下降时,它会旋转 90 度,然后像重力切换一样站起来。然后角色可以跳跃行走等。

这是其他人发布视频的示例,该视频准确显示了我试图实现的目标

我浏览了论坛,找不到即时消息。我试图附上一张图表,但该网站不会让我。任何建议将不胜感激!

问候

缺口

4

1 回答 1

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);
} 

旋转你的角色并改变他的法线取决于你以适应你的情况或游戏机制,无论你是通过光线投射来做到这一点,如果你站在表面上检测何时改变它,或者只希望在你击中时改变重力powerup 或类似的 - 实验,看看什么有效。如果您有问题,请发表更多评论!

编辑:

作为您链接的视频的补充。您可以在跳跃状态和每个轴方向上的光线投射上保留一个状态变量,以检查在刚刚滚落的情况下哪个面最近。

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
        }
    }
}

请记住,上面的内容完全是手写的,没有经过测试,但可以使用它,这个伪开始应该让你很好地了解该怎么做。

于 2013-10-07T09:31:52.687 回答