SpringJointをCoroutineで使っている。
ワイヤーアクションを作る過程でうまれた。
AnchorがAnkerになって間違っている。
JointはSetActiveとかenabledがないのでDestroyで破壊している。
対象のオブジェクトの座標のyを-3したところをめざして進む。(今回の場合はAnker)
AnkerLineはAnkerに向かって移動するオブジェクトとAnkerオブジェクトの間に生えてくる奴。
Jointを使うためAnkerオブジェクトにはRigidBodyが必要。
IsUsingInputはVertical/Horizontal Inputが0以外の時にTrueになる。
rigidBodyはこのスクリプトがアタッチされているオブジェクトのもの。
分岐はもっといいやりかたあるはず。
rigidBody.velocity = Vector3.zero;
rigidBody.angularVelocity = Vector3.zero;
の二つで慣性をなくしてる。
spring.autoConfigureConnectedAnchor = false;
やっとかないとわけわからんことになった。
IsStayinInAirはもしかしたら使うかもしれないからある。
private IEnumerator AnkerStayCoroutine()
{
Vector3 UnderAnkerPosition = Anker.transform.position - new Vector3(0, 3f, 0);
var firstHeading = Anker.transform.position - transform.position;
var firstDistance = firstHeading.magnitude;
var firstDirection = firstHeading / firstDistance;
while (!IsUsingInput)
{
IsStayingInAir = true;
var heading = UnderAnkerPosition - transform.position;
var distance = heading.magnitude;
var direction = heading / distance;
float speed = Time.deltaTime * (AnkerMoveSpeed / moveSpeed);
if(distance > 3f && !GetComponent<SpringJoint>())
{
transform.position = Vector3.MoveTowards(transform.position, UnderAnkerPosition, speed);
Debug.Log(transform.position);
}
else if(distance == 3f && !GetComponent<SpringJoint>())
{
rigidBody.velocity = Vector3.zero;
rigidBody.angularVelocity = Vector3.zero;
}
else
{
if (!GetComponent<SpringJoint>())
{
gameObject.AddComponent<SpringJoint>();
var spring = GetComponent<SpringJoint>();
spring.connectedBody = Anker.GetComponent<RigidBody>();
spring.autoConfigureConnectedAnchor = false;
spring.spring = 3f;
spring.connectedAnchor = new Vector3(0f, 30f, 0f);
spring.minDistance = 1f;
spring.maxDistance = 2f;
}
Anker.GetComponent<Rigidbody>().isKinematic = true;
}
AnkerLine.transform.localScale = new Vector3(0.1f, 0.1f, (Anker.transform.position - transform.position).magnitude);
AnkerLine.transform.position = (Anker.transform.position + transform.position) * 0.5f;
AnkerLine.transform.LookAt(Anker.transform.position);
yield return null;
}
Destroy(GetComponent<SpringJoint>());
Anker.GetComponent<RigidBody>().isKinematic = false;
Anker.SetActive(false);
AnkerLine.SetActive(false);
IsStayingInAir = false;
yield break;
}