【问题标题】:player falling into the terrain when falling on it玩家摔倒在地形上
【发布时间】:2022-01-18 21:50:21
【问题描述】:

https://drive.google.com/file/d/1Uc2sys7ZFd686UkQlYAMEDZekFEHZcAr/view?usp=sharing

正如您在视频中看到的,当我尝试从山上跳下时,玩家只是穿过地形,就好像它不在那里一样,但我仍然可以正常移动,我注意到每当我在离地时快速移动时都会出现问题似乎当我第一次开始这个级别时,我非常缓慢地跳跃并返回地面,每当我跳跃并快速向地狱移动时就会出现问题,所以我增加了重力,这样我在跳跃时无法移动,但如果我移动了在空中快速玩家不会与地形发生碰撞,但是当我正常移动或在地面上快速移动时,没有人可以帮助我吗?

我在互联网上搜索,我没有找到与此相关的任何内容。


地形 1 属性:

https://drive.google.com/file/d/1VwelecESLjfD7UseP6lmQ0Kkg-3pwg67/view?usp=sharing

地形 2 属性:

https://drive.google.com/file/d/1ZH-cIBXlhBMPbmkgZXkQmjt-QVpe6MLu/view?usp=sharing

播放器属性: https://drive.google.com/file/d/1vTp3TSuIDcYm3orWhy5X3kw6wwBmwNcE/view?usp=sharing


这里是用于此的代码:

鼠标锁定:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mouselock : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Cursor.lockState = CursorLockMode.None;
        Cursor.visible = true;
    }
}

玩家移动:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class playermove2 : MonoBehaviour
{
    [Header("movement")] 
    private float movespeed = 10f;

    [SerializeField] float airmultiplier = 0.4f;
    [SerializeField] Transform oriantation;

    private float horizontalmovement;

    private float verticalmovement;

    private float rbdrag = 6f;

    private Vector3 movedirection;

    public float movementmultiplier = 10f;

    public bool isgrounded;

    private float playerhight = 1.8f;

    public float jumpforce = 8;

    public Rigidbody rb;
    
    public float grounddrag = 6f;

    public float aridrag = 2f;

    public int number;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (number == 11)
        {
            SceneManager.LoadScene("finish scene2");
        }
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            movespeed = 25;
        }

        if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            movespeed = 20;
        }
        if (Input.GetKeyDown(KeyCode.Space) && isgrounded)
        {
            jump();
        }
        print(isgrounded);
        myinput();
        controledrag();
    }

    private void myinput()
    {
        horizontalmovement = Input.GetAxisRaw("Horizontal");
        verticalmovement = Input.GetAxisRaw("Vertical");

        movedirection = oriantation.forward * verticalmovement + oriantation.right * horizontalmovement;
    }

    private void FixedUpdate()
    {
        moveplayer();
    }

    void moveplayer()
    {
        if (isgrounded)
        {
            rb.AddForce(movedirection.normalized * movespeed * movementmultiplier, ForceMode.Acceleration);
        }
        else
        {
            rb.AddForce(movedirection.normalized * movespeed * movementmultiplier * airmultiplier, ForceMode.Acceleration);
        }
    }

    void controledrag()
    {
        if (isgrounded)
        {
            rb.drag = grounddrag;

        }
        else
        {
            rb.drag = aridrag;
        }
    }

    void jump()
    {
        rb.AddForce(transform.up * jumpforce, ForceMode.Impulse);
    }
}

碰撞:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class collisions2 : MonoBehaviour
{
    public playermove2 player;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.layer == 6)
        {
            player.isgrounded = true;

        }
    }

    private void OnCollisionExit(Collision other)
    {
        if (other.gameObject.layer == 6)
        {
            player.isgrounded = false;
        }
    }
}

相机移动:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveCamera : MonoBehaviour
{
    [SerializeField] Transform cameraposition;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = cameraposition.position;
    }
}

玩家外观:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerlook : MonoBehaviour
{
   [SerializeField] private float sensX;
   [SerializeField] private float sensY;

   [SerializeField] Transform cam;
   [SerializeField] Transform oriantation;

   private float mouseX;
   private float mouseY;

   private float multiplier = 0.01f;

   private float xRotation;
   private float yRotation;

   private void Start()
   {
      Cursor.lockState = CursorLockMode.Locked;
      Cursor.visible = false;

   }

   private void Update()
   {
      mouseX = Input.GetAxisRaw("Mouse X");
      mouseY = Input.GetAxisRaw("Mouse Y");

      yRotation += mouseX * sensX * multiplier;
      xRotation -= mouseY * sensY * multiplier;

      xRotation = Mathf.Clamp(xRotation, -90f, 90f);
      cam.transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);
      oriantation.transform.rotation = Quaternion.Euler( 0, yRotation, 0);
   }
}



triggers:

using UnityEngine;
using UnityEngine.SceneManagement;

public class triggers2 : MonoBehaviour
{
    public playermove2 playerMove;
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.layer == 8)
        {
            Destroy(other.gameObject);
            playerMove.number++;
        }
    }
}

得分和高分:

using UnityEngine;
using UnityEngine.UI;

public class scoreandhighscore2 : MonoBehaviour
{
    public Text highscoretext;
    public Text scoretext;
    public playermove2 playermove;
    // Start is called before the first frame update
    void Start()
    {
        highscoretext.text = "high score: " + PlayerPrefs.GetInt("highscore");

    }

    // Update is called once per frame
    void Update()
    {
        scoretext.text = "score: " + playermove.number.ToString();

    }

    private void FixedUpdate()
    {
        if ( playermove.number > PlayerPrefs.GetInt("highscore"))
        {
            PlayerPrefs.SetInt("highscore", playermove.number);
        }
    }    
}

【问题讨论】:

  • 能分享一下玩家和地形属性吗?确保两者都连接了对撞机,而不是触发器
  • 我分享了地形和玩家的属性我在两个地形上都有一个地形对撞机,在玩家身上有一个胶囊对撞机,你可以看到我可以正常行走,但是当我快速进入时空气 问题发生在空中,所以当我跌倒时我会快速下落,因为我的重力设置为 55,所以会出现问题,如果我降低重力,我会在跳跃时快速移动,所以问题会在我跳又走。

标签: unity3d collision-detection terrain collider


【解决方案1】:

sooooo 我解决了这个问题,解决方案只是将碰撞检测转换为连续的,就像玩家不会突破地形一样我希望这对其他人有帮助

这是我所做的图片: https://drive.google.com/file/d/1ati8xQFQxwqAg8eJnmZzrs8D05HGuJLs/view?usp=sharing

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多