您的问题中的代码太小,无法实现。任何可以通过更改transform.localEulerAngles
轻松实现的方法。我在这个答案附加的代码可以做到这一点。 T测试剧本,按照下面的方向。这也描述了如何确定前门和后门。
。创建一个简单的立方体命名为它门。
。删除自动附加到新创建的立方体/门的Box Collider
。
。选择门,右键点击并点击“创建空”。将这个新的GameObject重命名为FrontCollider
。确保FrontCollider
现在是门GameObject的孩子。
。选择FrontCollider
,将BoxCollider添加到它。将碰撞器放在门前(摄像头前部)。
.Duplicate FrontCollider
和重命名新的游戏对象BackCollider
。然后将BackCollider
游戏对象移动到Door GameObject的后面。 确保它对齐的最好方法是如果FrontCollider
的z位置为-2,则将z位置BackCollider
设置为2.因此,您所做的只是将FrontCollider
和BackCollider
中的z位置更改为相反彼此。
.Create一个空的游戏物体并将其命名为门父确保它不是任何游戏物体的孩子。我们需要使用这个GameObject来改变门的枢轴点到左边。这样门实际上会像门(一边)一样旋转,而不是围绕它自身的中心旋转。
。使用移动工具和移动门父游戏物体在门的左侧。不要旋转它。只要移动它。一旦你认为哪里的门父现在所在的地方的门应该围绕旋转,附上Door Script
下面的门父游戏物体不是门游戏对象。
.Drag的FrontCollider
游戏物体,以在脚本中frontDoorCollider槽。 将BackCollider
游戏对象拖到脚本中的backDoorColliderin插槽。而已。
当门,click
,hold
和move
站在门前按下鼠标,它会PULL开了门。移动它将关闭它。
当stading门,click
,hold
和move
后面的鼠标时,它会PUSH开了门。移动它将关闭它。
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
}
}