Unity'de karakter kendi kendine hareket ediyor

Samsunliii

Decapat
Katılım
22 Eylül 2020
Mesajlar
80
sorun.PNG


Şimdi karakterim zıplarken yandan toplar atılıyor o bana değdiğinde yok oluyor ama bazı durumlarda yok olmasına rağmen bana değdiğinden sonra karakterimi hareket ettirmeme rağmen karakter kendi kendine top nereden çarptıysa oraya doğru harekete geçiyor sonra bir kere daha top değdiğinde bu düzeliyor sonra bu döngü şeklinde devam ediyor. Aynı şekilde yukarıda göründen kare şeklinde kırmızı yerden de bir güç alıyor ve y ekseninde yukarı çıkıyor(yukarıda da toplar var ayrıca) çıkarken top değiyor karakter gene aynı bazı durumlarda kendi kendine hareket bazı durumlar da bu sorun olmuyor.

Not1: Sol ve sağ butonlarım var sola bastığında Speed diye bir değişkenim var ve Update fonksiyonumda da transform. Position += New Vector3(Speed, 0F, 0F) * Time. DeltaTime * 1;
Diye bu kod satırı var karakterimi bu şekilde hareket ettiriyorum.
Not2: Karakterimde de 2 tane capsule collider var.
Not3: Topda bir güç yok dotween plugini kullandım DoLocalMoveX ile hareket ediyor öncesinde bu topta rigidbody vardı ama orada sorun yaşadım (aynı sorunu) belki düzelir diye dotween koydum gene aynı.
Not1: Kırmızı şekildeki yerde copsule collider var. Kırmızı kare şeklinde yerde material var Friction 0 ve Bouncienss 0. Karakter kırmızı şekildeki yere değince add Force ile güç alıyor.
Bu sorunu nasıl çözebilirim?

 
Son düzenleme:
Scriptinizi atarsanız daha sağlıklı yardım alabilirsiniz. Frictionu 0 yaptığınız için muhtemelen uygulanan kuvvetin etkisiyle hareket etmeye devam ediyor olabilir. Topun colliderı var mı?
 
Karakteriniz sağa sola istemsiz hareket ederken üzerindeki Rigidbody ye bakabilir misiniz? Velocity si mi oynuyor yoksa sadece Transform mu
 
Topun çarptığı anda aktif olan scripti ve hareket scriptinizi atar mısınız

[CODE lang="csharp" title="PlayerController"]using DG.Tweening;
using UnityEngine.UI;
public class PlayerConroller : MonoBehaviour
{
Rigidbody2D playerRb;
public float moveSpeed,jumpSpeed=1f,jumpFrequency=1f,nextJumpTime;
//jumpfrequency benim ne kadar sıklıkla zıplayabileceiğimi söyler misal her bir saniyede 1 defa zıplasın.
//next jump time benim bir sonraki zıplayaşımın zamanın bana söylecek.
public bool itsGrounded = false;
bool facingRight = true;
public bool basincbastinMi=false;
public bool ahsahBasıncBastinMi = false;
public bool keskinAletuzerindeMiyim = false;


public Transform groundCheckPosition;


public float groundCheckRadius;
public float speed;


public LayerMask groundCheckLayer;
public LayerMask groundCheckLayerBasinc;
public LayerMask groundCheckLayerAhsapbasinc;
public LayerMask groundCheckLayerkeskinAlet;


public AudioSource audioSource;
public AudioClip audioClip;
public AudioClip basincSesi;





public GameObject basincPlakası;


void Start()
{
audioSource = GetComponent<AudioSource>();
keskinAletuzerindeMiyim = false;
ahsahBasıncBastinMi = false;
basincbastinMi = false;
itsGrounded = false;
facingRight = true;
playerRb = GetComponent<Rigidbody2D>();

}

void Update()
{
transform.position += new Vector3(speed, 0f, 0f) * Time.deltaTime * 1;

OnGroundCheck();


//if (itsGrounded==true && (nextJumpTime<Time.timeSinceLevelLoad))
//{

// nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
// Zıpla();
//}
}

private void OnCollisionEnter2D(Collision2D collision)
{
if (basincbastinMi && (nextJumpTime < Time.timeSinceLevelLoad)) //basınç bastın mı true ise o zaman yukarı kuvvet vericez.
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
GucVer();

}
if (collision.gameObject.tag=="ahsapBlock" && (nextJumpTime < Time.timeSinceLevelLoad))
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
ahsahBasıncBastinMi = true;
StartCoroutine(ahsapBasıncKontrol());

GucVer2();


}




}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.tag == "mermi")
{
playerRb.AddForce(new Vector2(0f, 0f));


}
}



