阻止精灵弹跳
Stop sprite from bouncing
我正在Unity平台上制作一个简单的益智游戏。首先,我从头测试了一些简单的物理学,然后用 C# 编写。但出于某种原因,一些代码没有产生相同的效果。从头开始,代码 使精灵完全按照我的意愿行事;走向鼠标,减速,然后停在鼠标上。然而,(我认为是)Unity 中的相同代码使精灵变得疯狂并且永不停止。
更新
这绝对是原因 #2。事实证明,精灵正在从其他边界框反弹,导致速度急剧变化。它适用于较小的值,除非我有重力。我的新问题有什么办法可以阻止精灵弹跳吗?
Vector2 CalcHookPull(){
//code for finding which hook and force
//find if mouse pressed
if (Input.GetMouseButton(0))
{
//check if new hook needs to be found
if (!last){
Vector2 mypos = new Vector2(transform.position.x, transform.position.y);
Vector2 relmousepos = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x-transform.position.x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y-transform.position.y);
//player is on layer 8, don't want to check itself
int layermask = ~(1<<8);
RaycastHit2D hit = Physics2D.Raycast(mypos, relmousepos, Mathf.Infinity, layermask);
maybeHook = hit.collider.gameObject;
}
if(maybeHook.tag == "hook"){
float hookx = maybeHook.transform.position.x;
float hooky = maybeHook.transform.position.y;
float myx = transform.position.x;
float myy = transform.position.y;
//elasticity = 30
float chx = (hookx - myx) / (5f + 1f/3f);
float chy = (hooky - myy) / (5f + 1f/3f);
float curchx = GetComponent<Rigidbody2D> ().velocity.x;
float curchy = GetComponent<Rigidbody2D> ().velocity.y;
Vector2 toChange = new Vector2 (curchx * 0.3f + chx, curchy * 0.3f + chy);
Debug.Log(toChange);
last = Input.GetMouseButton (0);
return toChange;
} else{
last = Input.GetMouseButton (0);
return new Vector2(0,0);
}
} else {
last = Input.GetMouseButton (0);
return new Vector2 (0, 0);
}
}
可能的差异:
- 向量的工作方式与 xy 变化不同(有疑问)
- 边界框不允许精灵一直走到钩子对象的中心。 (可能,但不知道如何解决)
- 我把代码抄错了(不太可能)
感谢任何帮助,谢谢!
我是傻了。已经有一些东西可以做到这一点。应该多考虑一下。 http://docs.unity3d.com/Manual/class-PhysicsMaterial2D.html
我正在Unity平台上制作一个简单的益智游戏。首先,我从头测试了一些简单的物理学,然后用 C# 编写。但出于某种原因,一些代码没有产生相同的效果。从头开始,代码
更新
这绝对是原因 #2。事实证明,精灵正在从其他边界框反弹,导致速度急剧变化。它适用于较小的值,除非我有重力。我的新问题有什么办法可以阻止精灵弹跳吗?
Vector2 CalcHookPull(){
//code for finding which hook and force
//find if mouse pressed
if (Input.GetMouseButton(0))
{
//check if new hook needs to be found
if (!last){
Vector2 mypos = new Vector2(transform.position.x, transform.position.y);
Vector2 relmousepos = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x-transform.position.x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y-transform.position.y);
//player is on layer 8, don't want to check itself
int layermask = ~(1<<8);
RaycastHit2D hit = Physics2D.Raycast(mypos, relmousepos, Mathf.Infinity, layermask);
maybeHook = hit.collider.gameObject;
}
if(maybeHook.tag == "hook"){
float hookx = maybeHook.transform.position.x;
float hooky = maybeHook.transform.position.y;
float myx = transform.position.x;
float myy = transform.position.y;
//elasticity = 30
float chx = (hookx - myx) / (5f + 1f/3f);
float chy = (hooky - myy) / (5f + 1f/3f);
float curchx = GetComponent<Rigidbody2D> ().velocity.x;
float curchy = GetComponent<Rigidbody2D> ().velocity.y;
Vector2 toChange = new Vector2 (curchx * 0.3f + chx, curchy * 0.3f + chy);
Debug.Log(toChange);
last = Input.GetMouseButton (0);
return toChange;
} else{
last = Input.GetMouseButton (0);
return new Vector2(0,0);
}
} else {
last = Input.GetMouseButton (0);
return new Vector2 (0, 0);
}
}
可能的差异:
- 向量的工作方式与 xy 变化不同(有疑问)
- 边界框不允许精灵一直走到钩子对象的中心。 (可能,但不知道如何解决)
- 我把代码抄错了(不太可能)
感谢任何帮助,谢谢!
我是傻了。已经有一些东西可以做到这一点。应该多考虑一下。 http://docs.unity3d.com/Manual/class-PhysicsMaterial2D.html