如何使用isKinematic选中使用Rigidbody移动的播放器?

时间:2017-06-06 23:16:44

标签: c# unity3d

我的游戏是一个自上而下的僵尸射击游戏,每当僵尸到达玩家时,他们就会聚集在他们下面,直到玩家可以走过僵尸。我注意到当我在Rigidbody上检查isKinematic时,僵尸不能将玩家推到他下面,所以他们只是碰到了他(这就是我想要的)。尽管如此,我无法移动。我该如何解决这个问题?

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

    public class PlayerMoving1 : MonoBehaviour {
    public float moveSpeed;
    private Rigidbody myRigidbody;
    private Vector3 moveInput;
    private Vector3 moveVelocity;
    private Camera mainCamera;
    public GunController theGun;
      void Start () {
         myRigidbody = GetComponent <Rigidbody>();
        mainCamera = FindObjectOfType<Camera>();
     }

// Update is called once per frame
void Update () {
    moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"));
    moveVelocity = moveInput * moveSpeed;
    Ray cameraRay = mainCamera.ScreenPointToRay(Input.mousePosition);
    Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
    float rayLength;
    if(groundPlane.Raycast(cameraRay,out rayLength))
    {
        Vector3 pointToLook = cameraRay.GetPoint(rayLength);
        transform.LookAt(new Vector3(pointToLook.x,transform.position.y,pointToLook.z));
    }
    if (Input.GetMouseButtonDown(0))
        theGun.isFiring = true;
    if (Input.GetMouseButtonUp(0))
        theGun.isFiring = false;
}
void FixedUpdate(){
    myRigidbody.velocity = moveVelocity;
}
}

3 个答案:

答案 0 :(得分:0)

使用isKinematic == true您无法通过刚体更改对象位置,您只能更改transform.position

我认为可能会更好,如果你将isKinematic设置为false并为敌人添加停止距离,那么他们就不能太靠近玩家。

答案 1 :(得分:0)

由于你的玩家不再受物理引擎的影响,你必须手动操纵对象的变换。你的脚本当前没有理想的设置,但如果我要将它破解成它并尝试使其工作,它将看起来像这样:

(如果您不再使用物理引擎,可以将它从fixedUpdate更改为更新)

void update(){
    float x = Input.GetAxisRaw("Horizontal")* Time.Deltatime;
    float z = Input.GetAxisRaw("Vertical") * Time.Deltatime;
    transform.position = new Vector3(transform.position.x+x,0,transform.position.z+z);

答案 2 :(得分:0)

另一种方法是锁定玩家的Y位置(假设Y是正“向上”方向)。当您想要移动玩家或物体时,isKinimatic是最好的。

我想说在这种情况下提高mass会更好,而且在这种情况下你也可以保持isKinematic未经检查。同时应用锁定Y移动(如果它是从平面“向上”的方向再次)

让我知道你的解决方案是什么,过去我遇到过一些问题以及发生这些类型的事件