我一直在研究Google ARCore,并被困在如何使用来自android设备的输入来移动游戏对象。
我创建的画布恰好带有4个按钮,它们是来自跨平台输入的AxisTouchButton脚本,涵盖了垂直和水平方向。我尝试了倾斜触摸来缩放,平移和旋转效果似乎很好。但是当我尝试向游戏对象施加力或速度时,它第一次会完美移动,然后当我再次按动按钮时,它开始除非按其他任何按钮,否则将朝该特定方向浮动。
下面的代码用于示例中HelloAR场景中附着到Andy预制件上的游戏对象的移动:
Vector3 offset=Vector3.zero;
offset.x = CrossPlatformInputManager.GetAxis("Horizontal");
offset.z= CrossPlatformInputManager.GetAxis("Vertical");
rb.velocity=(offset * speed ) ;
答案 0 :(得分:0)
我不确定您的预制件为什么会随您提供的代码片段而变化, 预制运动完成后,尝试将速度重置为零。
rb.velocity = new Vector3(0,0,0);
或者可能是由于您将预制件移离其母锚的距离太远,或者可能是因为离arcore检测到的平面太远了。
但是我还有另一种经过测试的方法,可以在arcore检测到的平面上使用触摸输入来移动预制件,因为它允许您仅在检测到的平面上移动预制件,因此在完成更换后可以轻松地重置其锚点预制的。
我以以下方式修改了 HelloARController.cs 脚本。
bool move = false; //handle move with some button calls
void Update(){
//add this in your update method to call MoveObject() method
//handle move with some buttons
if(move){
MoveObject();
}
}
void MoveObject(){
if(Input.touchCount == 1){
Touch touch = Input.GetTouch(0);
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast (touch.position.x, touch.position.y, raycastFilter, out hit)) {
if ((hit.Trackable is DetectedPlane) && Vector3.Dot (firstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0) {
Debug.Log ("Hit at back of the current detected plane");
}
else {// KEY CODE SNIPPET : moves the selectedObject at the location of touch on detected planes
selectedObject.transform.position = hit.Pose.position;
}
}
else {
Debug.Log ("Not moving");
}
}
}
此处 selectedObject 是您要实例化的预制对象。 确保一次仅实例化一个预制件,并将其引用到selectedObject。
答案 1 :(得分:0)
忘记旧的解决方案,尝试新的ARCore操纵系统!对于新手。
现在,他们忘记了在预制件上添加对撞机,所以不要忘记在运行示例前添加对撞机。
ARCore Unity SDK v1.13.0