我是C#的新手,并决定现在开始使用它,因为大多数Unity教程都专注于它,而且我从未将JavaScript用于除网页以外的任何其他内容。
在大多数情况下,一切正常,直到我尝试使用 Vector2.MoveTowards 方法:
void OnMouseDown() {
int weapCoolDown = 1;
Instantiate(bullet_player);
Vector2.MoveTowards(GameObject.Find("player-1"), Vector2 PointerEventData.position(), float p1BulletSpeed);
}
Errors reported by Unity console
我尝试删除Vector2,然后它要求我添加 EventSystems ,但它已经在 UnityEngine 中。我解决了,然后它说它不存在?然后我修复了它,它只是给了我一些其他错误,我甚至不知道如何删除。
当我尝试使用标识符时,它会分配它,但它不会让我使用它,它会像往常一样说出意外的符号。
Unity手册没有提供足够的细节或示例来帮助我解决这个问题,是否有我缺少的课程或参考,或者我应该尝试使用其他方法?
答案 0 :(得分:0)
您应该在代码中查看一些内容:
没有使用适当的参数调用Vector2.MoveTowards()
。 GameObject.Find()
将返回一个gameObject,而不是一个Vector2。如果你正在寻找玩家1的当前位置,你应该从玩家1的transform.position构建一个Vector2。
Vector2 playerPosition = new Vector2();
playerPosition.x = GameObject.Find("player-1").transform.position.x;
playerPosition.y = GameObject.Find("player-1").transform.position.y;
PointerEventData的任何使用都需要EventSystem的using指令。要包含它,请将using UnityEngine.EventSystem
与其余的using指令一起添加。
PointerEventData.position()
之前的Vector2前缀无效。它不是一个明确的类型转换,因为它不在括号中,但由于位置将返回Vector2,因此不需要类型转换。
pointerEventData.position
是从对象引用中提取的属性。但是,PointerEventData.position()
的实现不正确地将其用作静态方法。由于它实际上不是静态方法,而是动态属性,因此无法编译和绘制错误。
要使pointerEventData存在,它需要来自检索eventData的事件。不幸的是,OnMouseDown()
没有这样做。但是,名为IPointerClickHandler的OnPointerClick(PointerEventData pointerEventData)
接口方法具有您需要的pointerEventData。
重构现有代码,这更接近您正在寻找的功能。
// Add this "using" directive
using UnityEngine.EventSystems;
// Be sure to implement the interface of IPointerClickHandler
public class NameOfYourScript : MonoBehaviour, IPointerClickHandler {
//
// Additional Code in your class. . . .
//
// Replace OnMouseDown() with this.
public void OnPointerClick(PointerEventData pointerEventData) {
Instantiate(bullet_player);
Vector2 playerPosition = new Vector2();
playerPosition.x = GameObject.Find("player-1").transform.position.x;
playerPosition.y = GameObject.Find("player-1").transform.position.y;
Vector2.MoveTowards(playerPosition, pointerEventData.position, p1BulletSpeed);
}
}