【问题标题】:Unity C# 'set sprite position to mouse pointer' makes sprite clip through other spritesUnity C#'将精灵位置设置为鼠标指针'使精灵剪辑通过其他精灵
【发布时间】:2019-02-05 06:02:23
【问题描述】:

(抱歉,如果格式或其他任何内容不正确,已经使用 stackoverflow 有一段时间了,以前从未问过问题。另外,我是 unity 和 c# 的新手)

我无法发布图片,但这里有一个 imgur 的链接

https://imgur.com/a/jcki1qd

(很抱歉,我在描述事物时遇到了很多麻烦,我认为图片会有所帮助)

我有一个用于圆形精灵的简单代码,它带有一个附在弹簧上的圆形精灵图,当我握住精灵时,将其向后拖动,然后释放鼠标,该对象会以与我拖动的方向相反的方向飞行它回到(几乎像愤怒的小鸟一样发射)。但是,当我拿着精灵时,我可以通过我关卡上的其他精灵来剪辑它,甚至超出界限。球是浮动的,游戏应该能够向任何方向拖动和发射它

我尝试将弹簧的破断力设置为相当低的水平,因此如果我将它向后拉得太远,球不会发射,但是当我拖动它时,球仍然跟随我的鼠标,当我弹簧断裂后松开,球就掉下来了。

另外,我尝试通过限制弹簧的长度来限制弹簧的半径。但是,它没有用。

            using System.Collections;
            using System.Collections.Generic;
            using UnityEngine;

            public class LaunchScript : MonoBehaviour
            {
              public Rigidbody2D rb;
              private bool isPressed = false;
              public float releaseTime = 0.15f;

                private void Update()
                {
                    if (isPressed)
                    {
                        rb.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                    }
                }
                // Start is called before the first frame update
                void OnMouseDown()
                {
                    isPressed = true;
                    rb.isKinematic = true;
                }

                // Update is called once per frame
                private void OnMouseUp()
                {
                    isPressed = false;
                    rb.isKinematic = false;
                    StartCoroutine(Release());
                }
                IEnumerator Release()
                {
                    yield return new WaitForSeconds(releaseTime);
                    GetComponent<SpringJoint2D>().enabled = false;
                    this.enabled = false;
                }
        }

我的预期结果是:球会跟随鼠标并能够向后拖动,但不会穿过绿色的地面块、篮筐或边界块(用于防止球飞出的块)界)。 我的实际结果是:我可以将球拖到屏幕上的任何点,包括直接进入绿地和出界。

【问题讨论】:

  • 那么你是说当你用鼠标拖动球时,它能够“无剪辑”穿过地形?您是否在您的球和环境中添加了对撞机?

标签: c# visual-studio unity3d


【解决方案1】:

运动刚体碰撞器只能在非触发模式下检测与刚体碰撞器(与非运动刚体的碰撞器)的碰撞。

来自 Unity Manual: Colliders

即使在不动时,运动学刚体对撞机也具有与静态对撞机不同的行为。例如,如果对撞机设置为触发器,那么您还需要向其添加刚体,以便在脚本中接收触发器事件。如果您不希望触发器受重力影响或受到物理影响,则可以在其刚体上设置 IsKinematic 属性。

尝试使用 isKinematic(例如反向启用/禁用或删除它)并禁用 isTrigger。不要忘记你的球和环境中的碰撞器和刚体。

【讨论】:

  • 谢谢。最后,我最终只是限制了弹簧的周长,并以此为基础进行工作,就好像我让球不运动一样,它会出现奇怪的故障(随机飞来飞去,而不是朝着预期的方向飞行)当我试图把它拉回来时。
  • 我在拉回时也禁用了 isKinematic,因为这也会影响球的弹簧和运动。所以现在,当鼠标按下并且它在球上时,弹簧被禁用,直到鼠标被释放。这样,运动是流畅的并且有效
  • 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多