♪이 대공에~(Unity에서) 날개를 펼쳐~날아서~ 갔다~이~아~~
그래서 Unity(C#)로 날개를 만들고 싶습니다.
요구사항
날개를 만들기 위해서는 날개가 필요할 것입니다.
개인적으로는, 특히 활공에 매력을 느끼고 있으므로 활공도 실장합니다.
아래 조사
완전히 아마추어이므로 이론을 조금 살펴 보았습니다.
하지만 변수가 많아 Unity에서 정확하게 구현할 수 있는 생각도 하지 않았기 때문에 할리보테 간단하게 만듭니다.
외형
외형이 그것 같은 편이 즐거울 것 같기 때문에, 날개의 이미지를 찾습니다.
htps: //시게 2005. 에 xbぉg. jp/21725321/
에서 찾은 날개를 사용합니다.
본체는 왠지 녹색의 Sphere와 푸른 날개로, 이것들을 FixedJoint로 연결합니다. 단번에 그것 같은!
날개가 달리기 시작 1
날개는 공기 저항으로 날아가는 이미지이므로 날개의 공기 저항을 높이고 아래 방향으로 AddForce하면 반응으로 비행하는 것은?
→ 원래 제대로 움직이지 않고, FixedJoint의 영향으로 본체마다 아래에…
날개가 달리기 시작 2
날개의 공기 저항을 높이고 아래 방향으로 AddForce 한 후, 날개의 공기 저항을 낮추고 위 방향으로 AddForce하면 날개가 빡빡해지는 것은?
→역시 FixedJoint의 영향으로 본체마다 상하에…
날개가 달린 프로토 타입 3
공기저항으로 날아간다는 생각은 버리고, 날개의 움직임은 외형만 하면 좋을까?
→본체는 보통 AddForce에서 떠오르고 날개의 움직임을 맞추는 것으로 자연스러워졌다.
스크립트는 여기
FlapByKeyusing 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
활공의 시작
완전히 아마추어이므로 이론을 조금 살펴 보았습니다.
하지만 변수가 많아 Unity에서 정확하게 구현할 수 있는 생각도 하지 않았기 때문에 할리보테 간단하게 만듭니다.
외형
외형이 그것 같은 편이 즐거울 것 같기 때문에, 날개의 이미지를 찾습니다.
htps: //시게 2005. 에 xbぉg. jp/21725321/
에서 찾은 날개를 사용합니다.
본체는 왠지 녹색의 Sphere와 푸른 날개로, 이것들을 FixedJoint로 연결합니다. 단번에 그것 같은!
날개가 달리기 시작 1
날개는 공기 저항으로 날아가는 이미지이므로 날개의 공기 저항을 높이고 아래 방향으로 AddForce하면 반응으로 비행하는 것은?
→ 원래 제대로 움직이지 않고, FixedJoint의 영향으로 본체마다 아래에…
날개가 달리기 시작 2
날개의 공기 저항을 높이고 아래 방향으로 AddForce 한 후, 날개의 공기 저항을 낮추고 위 방향으로 AddForce하면 날개가 빡빡해지는 것은?
→역시 FixedJoint의 영향으로 본체마다 상하에…
날개가 달린 프로토 타입 3
공기저항으로 날아간다는 생각은 버리고, 날개의 움직임은 외형만 하면 좋을까?
→본체는 보통 AddForce에서 떠오르고 날개의 움직임을 맞추는 것으로 자연스러워졌다.
스크립트는 여기
FlapByKeyusing 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
활공의 시작
날개는 공기 저항으로 날아가는 이미지이므로 날개의 공기 저항을 높이고 아래 방향으로 AddForce하면 반응으로 비행하는 것은?
→ 원래 제대로 움직이지 않고, FixedJoint의 영향으로 본체마다 아래에…
날개가 달리기 시작 2
날개의 공기 저항을 높이고 아래 방향으로 AddForce 한 후, 날개의 공기 저항을 낮추고 위 방향으로 AddForce하면 날개가 빡빡해지는 것은?
→역시 FixedJoint의 영향으로 본체마다 상하에…
날개가 달린 프로토 타입 3
공기저항으로 날아간다는 생각은 버리고, 날개의 움직임은 외형만 하면 좋을까?
→본체는 보통 AddForce에서 떠오르고 날개의 움직임을 맞추는 것으로 자연스러워졌다.
스크립트는 여기
FlapByKeyusing 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
활공의 시작
공기저항으로 날아간다는 생각은 버리고, 날개의 움직임은 외형만 하면 좋을까?
→본체는 보통 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"/>Unity에서 활공해 보았다 피 c. 라고 r. 이 m/Gbn xwlQVC
— 35 (@v37X9D20MEGO8Nl) September 8, 2018
요약
현실의 거동에 충실하지 않아도 재미있네요.
이것으로 게임을 만들고 싶습니다.
Reference
이 문제에 관하여(♪이 대공에~(Unity에서) 날개를 펼쳐~날아서~ 갔다~이~아~~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/unifar/items/fdab17a9f2b783c791ac텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)