unity3D中,限制物体移动范围时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity3D中,限制物体移动范围时出错相关的知识,希望对你有一定的参考价值。

我获取当前物体的位置,判断当这个位置小于一定值的时候才能移动,但是运行时移动到边界就开始反方向移动了,求大神指点。
void Update ()
float x = transform.position.x;
float y = transform.position.y;

if (Input.GetKey(KeyCode.W))

if (Input.GetKey(KeyCode.A))

if (x > -10000)

this.transform.Translate(Vector3.right * Time.deltaTime * -RotateSpeed);




if (Input.GetKey(KeyCode.D))

if (x < 10000)

this.transform.Translate(Vector3.right * Time.deltaTime * RotateSpeed);


参考技术A if (x > -10000)

this.transform.Translate(Vector3.right * Time.deltaTime * -RotateSpeed);

大于-1000时该物体会移动追问

大哥。。。代码我写的肯定知道什么意思啊,麻烦看清楚我的问题啊

追答

不好意思没看清楚你的问题,也没有看懂你的代码,没有明白你什么意思

追问

额。。。。。。那个,我设置了,当按下键盘上的A的时候,判定物体的X轴坐标是否小于-10000,当小于时,物体往左边移动,大于时就不移动,但是现在当按住A的时候向左移动到-10000的位置的时候又会朝右边移动了

追答

// Update is called once per frame
void Update()

if (transform.position.x 10)

transform.position=new Vector3(9.9f, transform.position.y, transform.position.z);


if (Input.GetKey(KeyCode.A))

transform.Translate(new Vector3(-1, 0, 0)* 2*Time.deltaTime);

if (Input.GetKey(KeyCode.D))

transform.Translate(new Vector3(1, 0, 0) * 2 * Time.deltaTime);


本回答被提问者和网友采纳
参考技术B 可能是你的 这个 “-RotateSpeed”的问题,它的正负控制 方向

将 UICollectionview 中单元格的移动限制在 CollectionView 的范围内

【中文标题】将 UICollectionview 中单元格的移动限制在 CollectionView 的范围内【英文标题】:Constrain movement of cell in UICollectionview to bounds of the CollectionView 【发布时间】:2018-02-23 14:50:56 【问题描述】:

当我将一个单元格拖到 CollectionView 边界之外时,我遇到了一些奇怪的行为(实际上是崩溃)。如何将 CollectionView 的用户交互限制为仅 CollectionView 的框架?当用户长按并拖动视图单元格时,我只希望他们能够在 CollectionView 中移动单元格,而不是在整个屏幕上移动

private void HandleLongPressOnCollection(UILongPressGestureRecognizer gesture)

    switch (gesture.State)
    
        case UIGestureRecognizerState.Began:
            var myIndexPath = MyCollectionView.IndexPathForItemAtPoint(gesture.LocationInView(MyCollectionView));
            this.selectedIndexPath = myIndexPath;

            BeginInteractiveMovementForItem();
            break;
        case UIGestureRecognizerState.Changed: // This is not working correctly
            if (MyCollectionView.Frame.Contains(gesture.LocationInView(MyCollectionView)))
            
                MyCollectionView.UpdateInteractiveMovement(gesture.LocationInView(MyCollectionView));
            
            break;
        case UIGestureRecognizerState.Ended:
            EndInteractiveMovementForItem();
            break;
        default:
            MyCollectionView.CancelInteractiveMovement();
            break;
      



private void BeginInteractiveMovementForItem()

  if (selectedIndexPath != null)
  
    MyCollectionView.BeginInteractiveMovementForItem(selectedIndexPath);

    var cell = MyCollectionView.CellForItem(selectedIndexPath) as CustomViewCell;
    cell.MarkCellAsMoving();
  


private void EndInteractiveMovementForItem()

  if (selectedIndexPath != null)
  
    var cell = MyCollectionView.CellForItem(selectedIndexPath) as CustomViewCell;
    cell?.SetToNormalState();
  
  MyCollectionView.EndInteractiveMovement();

【问题讨论】:

【参考方案1】:

您应该将手势的位置与ContentView 而非Framelike 进行比较:

case UIGestureRecognizerState.Changed:

    CGPoint gesturePoint = gesture.LocationInView(MyCollectionView);

    CGSize contentSize = MyCollectionView.ContentSize;

    if (gesturePoint.X > 0 && gesturePoint.X < contentSize.Width &&
        gesturePoint.Y > 0 && gesturePoint.Y < contentSize.Height)
    
        MyCollectionView.UpdateInteractiveMovement(gesture.LocationInView(MyCollectionView));
    
    break;

调整 if 语句中的常量以满足您的要求。

此外,当您调用MyCollectionView.EndInteractiveMovement(); 时,事件MoveItem() 可能会发生崩溃。您可以尝试发布一些有关它的代码。

【讨论】:

【参考方案2】:

你可以使用

collectionView.bounces = false

如果你想拖到边缘。

您也可以发布您遇到的崩溃吗?

【讨论】:

崩溃没有给我任何堆栈跟踪,当我查看设备日志时它也没有给我任何信息。我认为这是与 xamarin 中的 iOS 11 相关的崩溃,它不会发生在 iOS 10 设备上。我想要做的是防止用户在整个屏幕上拖动单元格,我只希望他们能够在 collectionview 的范围内单击并拖动

以上是关于unity3D中,限制物体移动范围时出错的主要内容,如果未能解决你的问题,请参考以下文章

unity3d中c#如何修改物体局部的颜色

在unity3d里无法移动物体

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体

unity3d如何通过一个按钮控制物体缩小和放大呢?

Unity3D 在运行时实现物体的移动旋转伸缩控制

unity3d用键盘控制物体移动的工具