2016-05-10 51 views
1

我正在尝试实现类似于失忆症的功能:黑暗血统让玩家按住鼠标按钮并在门上向前或向后拖动以打开它(如果您不熟悉,请在36:30查看Door Example)。在Unity3D中打开门前和后退类似于失忆症

我有下面的代码,它的排序工作,但开放是风声鹤唳,并来回反射了一下,我想不通,如果我使用transform.Rotate错误:

if (previousMousePosition == garbageVector) // if this is the first frame, create a reference for previousMousePosition 
     previousMousePosition = Input.mousePosition; 
    else 
    { 
     // else find the difference and rotate 
     rotationAmount = (Input.mousePosition.x - previousMousePosition.x); 
     if (rotationAmount < 0) 
      this.transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime); 
     else if (rotationAmount > 0) 
      this.transform.Rotate(Vector3.down * rotationSpeed * Time.deltaTime); 

    } 

注意:该脚本附在有问题的门上。

此外,我的代码并没有考虑玩家在确定旋转时所处的门的哪一侧。有没有人有任何提示,我可以从那里开始?

回答

2

您的问题中的代码太小,无法实现。任何可以通过更改transform.localEulerAngles轻松实现的方法。我在这个答案附加的代码可以做到这一点。 T测试剧本,按照下面的方向。这也描述了如何确定前门和后门。

。创建一个简单的立方体命名为它

。删除自动附加到新创建的立方体/门的Box Collider

。选择,右键点击并点击“创建空”。将这个新的GameObject重命名为FrontCollider。确保FrontCollider现在是门GameObject的孩子。

。选择FrontCollider,将BoxCollider添加到它。将碰撞器放在门前(摄像头前部)。

.Duplicate FrontCollider重命名新的游戏对象BackCollider。然后将BackCollider游戏对象移动到Door GameObject的后面。 确保它对齐的最好方法是如果FrontCollider的z位置为-2,则将z位置BackCollider设置为2.因此,您所做的只是将FrontColliderBackCollider中的z位置更改为相反彼此。

.Create一个空的游戏物体并将其命名为门父确保它不是任何游戏物体的孩子。我们需要使用这个GameObject来改变门的枢轴点到左边。这样门实际上会像门(一边)一样旋转,而不是围绕它自身的中心旋转。

。使用移动工具和移动门父游戏物体在门的左侧。不要旋转它。只要移动它。一旦你认为哪里的门父现在所在的地方的应该围绕旋转,附上Door Script下面的门父游戏物体不是游戏对象。

.Drag的FrontCollider游戏物体,以在脚本中frontDoorCollider槽。 将BackCollider游戏对象拖到脚本中的backDoorColliderin插槽。而已。

当门,clickholdmove站在门前按下鼠标,它会PULL开了门。移动它将关闭它。

当stading门,clickholdmove后面的鼠标时,它会PUSH开了门。移动它将关闭它。

enter image description here

public class Door : MonoBehaviour 
{ 
    public float ySensitivity = 300f; 
    public float frontOpenPosLimit = 45; 
    public float backOpenPosLimit = 45; 

    public GameObject frontDoorCollider; 
    public GameObject backDoorCollider; 

    bool moveDoor = false; 
    DoorCollision doorCollision = DoorCollision.NONE; 


    // Use this for initialization 
    void Start() 
    { 
     StartCoroutine(doorMover()); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (Input.GetMouseButtonDown(0)) 
     { 
      Debug.Log("Mouse down"); 

      RaycastHit hitInfo = new RaycastHit(); 
      if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo)) 
      { 
       if (hitInfo.collider.gameObject == frontDoorCollider) 
       { 
        moveDoor = true; 
        Debug.Log("Front door hit"); 
        doorCollision = DoorCollision.FRONT; 
       } 
       else if (hitInfo.collider.gameObject == backDoorCollider) 
       { 
        moveDoor = true; 
        Debug.Log("Back door hit"); 
        doorCollision = DoorCollision.BACK; 
       } 
       else 
       { 
        doorCollision = DoorCollision.NONE; 
       } 
      } 
     } 

     if (Input.GetMouseButtonUp(0)) 
     { 
      moveDoor = false; 
      Debug.Log("Mouse up"); 
     } 
    } 

    IEnumerator doorMover() 
    { 
     bool stoppedBefore = false; 
     float yRot = 0; 

     while (true) 
     { 
      if (moveDoor) 
      { 
       stoppedBefore = false; 
       Debug.Log("Moving Door"); 

       yRot += Input.GetAxis("Mouse Y") * ySensitivity * Time.deltaTime; 


       //Check if this is front door or back 
       if (doorCollision == DoorCollision.FRONT) 
       { 
        Debug.Log("Pull Down(PULL TOWARDS)"); 
        yRot = Mathf.Clamp(yRot, -frontOpenPosLimit, 0); 
        Debug.Log(yRot); 
        transform.localEulerAngles = new Vector3(0, -yRot, 0); 
       } 
       else if (doorCollision == DoorCollision.BACK) 
       { 
        Debug.Log("Pull Up(PUSH AWAY)"); 
        yRot = Mathf.Clamp(yRot, 0, backOpenPosLimit); 
        Debug.Log(yRot); 
        transform.localEulerAngles = new Vector3(0, yRot, 0); 
       } 
      } 
      else 
      { 
       if (!stoppedBefore) 
       { 
        stoppedBefore = true; 
        Debug.Log("Stopped Moving Door"); 
       } 
      } 

      yield return null; 
     } 

    } 


    enum DoorCollision 
    { 
     NONE, FRONT, BACK 
    } 
} 
相关问题