void flipFace()
{
facingRight = !facingRight;
Vector3 tempLocalScale = transform.localScale;
tempLocalScale.x *= -1;
transform.localScale = tempLocalScale;





}

void OnGroundCheck()
{
itsGrounded=Physics2D.OverlapCircle(groundCheckPosition.position,groundCheckRadius,groundCheckLayer);
basincbastinMi=Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerBasinc);
//ahsahBasıncBastinMi = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerAhsapbasinc);
keskinAletuzerindeMiyim = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerkeskinAlet);





}
void GucVer()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
void GucVer2()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
IEnumerator ahsapBasıncKontrol()
{
yield return new WaitForSeconds(2f);
ahsahBasıncBastinMi = false;



}
public void SagaGit()
{

speed = 10;
if (speed==10&& !facingRight)
{
flipFace();
}


}
public void solaGit()
{

speed = -10;

if (speed == -10 && facingRight)
{
flipFace();
}


}

public void dur()
{
speed = 0;


}
public void Zıpla()
{

if (itsGrounded==true && (nextJumpTime < Time.timeSinceLevelLoad))
{

audioSource.PlayOneShot(audioClip);
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
playerRb.AddForce(new Vector2(0f, 12f), ForceMode2D.Impulse);
}









}

}[/CODE]
[CODE lang="csharp" title="mermiManager"]using DG.Tweening;
using UnityEngine.UI;

public class mermiManager : MonoBehaviour
{


public Transform mermi;
public Transform fireParticle;
Transform muzzle;
Transform tempBullet;

public Transform MainCamera;

public AudioClip audioClip;
public AudioSource audioSource;


private void Start()
{

audioSource = GetComponent<AudioSource>();
muzzle = transform.GetChild(0);

StartCoroutine(mermiOlusmaRoutine());



}


void mermiOlustur()
{




audioSource.PlayOneShot(audioClip, 0.1f);
tempBullet = Instantiate(mermi, muzzle.position, Quaternion.identity);
tempBullet.GetComponent<RectTransform>().DOLocalMoveX(-10f, 3f);

Instantiate(fireParticle, muzzle.position, Quaternion.identity);












}
IEnumerator mermiOlusmaRoutine()
{


while (true)
{

yield return new WaitForSeconds(2f);

mermiOlustur();



yield return new WaitForSeconds(2f);


}








}














}[/CODE]
[CODE lang="csharp" title="PlayerController"]using DG.Tweening;
using UnityEngine.UI;
public class PlayerConroller : MonoBehaviour
{
Rigidbody2D playerRb;
public float moveSpeed,jumpSpeed=1f,jumpFrequency=1f,nextJumpTime;
//jumpfrequency benim ne kadar sıklıkla zıplayabileceiğimi söyler misal her bir saniyede 1 defa zıplasın.
//next jump time benim bir sonraki zıplayaşımın zamanın bana söylecek.
public bool itsGrounded = false;
bool facingRight = true;
public bool basincbastinMi=false;
public bool ahsahBasıncBastinMi = false;
public bool keskinAletuzerindeMiyim = false;


public Transform groundCheckPosition;


public float groundCheckRadius;
public float speed;


public LayerMask groundCheckLayer;
public LayerMask groundCheckLayerBasinc;
public LayerMask groundCheckLayerAhsapbasinc;
public LayerMask groundCheckLayerkeskinAlet;


public AudioSource audioSource;
public AudioClip audioClip;
public AudioClip basincSesi;





public GameObject basincPlakası;


void Start()
{
audioSource = GetComponent<AudioSource>();
keskinAletuzerindeMiyim = false;
ahsahBasıncBastinMi = false;
basincbastinMi = false;
itsGrounded = false;
facingRight = true;
playerRb = GetComponent<Rigidbody2D>();

}

void Update()
{
transform.position += new Vector3(speed, 0f, 0f) * Time.deltaTime * 1;

OnGroundCheck();


//if (itsGrounded==true && (nextJumpTime<Time.timeSinceLevelLoad))
//{

// nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
// Zıpla();
//}
}

private void OnCollisionEnter2D(Collision2D collision)
{
if (basincbastinMi && (nextJumpTime < Time.timeSinceLevelLoad)) //basınç bastın mı true ise o zaman yukarı kuvvet vericez.
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
GucVer();

}
if (collision.gameObject.tag=="ahsapBlock" && (nextJumpTime < Time.timeSinceLevelLoad))
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
ahsahBasıncBastinMi = true;
StartCoroutine(ahsapBasıncKontrol());

GucVer2();


}




}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.tag == "mermi")
{
playerRb.AddForce(new Vector2(0f, 0f));


}
}



