♪이 대공에~(Unity에서) 날개를 펼쳐~날아서~ 갔다~이~아~~

13827 단어 Unity3DC#Unity
♪이 대공에~날개를 펼쳐~날아서~갔다~이~아~~

그래서 Unity(C#)로 날개를 만들고 싶습니다.

요구사항



날개를 만들기 위해서는 날개가 필요할 것입니다.
개인적으로는, 특히 활공에 매력을 느끼고 있으므로 활공도 실장합니다.

아래 조사



완전히 아마추어이므로 이론을 조금 살펴 보았습니다.
하지만 변수가 많아 Unity에서 정확하게 구현할 수 있는 생각도 하지 않았기 때문에 할리보테 간단하게 만듭니다.

외형



외형이 그것 같은 편이 즐거울 것 같기 때문에, 날개의 이미지를 찾습니다.
htps: //시게 2005. 에 xbぉg. jp/21725321/
에서 찾은 날개를 사용합니다.


본체는 왠지 녹색의 Sphere와 푸른 날개로, 이것들을 FixedJoint로 연결합니다. 단번에 그것 같은!


날개가 달리기 시작 1



날개는 공기 저항으로 날아가는 이미지이므로 날개의 공기 저항을 높이고 아래 방향으로 AddForce하면 반응으로 비행하는 것은?
→ 원래 제대로 움직이지 않고, FixedJoint의 영향으로 본체마다 아래에…

날개가 달리기 시작 2



날개의 공기 저항을 높이고 아래 방향으로 AddForce 한 후, 날개의 공기 저항을 낮추고 위 방향으로 AddForce하면 날개가 빡빡해지는 것은?
→역시 FixedJoint의 영향으로 본체마다 상하에…

날개가 달린 프로토 타입 3



공기저항으로 날아간다는 생각은 버리고, 날개의 움직임은 외형만 하면 좋을까?
→본체는 보통 AddForce에서 떠오르고 날개의 움직임을 맞추는 것으로 자연스러워졌다.
스크립트는 여기

FlapByKey
using UniRx;
using UnityEngine;

public class FlapByKey : MonoBehaviour
{

    private Rigidbody rigidBody;
    private Subject<Unit> wingUpSubject;

    public Rigidbody parentRigidBody;
    public float power;

    private Subject<Unit> wingDownSubject;
    private Subject<Unit> parentUpSubject;

    // Use this for initialization
    void Start()
    {
        wingUpSubject = new Subject<Unit>();
        wingDownSubject = new Subject<Unit>();
        parentUpSubject = new Subject<Unit>();

        rigidBody = GetComponent<Rigidbody>();
        wingUpSubject
            .ThrottleFirst(System.TimeSpan.FromMilliseconds(500f))

            .Subscribe(_ =>
            {
                rigidBody.AddForceAtPosition((transform.right.normalized + Vector3.up.normalized).normalized * 0.2f, transform.position);
                wingDownSubject.OnNext(Unit.Default);
            }
            );


        wingDownSubject
            .Delay(System.TimeSpan.FromMilliseconds(100f))
            .Subscribe(
            _ =>
            {
                rigidBody.AddForceAtPosition(Vector3.down.normalized.normalized * 0.2f, transform.position);
                parentUpSubject.OnNext(Unit.Default);


            }
            );

        parentUpSubject
            .Delay(System.TimeSpan.FromMilliseconds(200f))
            .Subscribe(_ =>
            {
                parentRigidBody.AddForceAtPosition(parentRigidBody.transform.up.normalized * power, parentRigidBody.transform.position);
            }
            );


    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.Mouse0))
        {
            wingUpSubject.OnNext(Unit.Default);
        }
    }
}



Unity에서 날아다녔다 피 c. 라고 r. 이 m/s2D9Gv5DJ7 — 35 (@v37X9D20MEGO8Nl) September 3, 2018


활공의 시작



미세한 것은 무시하고 운동 에너지 보존 법칙을 사용합니다.



v = \sqrt{2g\Delta{h}}


스크립트 여기




GlindByKey

using UnityEngine;

//羽につける用
public class GlindByKey : MonoBehaviour {
    private Rigidbody rigidBody;
    public Rigidbody parentRigidBody; //本体
    private float glindStartedY;
    private Vector3 glindStartedVelocity;

    // Use this for initialization
    void Start () {
        rigidBody = GetComponent<Rigidbody>();
    }

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

        if (Input.GetKey(KeyCode.Mouse1))
        {
            float deltaY = glindStartedY - parentRigidBody.position.y;
            if (deltaY >= 0)            
            {
                parentRigidBody.velocity = parentRigidBody.transform.forward.normalized * Mathf.Sqrt(2 * Physics.gravity.magnitude * deltaY);
            }

        }
        else
        {
            parentRigidBody.useGravity = true;
            glindStartedY = parentRigidBody.position.y;
        }
    }
}





<script async=""src="https://platform.twitter.com/widgets.js"/>

요약



현실의 거동에 충실하지 않아도 재미있네요.

이것으로 게임을 만들고 싶습니다.


좋은 웹페이지 즐겨찾기