Ömer 34242432
80+ Silver
- Katılım
- 2 Haziran 2020
- Mesajlar
- 2,317
- En İyi Cevap
- 2
Dahası
- Reaksiyon skoru
- 2,800
- İsim
- Ömer Fasd
Merhaba, "Unity'de active ragdoll yapmak" gibi bir rehber serisine başlamayı düşünüyorum eğer isteyen arkadaşlar olursa daha detaylandırırım
ve gördüğünüz bütün gifleri ben yaptım
(Not: biraz kod bilginizin olması yeterli olacaktır)
Rehbere başlamadan önce bilmeniz gerekenler;
-Ragdoll nedir ?
+Ragdoll dediğimiz kavramı kemikleri alınmış sadece fizikler ile hareket eden bir karakter gibi düşünebilirsiniz. örn;
-Active Ragdoll nedir ?
+Active ragdoll ise kendi başına ayakta durabilen bütün hareketlerini animasyon gerektirmeden fizikle hareket eden bir karakter gibi düşünebilirsiniz
Rehbere başlayalım;
Öncelikle bize 2d bir sprite(resim) lazım çöp adam olması daha iyi olur Unity'den de yapabilirsiniz ama gerek yok aşşağıda size gerekli olan şeyleri vereceğim.
Bunu istediğiniz gibi kullanabilirsiniz(eğer kendi resminizi yapacaksanız parçalar ayrı olsun eller yatay ayaklar dikey pozisyonda dursun )
Attığım resmi indirdiğinize veya kendi resminizi çizdiğinize göre Unity'e geçelim.
Resmin üzerine tıkladığınızda bazı ayarlar göreceksiniz onları bu şekilde değiştirin;
Burada yaptığımız şey bu sprite'ın tek bir resim değil bir sürü resim olduğunu belirtmek ve üstündeki blur efektini kaldırmak
Bunu yaptıktan sonra Sprite editor seçeneğine tıklayın
Bunu yaptıktan sonra karşınıza gelen ekranda "Slice" butonuna tıklayıp bir daha "slice" demek en sonunda ise "Apply" butonuna tıklayın daha sonra ise parçaların üstüne çift tıklayın ve parçalara isimlerini verin
eğer dediğim her şeyi doğru yaptıysanız bu şekilde gözükecektir;
Şimdi parçaları ayırdığımıza göre birleştirmeye geçelim öncelikle bir gameobject oluşturun ve adını Stickman koyun sonrasında parçaları onun içine atıp doğru yerlere yerleştirin
Bittiğinde böyle gözükmeli
Şimdi bu parçalara can verme zamanı kafa dışındaki parçaları "shift + leftclick" ile seçin ve "Add Component" kısmından "box collider 2d" ekleyin sonra kafaya gelin ve "circle collider ekleyin" daha sonrasında hepsini seçin ve "Rigidbody 2d" ve "Hinge Joint 2d" ekleyin
Rigidbody ve colliderlara dokunmayın.
Hinge joint 2d'nin üstüne gelin
Sonrasında her parçayı birleştirin Connected rigid body kısmında birleştirin
Üst elleri Body(vücut) ile
Alt elleri UpperArms(üst eller) ile
Üst ayaklar Body ile
Alt ayakar UpperLegs ile
Kafa Body ile
Sonra ise kafaya gelin Use limits'e tıklayın ve,
Lower angle = 20
Upper Angle = -20
Aynısını alt ellere de yapın
Sonrasında küçük noktaları bu şekilde koyun (anchorlar ve connected anchorlar)
Bunu yapmak için "Hinge joint 2d"'den Auto configure seçeneğini devre dışı bırakın ve mouse yardımı ile götürün.
Bunların hepsini yaptıysanız rehberin başında bahsettiğim gibi bir ragdoll'a sahip olacaksınız
şimdi ayakta tutmaya geldik öncelikle bunu için çok basit bir kod yazacağız
öncelikle collisionları yok sayması için bir kod yazacağız;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IgnoreCollision : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
var colliders = GetComponentsInChildren<Collider2D>();
for (int i = 0; i < colliders.Length; i++)
{
for (int k = i + 1; k < colliders.Length; k++)
{
Physics2D.IgnoreCollision(colliders, colliders[k]);
}
}
}
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "Player")
{
Physics2D.IgnoreCollision(this.gameObject.GetComponent<Collider2D>(), coll.gameObject.GetComponent<Collider2D>());
}
}
}
Bunu direk kopyalayabilirsiniz, bunu ayarlardan da yapabiliyorsunuz, şuan üstünde durduğumuz konu bu değil o yüzden direk kopyalayın ce karakterinize(Stickman) "player" tagını verin
şimdi ise karakteri dengede tutma koduna geçelim;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Balance : MonoBehaviour
{
public Rigidbody2D rb2d;
public float TargetRotation;
public float force;
void Update()
{
rb2d.MoveRotation(Mathf.LerpAngle(rb2d.rotation, TargetRotation, force * Time.fixedDeltaTime));
}
}
Kodu kısaca anlatayım;
rigidbody2d karakterimizin parçalarındaki fiziğe erişim sağlayacak.
force ise ayakta kalması için gerekli gücü verecek.
rb2d.MoveRotation(Mathf.LerpAngle(rb2d.rotation, TargetRotation, force * Time.fixedDeltaTime));
Burada girdiğimiz kod ise ne kadar güç verilmesi nereye doğru kalkması gerektiği gibi şeylerin bir ayarı
Bu kodu ise kafa, beden ve bacaklara atıyoruz
Kafanın Force kısmına 10 diğerlerinin ise 150 giriyoruz
Bunları yaptıktan sonra artık ayakta durabilen bir karakterimiz var!
Canım sıkıldığı için yazmıştım, umarım birilerine yardımcı olmuşumdur
ve gördüğünüz bütün gifleri ben yaptım
(Not: biraz kod bilginizin olması yeterli olacaktır)
Rehbere başlamadan önce bilmeniz gerekenler;
-Ragdoll nedir ?
+Ragdoll dediğimiz kavramı kemikleri alınmış sadece fizikler ile hareket eden bir karakter gibi düşünebilirsiniz. örn;
-Active Ragdoll nedir ?
+Active ragdoll ise kendi başına ayakta durabilen bütün hareketlerini animasyon gerektirmeden fizikle hareket eden bir karakter gibi düşünebilirsiniz
Rehbere başlayalım;
Öncelikle bize 2d bir sprite(resim) lazım çöp adam olması daha iyi olur Unity'den de yapabilirsiniz ama gerek yok aşşağıda size gerekli olan şeyleri vereceğim.
Bunu istediğiniz gibi kullanabilirsiniz(eğer kendi resminizi yapacaksanız parçalar ayrı olsun eller yatay ayaklar dikey pozisyonda dursun )
Attığım resmi indirdiğinize veya kendi resminizi çizdiğinize göre Unity'e geçelim.
Resmin üzerine tıkladığınızda bazı ayarlar göreceksiniz onları bu şekilde değiştirin;
Burada yaptığımız şey bu sprite'ın tek bir resim değil bir sürü resim olduğunu belirtmek ve üstündeki blur efektini kaldırmak
Bunu yaptıktan sonra Sprite editor seçeneğine tıklayın
Bunu yaptıktan sonra karşınıza gelen ekranda "Slice" butonuna tıklayıp bir daha "slice" demek en sonunda ise "Apply" butonuna tıklayın daha sonra ise parçaların üstüne çift tıklayın ve parçalara isimlerini verin
eğer dediğim her şeyi doğru yaptıysanız bu şekilde gözükecektir;
Şimdi parçaları ayırdığımıza göre birleştirmeye geçelim öncelikle bir gameobject oluşturun ve adını Stickman koyun sonrasında parçaları onun içine atıp doğru yerlere yerleştirin
Bittiğinde böyle gözükmeli
Şimdi bu parçalara can verme zamanı kafa dışındaki parçaları "shift + leftclick" ile seçin ve "Add Component" kısmından "box collider 2d" ekleyin sonra kafaya gelin ve "circle collider ekleyin" daha sonrasında hepsini seçin ve "Rigidbody 2d" ve "Hinge Joint 2d" ekleyin
Rigidbody ve colliderlara dokunmayın.
Hinge joint 2d'nin üstüne gelin
Sonrasında her parçayı birleştirin Connected rigid body kısmında birleştirin
Üst elleri Body(vücut) ile
Alt elleri UpperArms(üst eller) ile
Üst ayaklar Body ile
Alt ayakar UpperLegs ile
Kafa Body ile
Sonra ise kafaya gelin Use limits'e tıklayın ve,
Lower angle = 20
Upper Angle = -20
Aynısını alt ellere de yapın
Sonrasında küçük noktaları bu şekilde koyun (anchorlar ve connected anchorlar)
Bunu yapmak için "Hinge joint 2d"'den Auto configure seçeneğini devre dışı bırakın ve mouse yardımı ile götürün.
Bunların hepsini yaptıysanız rehberin başında bahsettiğim gibi bir ragdoll'a sahip olacaksınız
şimdi ayakta tutmaya geldik öncelikle bunu için çok basit bir kod yazacağız
öncelikle collisionları yok sayması için bir kod yazacağız;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IgnoreCollision : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
var colliders = GetComponentsInChildren<Collider2D>();
for (int i = 0; i < colliders.Length; i++)
{
for (int k = i + 1; k < colliders.Length; k++)
{
Physics2D.IgnoreCollision(colliders, colliders[k]);
}
}
}
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "Player")
{
Physics2D.IgnoreCollision(this.gameObject.GetComponent<Collider2D>(), coll.gameObject.GetComponent<Collider2D>());
}
}
}
Bunu direk kopyalayabilirsiniz, bunu ayarlardan da yapabiliyorsunuz, şuan üstünde durduğumuz konu bu değil o yüzden direk kopyalayın ce karakterinize(Stickman) "player" tagını verin
şimdi ise karakteri dengede tutma koduna geçelim;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Balance : MonoBehaviour
{
public Rigidbody2D rb2d;
public float TargetRotation;
public float force;
void Update()
{
rb2d.MoveRotation(Mathf.LerpAngle(rb2d.rotation, TargetRotation, force * Time.fixedDeltaTime));
}
}
Kodu kısaca anlatayım;
rigidbody2d karakterimizin parçalarındaki fiziğe erişim sağlayacak.
force ise ayakta kalması için gerekli gücü verecek.
rb2d.MoveRotation(Mathf.LerpAngle(rb2d.rotation, TargetRotation, force * Time.fixedDeltaTime));
Burada girdiğimiz kod ise ne kadar güç verilmesi nereye doğru kalkması gerektiği gibi şeylerin bir ayarı
Bu kodu ise kafa, beden ve bacaklara atıyoruz
Kafanın Force kısmına 10 diğerlerinin ise 150 giriyoruz
Bunları yaptıktan sonra artık ayakta durabilen bir karakterimiz var!
Canım sıkıldığı için yazmıştım, umarım birilerine yardımcı olmuşumdur