void flipFace()
{
facingRight = !facingRight;
Vector3 tempLocalScale = transform.localScale;
tempLocalScale.x *= -1;
transform.localScale = tempLocalScale;





}

void OnGroundCheck()
{
itsGrounded=Physics2D.OverlapCircle(groundCheckPosition.position,groundCheckRadius,groundCheckLayer);
basincbastinMi=Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerBasinc);
//ahsahBasıncBastinMi = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerAhsapbasinc);
keskinAletuzerindeMiyim = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerkeskinAlet);





}
void GucVer()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
void GucVer2()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
IEnumerator ahsapBasıncKontrol()
{
yield return new WaitForSeconds(2f);
ahsahBasıncBastinMi = false;



}
public void SagaGit()
{

speed = 10;
if (speed==10&& !facingRight)
{
flipFace();
}


}
public void solaGit()
{

speed = -10;

if (speed == -10 && facingRight)
{
flipFace();
}


}

public void dur()
{
speed = 0;


}
public void Zıpla()
{

if (itsGrounded==true && (nextJumpTime < Time.timeSinceLevelLoad))
{

audioSource.PlayOneShot(audioClip);
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
playerRb.AddForce(new Vector2(0f, 12f), ForceMode2D.Impulse);
}









}

}[/CODE]
[CODE lang="csharp" title="mermiManager"]using DG.Tweening;
using UnityEngine.UI;

public class mermiManager : MonoBehaviour
{


public Transform mermi;
public Transform fireParticle;
Transform muzzle;
Transform tempBullet;

public Transform MainCamera;

public AudioClip audioClip;
public AudioSource audioSource;


private void Start()
{

audioSource = GetComponent<AudioSource>();
muzzle = transform.GetChild(0);

StartCoroutine(mermiOlusmaRoutine());



}


void mermiOlustur()
{




audioSource.PlayOneShot(audioClip, 0.1f);
tempBullet = Instantiate(mermi, muzzle.position, Quaternion.identity);
tempBullet.GetComponent<RectTransform>().DOLocalMoveX(-10f, 3f);

Instantiate(fireParticle, muzzle.position, Quaternion.identity);












}
IEnumerator mermiOlusmaRoutine()
{


while (true)
{

yield return new WaitForSeconds(2f);

mermiOlustur();



yield return new WaitForSeconds(2f);


}








}














}[/CODE]
Top oluşturma scriptimi attım top çarptığında anda yok ediyorum onu mu atıyım size?
Karakteriniz sağa sola istemsiz hareket ederken üzerindeki Rigidbody ye bakabilir misiniz? Velocity si mi oynuyor yoksa sadece Transform mu
İstemsiz harekette Velocity de değişkenlik gösteriyor. Sonra bir yere çarpınca velocity x sıfırlanıyor.
Scriptinizi atarsanız daha sağlıklı yardım alabilirsiniz. Frictionu 0 yaptığınız için muhtemelen uygulanan kuvvetin etkisiyle hareket etmeye devam ediyor olabilir. Topun colliderı var mı?
guc.PNG

Bu iki kısma değince de istemsiz hareket ediyor. Materialini kaldırdım.
 
