/// <summary> /// 穴に落ちて消える /// </summary> /// <param name="star">星</param> private void FallHoleAndDestory(GameObject star) { // 惑星と星の距離 Vector3 range = planet.transform.position - star.transform.position; // 正規化する range.Normalize(); // レイの中点 Vector3 original = star.transform.position; // レイの向き Vector3 direction = range; // レイの長さ float length = (_Date.SmallStarRadius * 2) * 2; // レイを作成する Ray ray = new Ray(original, direction); // レイを可視化する //Debug.DrawRay(ray.origin, ray.direction, Color.white, 10.0f); // レイが当たったオブジェクトの情報 RaycastHit hit; // レイとオブジェクトの当たり判定 if (!Physics.Raycast(ray, out hit, length)) { // 惑星の穴の奥まで落ちる設定をする star.GetComponent <StarDate>().IsFallHole = true; } else { // 石もしくは木の種類に当たった場合オブジェクトを消す if ((hit.collider.tag == "Tree") || (hit.collider.tag == "Rock")) { Destroy(star); } else { // 星のデータ StarDate stardate = star.GetComponent <StarDate>(); // 音を鳴らす if (stardate.IsSound_HitPlanet) { // プレイヤーと星の距離を求める float len = Vector3.Distance(player.transform.position, star.transform.position); // 星が画面内に存在する場合 if (len < _Date.Sound_PlayerStarDirection) { // 音を鳴らす SoundManager.Instance.PlaySe("StarHitPlanet"); } // 音が鳴らないように設定する stardate.IsSound_HitPlanet = false; } } } }
/// <summary> /// 星を配置する /// </summary> /// <param name="star">星</param> private void SetPosition(GameObject star) { // 星のデータ StarDate starDate = star.GetComponent <StarDate>(); // XZ軸方向に進む角度をデグリーからラジアンに変換 float XZradian = starDate.DegreeXZ * Mathf.Deg2Rad; // Y軸方向に進む角度をデグリーからラジアンに変換 float Yradian = starDate.DegreeY * Mathf.Deg2Rad; // 現在の星と惑星の距離 float radius = starDate.Range; // 星の位置 Vector3 starpos = new Vector3(radius * Mathf.Cos(Yradian) * Mathf.Sin(XZradian), radius * Mathf.Sin(Yradian), radius * Mathf.Cos(Yradian) * Mathf.Cos(XZradian)); #if false // [現在の星の位置] = [惑星の位置] + [星の位置] star.transform.position = planet.transform.position + starpos; #else // 星が動く距離 Vector3 dircmove = starpos - starDate.OncePos; star.transform.Translate(dircmove); // 以前の星の位置をもらう starDate.OncePos = starpos; #endif }
/// <summary> /// 光を星に向かせる /// </summary> private void FaceLightStar() { // 光を惑星に向かせる foreach (GameObject star in GameObject.FindGameObjectsWithTag(_Date.StarTag)) { // 星のデータ StarDate starDate = star.GetComponent <StarDate>(); // [星のオブジェクト]の子に[光のオブジェクト]が含まれている foreach (Transform child in star.transform) { // 光のデータ Light light = child.GetComponent <Light>(); // 光のデータが存在している場合 if (light != null) { // 星と惑星の距離と向き Vector3 range = planet.transform.position - star.transform.position; // その向きを正規化する range.Normalize(); // 光を回転する light.transform.localRotation = Quaternion.LookRotation(range); // 光の位置をずらす light.transform.position = star.transform.position - range * 20;//仮:20 } } } }
public void TimeStartsAtYearZero() { var startYear = new StarDate(); var yearZero = new StarDate(0, 0); Assert.Equal(yearZero, startYear); }
/// <summary> /// 轉換where條件 by 西元年日期 /// </summary> /// <param name="dtStart">開始日期</param> /// <param name="dtEnd">結束日期</param> /// <param name="columnName">欄位行稱</param> /// <param name="formatDate">格式化日期 傳入 yyyy/MM/dd 這種</param> /// <param name="where">ref SqlParameters</param> public void appendCriteriaDate(string dtStart, string dtEnd, string columnName, string formatDate, ref string where) { if (string.IsNullOrEmpty(dtStart) && string.IsNullOrEmpty(dtEnd)) { return; } DateTime StarDate; DateTime EndDate; DateTime tempDate; //判斷是否為日期格式 DateTime.TryParse(dtStart, out StarDate); DateTime.TryParse(dtEnd, out EndDate); if (!string.IsNullOrEmpty(dtStart) && !string.IsNullOrEmpty(dtEnd)) { if (StarDate.CompareTo(EndDate) == 1) //前後日期大小轉換 { tempDate = StarDate; StarDate = EndDate; EndDate = tempDate; } where += string.Format(" AND {0} between '{1}' and '{2}'", columnName, StarDate.ToString(formatDate), EndDate.ToString(formatDate)); } else if (string.IsNullOrEmpty(dtEnd)) { where += string.Format(" AND {0} >= '{1}'", columnName, StarDate.ToString(formatDate)); } else if (string.IsNullOrEmpty(dtStart)) { where += string.Format(" AND {0} <= '{1}'", columnName, EndDate.ToString(formatDate)); } }
// ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー /// <summary> /// 星を作成する /// </summary> private void CreateMain(Kind starkind) { // 星のデータが存在していない場合は何もしない if (starPrefab == null) { return; } // 星を新しく作成する GameObject newstar = Instantiate(starPrefab) as GameObject; // 星のオブジェクトを1箇所にまとめる newstar.transform.parent = starParentObj.transform; // 星のデータ StarDate starDate = newstar.GetComponent <StarDate>(); // 星の種類 starDate.StarKind = starkind; // 回って落ちる星 if (starkind == Kind.MOVEANDFALL) { // 星が宇宙上に動く時間 starDate.TimeMove = Random.Range(_Date.TimeMove_Miu, _Date.TimeMove_Max); // 星が宇宙から惑星に落ちる時間 starDate.TimeFalling = Random.Range(_Date.TimeFall_Miu, _Date.TimeFall_Max); } // 回って落ちる星 もしくは すぐに落ちる星 if (starkind == Kind.MOVEANDFALL || starkind == Kind.JUSTFALL) { // 星が惑星上に滞在する時間 starDate.TimeState = Random.Range(_Date.TimeState_Miu, _Date.TimeState_Miu); } // 星と惑星の距離 と 現在の星と惑星の距離 starDate.Direction = starDate.Range = Random.Range(_Date.Direction_Miu, _Date.Direction_Max); // 1フレームに縮む半径の長さを求める starDate.RadiusShrinkage = (starDate.Direction - _Date.BigStarRadius) / (float)starDate.TimeFalling; // 1フレームにX軸(もしくはZ軸)に進む角速度 starDate.AngularVelocity_DegreeXZ = Random.Range(_Date.DegreeXZ_Miu, _Date.DegreeXZ_Max); //1.0f // 1フレームにY軸に進む角速度 starDate.AngularVelocity_DegreeY = Random.Range(_Date.DegreeXZ_Miu, _Date.DegreeXZ_Max); //3.0f // 現在X軸(もしくはZ軸)による角度 starDate.DegreeXZ = Random.Range(0, 360); // 現在Y軸による角度 starDate.DegreeY = Random.Range(0, 360); // 名前を変える starDate.name = (starkind == Kind.ALWAYSMOVE) ? "TheStarAlwaysMove" : (starkind == Kind.MOVEANDFALL) ? "TheStarMoveAndFall": "TheStarJustFall"; // 星を配置する SetPosition(newstar); }
public void XPlusNonZeroIsNotX() { var start = new StarDate(); var one = new Duration(0, 1); StarDate future = start + one; Assert.NotEqual(start, future); }
public void XPlusZeroEqualsX() { var start = new StarDate(); var zero = new Duration(0, 0); StarDate same = start + zero; Assert.Equal(start, same); }
public void YearHasTenMonths() { var start = new StarDate(1, 9); var oneMonth = new Duration(0, 1); var expected = new StarDate(2, 0); StarDate future = start + oneMonth; Assert.Equal(expected, future); }
public void ItAddsUp() { var start = new StarDate(); var delta = new Duration(0, 2); var expected = new StarDate(0, 2); StarDate future = start + delta; Assert.Equal(expected, future); }
/// <summary> /// 円に沿って星が動く /// </summary> private void ParallelToCircle(GameObject star) { // 星のデータ StarDate starDate = star.GetComponent <StarDate>(); // XZ軸方向に進む starDate.DegreeXZ += starDate.AngularVelocity_DegreeXZ; // Y軸方向に進む starDate.DegreeY += starDate.AngularVelocity_DegreeY; // 星を配置する SetPosition(star); }
/// <summary> /// 投げられた星が地面に当たって消える /// </summary> public void ThrowAndDleate() { // 複数の星を探す GameObject[] stars = GameObject.FindGameObjectsWithTag(date.StarTag); // 一つ一つの星 foreach (GameObject star in stars) { // 星のデータ StarDate stardate = star.GetComponent <StarDate>(); // 指定された星が投げられ地面に接触した場合、星を消す if ((stardate.IsThrow) && (HitStarPlanet(star))) { // エフェクトを作成する GameObject newEffect = Instantiate(effectPrefab_starhitplanet, Vector3.zero, Quaternion.identity) as GameObject; // エフェクトに名前を付ける newEffect.name = "Effect_StarHitPlanet"; // 位置や向きを決める newEffect.GetComponent <StarEffect_HitPlanet>().DecideDirection(star, planet); // ---------------------------------------------------------------------------------------------------------------- // 惑星上に光るスポットライトを作成する GameObject newSpotLight = Instantiate(Star_SpotLight, Vector3.zero, Quaternion.identity) as GameObject; // そのライトに名前を付ける newSpotLight.name = "ThrowStar_SpotLight"; // 位置や向きを決める DecideDirection(newSpotLight, star, planet); // ---------------------------------------------------------------------------------------------------------------- // 星を消す Destroy(star); } } }
void InstanceThrowStar(Vector3 targetPos) { GameObject star = Instantiate(starPrefab); // 追加-------------------------------------------------------- // 星のデータ StarDate stardate = star.GetComponent <StarDate>(); // 星を投げるフラグを付ける stardate.IsThrow = true; //-------------------------------------------------------------- Vector3 pos = this.transform.position + this.transform.right; star.transform.position = pos; Vector3 vec = targetPos - pos; star.GetComponent <Rigidbody>().velocity = vec.normalized * speed; Debug.Log(vec.normalized * speed); }
/// <summary> /// 星が動く /// </summary> private void Move() { // 複数の星を呼ぶ foreach (GameObject star in GameObject.FindGameObjectsWithTag(_Date.StarTag)) { // 星のデータ StarDate starDate = star.GetComponent <StarDate>(); // 惑星の穴の奥まで進まない場合 if (!starDate.IsFallHole) { // 星の生存時間 float startime = starDate.Time; // 星が宇宙上に動く時間 float timeMove = starDate.TimeMove; // 星が宇宙上に動き始めてから惑星上に落ちるまでの時間 float timeMoveFalling = timeMove + starDate.TimeFalling; // 星が宇宙上に動き始めてから惑星上に生存するまでの時間 float timeMoveState = timeMoveFalling + starDate.TimeState; // 星が宇宙上に動き始めてから惑星上に落ちるまで もしくは 永遠に消えない星 if (((starDate.StarKind == Kind.MOVEANDFALL) && (startime < timeMoveFalling)) || (starDate.StarKind == Kind.ALWAYSMOVE)) { // 円に沿って星が動く ParallelToCircle(star); // 星が落ち始める準備 かつ 今後消える星 if ((startime >= timeMove) && (starDate.StarKind == Kind.MOVEANDFALL)) { // 1フレームに星の軌道が縮む半径 ※1秒間にRadiusShrinkage分縮む float radius = starDate.RadiusShrinkage * Time.deltaTime; // 星が軌道する半径を縮む starDate.Range -= radius; } } else // すぐに惑星上に落ちる星 if (starDate.StarKind == Kind.JUSTFALL) { // 星と惑星の距離 Vector3 range = star.transform.position - planet.transform.position; // 星と惑星の長さ float length = range.magnitude; // 惑星の半径の長さ float radius = _Date.BigStarRadius; if (length > radius) { // 距離を正規化する range.Normalize(); // 移動する star.transform.position += -range; } else { // 星が穴に落ちて消すか判断する FallHoleAndDestory(star); } } // 星が穴に落ちて消すか判断する if (((startime > timeMoveFalling) && (starDate.StarKind == Kind.MOVEANDFALL))) { FallHoleAndDestory(star); } // 星を消す if ((startime > timeMoveState) && ((starDate.StarKind == Kind.MOVEANDFALL) || (starDate.StarKind == Kind.MOVEANDFALL))) { Destroy(star); } else { // 星の生存時間を計る starDate.Time += Time.deltaTime; } } else // 小さい星が惑星の穴の奥まで進む { // 星と惑星の距離 Vector3 range = planet.transform.position - star.transform.position; range.Normalize(); // 長さ float length = (_Date.SmallStarRadius * 2) * 2; // 小さい星が進む star.transform.position += range; // レイが当たったオブジェクトの情報 RaycastHit hit; // レイとオブジェクトの当たり判定 if (Physics.Raycast(new Ray(star.transform.position, range), out hit, length)) { Destroy(star); } } } }
public WakePoint(StarDate time, Position position) { Time = time; Position = position; }
/// <summary> /// Returns the stardate as a string with two decimal places /// </summary> /// <returns>Approximate string representation of stardate</returns> /// <remarks>Saves you some work, and gives you the date as it would normally be spoken.</remarks> public override string ToString() { return(StarDate.ToString("F2")); }