c# - 有没有办法用刚体移动游戏对象
问题描述
参考图片更容易理解案例。
.
我正在制作一个 3D 游戏,并且希望能够用一根手指向上移动棋盘并在 Z 轴上旋转它。如果手指向上滑动 - 板会上升。如果手指向左或向右滑动,则板向左或向右倾斜。
重点是让木板将位于其顶部的球向上移动,当木板向一侧倾斜/旋转时,球开始滑动并掉落到一侧。
板和球附有刚体。
到目前为止我已经尝试过:
- 使用一个滑块,当值改变时,板会随着 Quaternion.Euler 旋转。
- 使用 IDragHandler 接口并将板位置更改为注册触摸时收到的 EventData。
- 尝试使用将棋盘位置垂直修改一段距离的按钮 - 它瞬间发生并且球从棋盘中落下。
- 创建 UI 图像/操纵杆并使用触摸/事件数据(来自 IDragHandler)在 UI 操纵杆移动时移动板变换。
我尝试了更多变体,不幸的是我现在不记得它们了,而且我已经尝试过的所有方法都不起作用。
解决方案
我想到了。我向一个空的游戏对象添加了一个图像(UI)游戏对象,以便它可以从 X 轴上的 0 和 Y 轴上的 0 移动。添加了 3 个变换 - 1 个向左倾斜,1 个向右倾斜,1 个在屏幕顶部的中间,作为游戏中的向导,然后禁用它们,这样它们就不会出现在实际游戏中。将脚本附加到我的 Image UI 游戏对象并在检查器中分配必要的转换,瞧,它可以工作。
using UnityEngine;
using UnityEngine.EventSystems;
public class MoveStick : MonoBehaviour, IDragHandler, IEndDragHandler {
public Transform leftTarget;
public Transform rightTarget;
public float rotateSpeed;
[Space]
Vector2 joyStartPosition;
public Transform stick;
public Transform topTarget;
public float speed;
bool goingUp;
void Start()
{
joyStartPosition = transform.position;
goingUp = false;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
if (transform.localPosition.y > 80f || transform.localPosition.x > 50 || transform.localPosition.x < -50)
{
goingUp = true;
var step = speed * Time.deltaTime;
stick.position = Vector3.MoveTowards(stick.position, topTarget.position, step);
Debug.Log("Going up: " + goingUp);
}
else if (transform.localPosition.y < 80f)
{
goingUp = false;
Debug.Log("Going up: " + goingUp);
}
if (transform.localPosition.x > 80 && transform.localPosition.y > 80)
{
stick.rotation = Quaternion.RotateTowards(stick.rotation, rightTarget.rotation, rotateSpeed * Time.deltaTime);
}
else if (transform.localPosition.x < -80 && transform.localPosition.y > 80)
{
stick.rotation = Quaternion.RotateTowards(stick.rotation, leftTarget.rotation, rotateSpeed * Time.deltaTime);
}
}
public void OnEndDrag(PointerEventData eventData)
{
transform.position = joyStartPosition;
eventData.position = joyStartPosition;
Debug.Log("Joystick is not moving");
goingUp = false;
}
}
还有很多需要平滑和改进的地方,但是作为基本代码它可以正常工作。
推荐阅读
- typescript - TypeScript 3.1:如何在严格模式下使用枚举索引数组?
- c# - 无法在静态上下文中访问非静态字段
- javascript - “等待”异步迭代中的“睡眠”执行(ES2018)
- python - 格式良好的 XML 在 zip 文件中读取时抛出 XMLSyntaxError
- android - 即使从最近的任务中清除应用程序,Android 也会继续下载
- node.js - 员工层次结构的递归函数(nodejs)
- javascript - Promise 函数中的 Promise:无法将数据推送到数组中
- javascript - JS 异步函数停止页面加载
- python - 删除字符串中每个句子中特定符号后的单词
- python - Odoo V10 - 计算字段