void PullProcess() { List <GameObject> lineList = mHitPointManager.GetLineList(); List <Vector2> vecList = mHitPointManager.GetHitPointList(); Vector2 angle = Vec3ToVec2.GenVecFrom2Points(vecList[vecList.Count - 1], mStarObject.transform.position); Vector3 posInc = Time.deltaTime * mPullSpeed * new Vector3(angle.normalized.x, angle.normalized.y, 0f); mStarObject.transform.position += posInc; transform.position += posInc; lineList[lineList.Count - 1].GetComponent <LineRenderer>().SetPosition(1, mStarObject.transform.position + Vector3.back); // 反射するところに近くなったら消す if (mDestroyLineDistance > Vector2.Distance(Vec3ToVec2.GenV3ToV2(mStarObject.transform.position), vecList [vecList.Count - 1])) { vecList.RemoveAt(vecList.Count - 1); Destroy(lineList[lineList.Count - 1]); lineList.RemoveAt(lineList.Count - 1); if (vecList.Count <= 0) { ChangeMoving(); } } }
void Start() { GameObject newPrefab = Instantiate(mPrefabLine, Vector3.zero, Quaternion.identity) as GameObject; newPrefab.GetComponent <LineRenderer> ().SetPosition(0, transform.position + Vector3.back); mHitPointManager.AddLineObject(newPrefab); mHitPointManager.AddHitPoint(Vec3ToVec2.GenV3ToV2(transform.position)); }
void Preparation() { mFirstLine.enabled = true; // 角度をつける Vector3 diff = PointaToPosition.ChangeToPostion(Input.mousePosition) - transform.position; float angle = Mathf.Atan2(diff.x, diff.y); angle = Mathf.Rad2Deg * angle; // rad→角度 angle = Mathf.Clamp(angle, (-1) * mAngleLimit, mAngleLimit); transform.rotation = Quaternion.AngleAxis(angle, Vector3.back); // ガイドラインが反射する可能性を考慮 Vector2 vec2Pos = new Vector2(transform.position.x, transform.position.y); RaycastHit2D hit = Physics2D.Raycast(vec2Pos, Vec3ToVec2.GenVecFrom2Points(mTargetTrans.position, transform.position).normalized, Vec3ToVec2.CalcDistanceOn2D(transform.position, mTargetTrans.position)); // 反射したかを考えてガイドラインを表示 if (hit.collider != null) { // 一本目の線 Vector3 middle = new Vector3(hit.point.x, hit.point.y); mFirstLine.SetPosition(0, transform.position + Vector3.back); mFirstLine.SetPosition(1, middle + Vector3.back); // 二本目の線 float remainLength = Vec3ToVec2.CalcDistanceOn2D(transform.position, mTargetTrans.position) - Vec3ToVec2.CalcDistanceOn2D(transform.position, middle); Vector2 tmp = Vec3ToVec2.GenVecFrom2Points(mTargetTrans.position, transform.position).normalized; Vector3 reflectAngle = new Vector3(tmp.x * (-1), tmp.y, 0); mObjectIncludeLine.SetActive(true); mObjectIncludeLine.GetComponent <LineRenderer> ().SetPosition(0, middle + Vector3.back); mObjectIncludeLine.GetComponent <LineRenderer> ().SetPosition(1, middle + reflectAngle.normalized * remainLength); } else { mFirstLine.SetPosition(0, transform.position + Vector3.back); mFirstLine.SetPosition(1, mTargetTrans.position + Vector3.back); mObjectIncludeLine.SetActive(false); } }
public static Vector2 ToVec2(this Vector3 a, Vec3ToVec2 dir = Vec3ToVec2.xy) { switch (dir) { case Vec3ToVec2.xy: return(new Vector2(a.x, a.y)); case Vec3ToVec2.xz: return(new Vector2(a.x, a.z)); case Vec3ToVec2.yz: return(new Vector2(a.y, a.z)); case Vec3ToVec2.yx: return(new Vector2(a.y, a.x)); case Vec3ToVec2.zx: return(new Vector2(a.z, a.x)); case Vec3ToVec2.zy: return(new Vector2(a.z, a.y)); } return(new Vector2(a.x, a.y)); }