c# - 留在移动平台上

标签 c# unity3d

我正在 Unity 中编写一个 2D 平台游戏,我试图让玩家停留在一个移动的平台上。我已经完成了一两天的搜索和修补,但我没有任何运气。

基本上,我被告知要尽量让角色在接触时与平台一起移动。 首先,如果我使用与 OnTriggerEnter() 相关的任何内容,播放器将直接通过平台。如果我执行 OnCollisionEnter()(使用播放器上的 CharacterController 和平台上的 BoxCollider),什么也不会发生。这是我发现最多的两件事。另一个是通过平台培养玩家,但这显然会导致“问题”(经常提到,从未解释过)。

那么,我怎样才能让玩家留在移动平台上呢?这是移动平台的代码:

public class MovingPlatform : MonoBehaviour
{
private float useSpeed;
public float directionSpeed = 9.0f;
float origY;
public float distance = 10.0f;

// Use this for initialization
void Start () 
{
    origY = transform.position.y;
    useSpeed = -directionSpeed;
}

// Update is called once per frame
void Update ()
{
    if(origY - transform.position.y > distance)
    {
        useSpeed = directionSpeed; //flip direction
    }
    else if(origY - transform.position.y < -distance)
    {
        useSpeed = -directionSpeed; //flip direction
    }
    transform.Translate(0,useSpeed*Time.deltaTime,0);
}

这里是玩家移动的代码(在更新中):

CharacterController controller = GetComponent<CharacterController>();
    float rotation = Input.GetAxis("Horizontal");
    if(controller.isGrounded)
    {
        moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0);
        moveDirection = transform.TransformDirection(moveDirection);

        //running code
        if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held
        { running = true; }
        else
        { running = false; }

        moveDirection *= running ? runningSpeed : walkingSpeed; //set speed

        //jump code
        if(Input.GetButtonDown("Jump"))
        {
            //moveDirection.y = jumpHeight;
            jump ();
        }
    }
    moveDirection.y -= gravity * Time.deltaTime;
    controller.Move(moveDirection * Time.deltaTime);

编辑:我认为这可能与我定义播放器和平台的方式有关,但我尝试了不同的组合。如果平台是触发器(在其对撞机上),则玩家会始终如一地经历它。否则,我无法使用 OnTrigger 函数。我有一个刚体连接到播放器和平台,但它似乎没有影响任何东西。当玩家确实在某些设置中登上平台时,他会紧张不安,而且往往最终会掉下去。

最佳答案

你需要的似乎是平台上的第二个对撞机。主对撞机具有 isTrigger = false 以确保您的角色 Controller 正常工作。第二个以 isTrigger = true 运行,它的唯一功能是检测玩家是否在调用 OnTriggerEnter 时是否依附于平台并在 上离开平台>OnTriggerExit.

因为您不能有 2 个相同类型的碰撞器(我想您需要盒子碰撞器),所以在您的平台游戏对象下构建一个空子对象并将盒子碰撞器分配给它。我通常会使用一种名为 ActionMaterial 的特殊物理 Material 来清洁我的东西。如果您正在使用图层并调整了碰撞矩阵,请确保您的碰撞由 physX 处理。

关于c# - 留在移动平台上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15643961/

相关文章:

c# - 使用更新面板时,保存按钮不起作用

android - Google Resonance + Unity 2017.3.1f1 + GearVR(Galaxy 8)

C# - 如何将 ctrl+A 输入变成笑脸?

c# - 尝试更新 Entity Framework 中的实体时出现多个 ObjectStateManager 错误

c# - 将 EventHandler 与 NavigationService 结合使用

c# - 统一构建错误 : The name 'EditorUtility' does not exist in the current context

c# - Unity - 等待 HTTP 请求解析

unity3d - 我在统一的项目搜索栏中的 mrtk(混合现实工具包)中没有看到语音输入源脚本

c# - 获取另一个类的所有属性名称 - Unity 5 C#

c# - 使用 ProcessStartInfo 从 asp.net 中的 IIS 执行 C++ .exe