我正在制作一只AI蜘蛛,它会在太靠近墙壁时停止。但是,使用下面的代码只能在面对迷宫的北墙(全局前进)时成功执行Idle()。
我正在使用Unity3D 4.6。
这是我的代码:
using UnityEngine;
using System.Collections;
public class Spider : MonoBehaviour {
public float movementSpeed, rotationSpeed;
//Called by game manager after instantiation
public void SetLocation (MazeCell cell) {
transform.localPosition =
new Vector3(
cell.transform.localPosition.x,
5f,
cell.transform.localPosition.z
);
float startingRotation = Mathf.RoundToInt(Random.Range(-0.5f,3.49999f));
transform.rotation = Quaternion.Euler(0,startingRotation * 90,0);
}
void Update() {
if (Physics.Raycast(transform.position, Vector3.down, 0.5f)) {
if (!Physics.Raycast(transform.position, transform.forward, 2)) {
Walk();
} else {
Idle ();
}
}
}
private void Idle() {
animation.Play("idle");
}
private void Walk() {
transform.Translate(transform.forward * movementSpeed * Time.deltaTime);
animation.Play("walk");
}
}
编辑:
Debug.Log()
来电
新规范
答案 0 :(得分:1)
看起来Spider的前锋是否面向正确的方向?如果蜘蛛太靠近墙壁,那么它应该是空闲的!物理.Raycast将是假的。也许您需要调试这些并确认它们按预期出现。
我在这里做了一些假设,但看起来Spider对象的实例化为y为5.0f,然后在Update调用中,你正在向下方向进行RayCast。如果半个单位的向下方没有碰撞器,那么什么都不会发生。当然,如果有重力和碰撞的地板,这可能会很好。
答案 1 :(得分:0)
我已回答了我自己的问题(但我必须赞扬@ matther-spencer帮助我看到这些可能性并可靠地帮助我)。事实上,问题是一系列问题。
最重要的问题是光线投影的起源很低。这包括地板作为停止的墙壁,因此使蜘蛛无法行走。这也阻止了Raycast
向下工作。
但是,最终需要transform.forward
和Vector3.forward
的组合才能获得所需的功能。这是最终的代码:
using UnityEngine;
using System.Collections;
public class Spider : MonoBehaviour {
public float movementSpeed, rotationSpeed;
public void SetLocation (MazeCell cell) {
transform.localPosition =
new Vector3(
cell.transform.localPosition.x,
5f,
cell.transform.localPosition.z
);
float startingRotation = Mathf.RoundToInt(Random.Range(-0.5f,3.49999f));
transform.rotation = Quaternion.Euler(0,startingRotation * 90,0);
}
void Update() {
Debug.Log ("updating");
if (Physics.Raycast(
new Vector3(transform.position.x, transform.position.y + 0.25f, transform.position.z),
Vector3.down,
0.5f)) {
Debug.Log("downraycheck passed");
if (!Physics.Raycast(
new Vector3(transform.position.x, transform.position.y + 0.25f, transform.position.z),
transform.forward,
2)) {
Debug.Log("forwardraycheck passed");
Walk();
} else {
Debug.Log("forwardraycheck failed");
Idle ();
}
}
}
private void Idle() {
Debug.Log("idling");
animation.Play("idle");
}
private void Walk() {
Debug.Log("walking");
transform.Translate(Vector3.forward * movementSpeed * Time.deltaTime);
animation.Play("walk");
}
}