Son düzenleme:
[CODE lang="csharp" title="PlayerController"]using DG.Tweening;
using UnityEngine.UI;
public class PlayerConroller : MonoBehaviour
{
Rigidbody2D playerRb;
public float moveSpeed,jumpSpeed=1f,jumpFrequency=1f,nextJumpTime;
//jumpfrequency benim ne kadar sıklıkla zıplayabileceiğimi söyler misal her bir saniyede 1 defa zıplasın.
//next jump time benim bir sonraki zıplayaşımın zamanın bana söylecek.
public bool itsGrounded = false;
bool facingRight = true;
public bool basincbastinMi=false;
public bool ahsahBasıncBastinMi = false;
public bool keskinAletuzerindeMiyim = false;


public Transform groundCheckPosition;


public float groundCheckRadius;
public float speed;


public LayerMask groundCheckLayer;
public LayerMask groundCheckLayerBasinc;
public LayerMask groundCheckLayerAhsapbasinc;
public LayerMask groundCheckLayerkeskinAlet;


public AudioSource audioSource;
public AudioClip audioClip;
public AudioClip basincSesi;





public GameObject basincPlakası;


void Start()
{
audioSource = GetComponent<AudioSource>();
keskinAletuzerindeMiyim = false;
ahsahBasıncBastinMi = false;
basincbastinMi = false;
itsGrounded = false;
facingRight = true;
playerRb = GetComponent<Rigidbody2D>();

}

void Update()
{
transform.position += new Vector3(speed, 0f, 0f) * Time.deltaTime * 1;

OnGroundCheck();


//if (itsGrounded==true && (nextJumpTime<Time.timeSinceLevelLoad))
//{

// nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
// Zıpla();
//}
}

private void OnCollisionEnter2D(Collision2D collision)
{
if (basincbastinMi && (nextJumpTime < Time.timeSinceLevelLoad)) //basınç bastın mı true ise o zaman yukarı kuvvet vericez.
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
GucVer();

}
if (collision.gameObject.tag=="ahsapBlock" && (nextJumpTime < Time.timeSinceLevelLoad))
{
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
audioSource.PlayOneShot(basincSesi);
ahsahBasıncBastinMi = true;
StartCoroutine(ahsapBasıncKontrol());

GucVer2();


}




}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.tag == "mermi")
{
playerRb.AddForce(new Vector2(0f, 0f));


}
}



void flipFace()
{
facingRight = !facingRight;
Vector3 tempLocalScale = transform.localScale;
tempLocalScale.x *= -1;
transform.localScale = tempLocalScale;





}

void OnGroundCheck()
{
itsGrounded=Physics2D.OverlapCircle(groundCheckPosition.position,groundCheckRadius,groundCheckLayer);
basincbastinMi=Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerBasinc);
//ahsahBasıncBastinMi = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerAhsapbasinc);
keskinAletuzerindeMiyim = Physics2D.OverlapCircle(groundCheckPosition.position, groundCheckRadius, groundCheckLayerkeskinAlet);





}
void GucVer()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
void GucVer2()
{
playerRb.AddForce(new Vector2(0f, 800f));




}
IEnumerator ahsapBasıncKontrol()
{
yield return new WaitForSeconds(2f);
ahsahBasıncBastinMi = false;



}
public void SagaGit()
{

speed = 10;
if (speed==10&& !facingRight)
{
flipFace();
}


}
public void solaGit()
{

speed = -10;

if (speed == -10 && facingRight)
{
flipFace();
}


}

public void dur()
{
speed = 0;


}
public void Zıpla()
{

if (itsGrounded==true && (nextJumpTime < Time.timeSinceLevelLoad))
{

audioSource.PlayOneShot(audioClip);
nextJumpTime = Time.timeSinceLevelLoad + jumpFrequency;
playerRb.AddForce(new Vector2(0f, 12f), ForceMode2D.Impulse);
}









}

}[/CODE]
[CODE lang="csharp" title="mermiManager"]using DG.Tweening;
using UnityEngine.UI;

public class mermiManager : MonoBehaviour
{


public Transform mermi;
public Transform fireParticle;
Transform muzzle;
Transform tempBullet;

public Transform MainCamera;

public AudioClip audioClip;
public AudioSource audioSource;


private void Start()
{

audioSource = GetComponent<AudioSource>();
muzzle = transform.GetChild(0);

StartCoroutine(mermiOlusmaRoutine());



}


void mermiOlustur()
{




audioSource.PlayOneShot(audioClip, 0.1f);
tempBullet = Instantiate(mermi, muzzle.position, Quaternion.identity);
tempBullet.GetComponent<RectTransform>().DOLocalMoveX(-10f, 3f);

Instantiate(fireParticle, muzzle.position, Quaternion.identity);












}
IEnumerator mermiOlusmaRoutine()
{


while (true)
{

yield return new WaitForSeconds(2f);

mermiOlustur();



yield return new WaitForSeconds(2f);


}








}














}[/CODE]


İstemsiz harekette Velocity de değişkenlik gösteriyor. Sonra bir yere çarpınca velocity x sıfırlanıyor.
Çarptıktan hemen sonra velocity sini 0 lar mısınız
 
Çarptıktan hemen sonra velocity sini 0 lar mısınız
Mermiye, kırmızı şekle ve tuğla şekline çarptığım anda dediğinizi yaptım düzeldi gibi sorun yaşarsam tekrardan konuşuruz teşekkürler.
Çarptıktan hemen sonra velocity sini 0 lar mısınız
Update fonksiyonuna yazsam update fonksiyonunda sürekli çalışacağı için sıkıntı çıkar mı acaba?
 
Son düzenleme:

Yeni konular

Geri
Yukarı