基本的にプレイヤーとやることは同じ。
対象オブジェクトのOnCollisionを取るのがめんどくさかったので無理やりになった気がする。
UnityEventBridgeなるものがあるらしい。
変数追加。
public bool IsPointingTarget;
public bool IsMovingTarget;
float rayDistance = 100f;
public GameObject TargetGameObject;
updateにいろいろ追加。マウスの右クリックで動く。
void Update
{
if (Input.GetMouseButtonDown(1))
{
Ray ray = new Ray(transform.position, PlayerCamera.transform.forward.normalized);
RaycastHit hit;
if (IsPointingTarget)
{
if (TargetGameObject != null)
{
if (Physics.Raycast(ray, out hit, rayDistance))
{
StartCoroutine(TargetMoveCoroutine(hit.point));
Debug.Log("HitPoint =" + hit.point);
Debug.Log(hit.collider.gameObject.name);
}
else
{
StartCoroutine(TargetMoveCoroutine(ray.direction * rayDistance + ray.origin));
}
}else if(TargetGameObject == null)
{
IsPointingTarget = false;
}
}
else if (!IsPointingTarget)
{
if (Physics.Raycast(ray, out hit, rayDistance))
{
if (hit.collider.gameObject.tag == "Object")
{
StartCoroutine(PointingAnchorCoroutine(ray.origin, hit.collider.gameObject));
}
Debug.Log("HitPoint =" + hit.point);
Debug.Log(hit.collider.gameObject.name);
}
}
Debug.DrawRay(ray.origin, ray.direction * rayDistance, Color.red, 10f, false);
}
}関数追加。
一つ目。二つ目の関数が実行されているときは実行されないようにしてある(はず)。ここで対象オブジェクトにポイントする。
private IEnumerator PointingAnchorCoroutine(Vector3 firstPos,GameObject targetObject)
{
PointingAnchor.transform.position = firstPos;
PointingAnchor.SetActive(true);
PointingAnchorLine.SetActive(true);
Zippo.PlayOneShot(Zippo.clip);
IsPointingTarget = true;
TargetGameObject = targetObject;
while (!IsMovingTarget)
{
IsPointingTarget = true;
float speed = Time.deltaTime * AnchorMoveSpeed;
if (PointingAnchor.transform.position != targetObject.transform.position)
{
PointingAnchor.transform.position = Vector3.MoveTowards(PointingAnchor.transform.position, targetObject.transform.position, speed);
}
SetLine(PointingAnchorLine,targetObject.transform.position, PointingAnchor.transform.position, 0.1f);
yield return null;
}
yield break;
}
二つ目。一つ目の関数で対象オブジェクトが設定されていないと動かないはず。
private IEnumerator TargetMoveCoroutine(Vector3 target)
{
IsPointingTarget = false;
if(TargetGameObject == null)
{
yield break;
}
while ((TargetGameObject.transform.position - target).magnitude >= 1f && !IsPointingTarget)
{
IsMovingTarget = true;
float speed = Time.deltaTime * AnchorMoveSpeed;
SetLine(PointingAnchorLine, target, TargetGameObject.transform.position, 0.1f);
if (TargetGameObject.transform.position.y == 0f)
{
TargetGameObject.transform.position = Vector3.MoveTowards(TargetGameObject.transform.position, new Vector3(target.x, 0f, target.z), speed);
}
else
{
TargetGameObject.transform.position = Vector3.MoveTowards(TargetGameObject.transform.position, target, speed);
}
yield return null;
}
PointingAnchor.SetActive(false);
PointingAnchorLine.SetActive(false);
TargetGameObject = null;
IsMovingTarget = false;
yield break;
}