[Unity(C#)] 물고기를 자유롭게 움직여 보세요.

물고기 물고기


네, Asset 좀 가르쳐 주세요.
장어리
왜냐하면 처음부터 수영 애니메이션이 있었어요.
イワシのRigidbody.velocity = this.gameObject.transform.forward;
이렇게 앞으로 가면 수영하는 느낌이 든다.

무작위 방향


이번에는 AddTorque로 방향을 바꾸고 싶습니다.
유니티 도장을 참고했습니다.
Youtube
영상에도 있어요.
AddTorque(회전력)는 중첩되더라도 깨지지 않습니다.
물론 원하는 동작을 하기 위해서는 회전력을 조정하고 중첩해야 한다
"X축에 회전력을 가하는 과정에서 Z축을 가하는 회전력을 중첩"
"X축의 양방향 회전력은 X축의 음방향 회전력에 의해 상쇄됩니다."
이런 일도 가능하다.(틀리면 지적하십시오.)

프레젠테이션


실제 합성 Torque 프레젠테이션은 여기 있습니다.
붉은 선은 정어리의 궤적이다.

처음 방향을 바꿨을 때.
왼쪽으로 AddTorque를 동시에 진행하고 아래로 AddTorque를 동시에 진행합니다.

Script


연습하는 김에 UniRx로 설치했어요.
사용법을 기억하고 싶을 뿐 특별한 의미는 없다.
using UniRx;
using UnityEngine;
using System;

public class MoveIwashi : MonoBehaviour
{
    [SerializeField]
    float speed = 0.3f;

    [SerializeField]
    float rotationSpeed = 0.01f;

    [SerializeField]
    float rotation_Interval = 3;

    Rigidbody iwasirigid;

    void Start()
    {
        iwasirigid = GetComponent<Rigidbody>();

        Observable.Timer(TimeSpan.FromSeconds(rotation_Interval))
            .Repeat()
            .Subscribe(_ =>
            {
                int count = UnityEngine.Random.Range(0, 6);
                print(count);
                if (count == 0)
                {
                    //左向き、下向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.down * rotationSpeed, ForceMode.Impulse);
                    iwasirigid.AddTorque(Vector3.right * rotationSpeed, ForceMode.Impulse);
                }
                else if (count == 1)
                {
                    //右向き、下向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.up * rotationSpeed, ForceMode.Impulse);
                    iwasirigid.AddTorque(Vector3.right * rotationSpeed, ForceMode.Impulse);

                }
                else if (count == 2)
                {
                    //左向き、上向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.down * rotationSpeed, ForceMode.Impulse);
                    iwasirigid.AddTorque(Vector3.left * rotationSpeed, ForceMode.Impulse);
                }
                else if(count == 3)
                {
                    //右向き、上向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.up * rotationSpeed, ForceMode.Impulse);
                    iwasirigid.AddTorque(Vector3.right * rotationSpeed, ForceMode.Impulse);
                }
                else if(count == 4)
                {
                    //右向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.up * rotationSpeed, ForceMode.Impulse);
                }
                else if(count == 5)
                {
                    //左向きにトルクをかける
                    iwasirigid.AddTorque(Vector3.down * rotationSpeed, ForceMode.Impulse);
                }
            })
            .AddTo(this);

    }


    void Update()
    {
        //前に進む
        iwasirigid.velocity = this.gameObject.transform.forward * speed;

        //外積で元に戻す X軸方向
        Vector3 left = this.gameObject.transform.TransformVector(Vector3.left);
        Vector3 hori_left = new Vector3(left.x, 0, left.z).normalized;
        iwasirigid.AddTorque(Vector3.Cross(left, hori_left) * 4, ForceMode.Force);

        //外積で元に戻す Z軸方向
        Vector3 forward = this.gameObject.transform.TransformVector(Vector3.forward);
        Vector3 hori_forward = new Vector3(forward.x, 0, forward.z).normalized;
        iwasirigid.AddTorque(Vector3.Cross(forward, hori_forward) * 4, ForceMode.Force);

    }
}

외적에 따라 수평으로 되돌아오다


이번에 유니티 도장의 애니메이션에서도 소개된 외적을 이용했다.
회전할 때 물고기가 뒤집히지 마세요.
외적에 따라 계산하고 수평을 유지하는 회전력을 가하다.
단지 수준을 유지하고 싶다면 외적을 사용하지 않아도 Rigidbody 설정에서 진행할 수 있다.
고정하려는 Freezerotation 축을 선택하면 됩니다.

이번에는 각도를 바꾸면서 자유롭게 움직여서 수평으로 돌아가고 싶어요.
외적을 이용하다.
회전력을 조절하면 이미지 오른쪽처럼 흔들흔들 움직일 수도 있다.

AngularDrag


AngularDrag를 조정하여 수평으로 자연스럽게 되돌립니다.

AngularDrag는 말 그대로 각도에 대한 저항력입니다.
만약 여기가 0이라면, 각도에 가해진 힘은 영원히 사라지지 않고 계속 회전할 것이다.

마지막


조사를 마치고 나서야 정어리가 유유히 헤엄치지 않는다는 것을 알아차렸다.
정어리가 수영을 어떻게 하든 마음속으로는 상관없기 때문에 이렇게 공개하기로 했다.
이번에 사용한 Add Torque와 외적 등을 조합하면...
흔들리는 동작과 방향 전환은 간단하게 재현할 수 있으니 꼭 시도해 보세요.
그리고 저 같은 초보자 수준이라면 유니티 도장이 정말 도움이 될 거예요.
초보자는 가벼운 마음으로 엿보는 것을 권장한다.

좋은 웹페이지 즐겨찾기