/// <summary> /// フェードアウト用コルーチン /// </summary> protected IEnumerator FadeOutCoroutine(float fadeTime) { if (label) { flagFade = true; float measureTime = fadeTime; while (true) { yield return(0); measureTime -= Time.deltaTime; float alpha = measureTime / fadeTime; //透明度設定 label.color = FuncBox.SetColorAlpha(label.color, alpha); if (measureTime < 0) { break; } //物理風挙動 if (flagPhysics) { Vector3 translate = new Vector3(xMove, yForce, 0f); transform.position += translate * Time.deltaTime; yForce -= gravity * Time.deltaTime; } } label.color = FuncBox.SetColorAlpha(label.color, 0f); flagFade = false; //無効にする gameObject.SetActive(false); } }
/// <summary> /// ターゲッティング /// </summary> protected void Targeting() { if (targets.Count <= 0) { return; } //ターゲットの作るバウンディングボックスを求める Vector3 min, max, pos; min = max = pos = targets[0].transform.position; for (int i = 1; i < targets.Count; i++) { pos = targets[i].transform.position; //x if (min.x > pos.x) { min.x = pos.x; } else if (max.x < pos.x) { max.x = pos.x; } //y if (min.y > pos.y) { min.y = pos.y; } else if (max.y < pos.y) { max.y = pos.y; } } //カメラ位置 Vector3 cameraPos; float width = 0f, height = 0f; if (targets.Count == 1) { cameraPos = pos; width = height = defaultSize; } else { width = (max.x - min.x) * 0.5f; height = (max.y - min.y) * 0.5f; cameraPos = new Vector3(min.x + width, min.y + height); } cameraPos.z = camera.transform.position.z; camera.transform.position = FuncBox.Vector3Lerp(camera.transform.position, cameraPos, 5 * Time.deltaTime); //カメラサイズ targetSize = (width < height ? height : width) * spacePar; if (targetSize < minSize) { targetSize = minSize; } }
/// <summary> /// エフェクトの生成 /// </summary> private void EmitEffect(ParticleSystem particle, Vector2 p1, Vector2 p2, float density) { if (!particle) { return; } //方向と距離の取得 Vector2 dir = p2 - p1; float dis = dir.magnitude; dir.Normalize(); //エフェクトの生成 float tempDis = 0f; do { particle.Emit( p1 + dir * tempDis, //座標 FuncBox.RandomVector2() * speed, //速度 UnityEngine.Random.Range(width * 0.8f, width), //大きさ UnityEngine.Random.Range(0.2f, 1f), //時間 color //色 ); tempDis += density; } while (tempDis < dis); particle.Emit( p1 + dir * dis, //座標 FuncBox.RandomVector2() * speed, //速度 UnityEngine.Random.Range(width * 0.8f, width), //大きさ UnityEngine.Random.Range(0.2f, 1f), //時間 color //色 ); }
/// <summary> /// 頂点Push処理 /// </summary> protected void PushVertex() { Vector3 p = FuncBox.GetMousePoint(targetCamera); if (grid.WorldToGridCrossPosition(out p, p)) { //頂点の数が2つ以下(三角形を作れる最低の頂点数) Push(p); if (posList.Count > 2) { //始点と終点が同じか if (ContainStartEndPos()) { //イベント送信(被っている終点を取り除いてから) Vector3 pos = Pop(); if (target) { target.SendMessage(functionName, posList, SendMessageOptions.DontRequireReceiver); } if (flagGridEndWithReset) { OnReset(); } else { Push(pos); } } } } }
/// <summary> /// 設定ファイル読み込み /// </summary> protected void ReadSettingFile() { string path = Application.streamingAssetsPath + "/" + settingFile; //ファイル確認 if (!File.Exists(path)) { return; } string line; using (TextReader r = FuncBox.GetTextReader(path)) { while ((line = r.ReadLine()) != null) { switch (line) { case "<BGMVolume>": bgmVolume = float.Parse(r.ReadLine()); break; case "<SEVolume>": seVolume = float.Parse(r.ReadLine()); break; case "<End>": return; } } } }
protected List <ToolBox.Stage> ReadStageList(string folderPath) { if (!Directory.Exists(folderPath)) { return(null); } //読み込み var list = new List <ToolBox.Stage>(); string[] fileList; //folderPath以下にあるファイルリスト(メタデータは抜く) string fileName; fileList = Directory.GetFiles(folderPath); for (int i = 0; i < fileList.Length; i++) { fileName = Path.GetFileName(fileList[i]); //拡張子が3つ = メタデータ if (fileName.Split('.').Length != 3) { fileList[i] = folderPath + "/" + fileName; Debug.Log(folderPath + "/" + fileName); list.Add(ToolBox.Stage.Read(FuncBox.GetTextReader(fileList[i]))); } } return(list); }
//割り当てる(一括) public Dictionary <GameObject, int> GetMarker(List <Vector3> posList, GameObject target, string functionName, float z = 0f) { var gDic = new Dictionary <GameObject, int>(); int j = 0; for (int i = 0; i < posList.Count; i++) { UIButtonMessage g = null; for (; j < prefabPool.Count; j++) { if (!prefabPool[j].gameObject.activeInHierarchy) { g = prefabPool[j]; break; } } if (g) { g.gameObject.SetActive(true); g.transform.localScale = Vector3.one; var pos = FuncBox.ViewPointTransform(worldCamera, posList[i], uiCamera); pos.z = z; g.transform.position = pos; g.target = target; g.functionName = functionName; gDic.Add(g.gameObject, i); } } return(gDic); }
//パラメータセット public virtual void SetParameter(GameObject owner, float velocity, float damage, float barrelBonus, float caliberBonus, Color color) { //持ち主設定 this.owner = owner; //パラメータ設定 this.velocity = velocity; this.damage = damage; this.barrelBonus = barrelBonus; this.caliberBonus = caliberBonus; //色設定 sprite.color = color; //軌跡エフェクト生成 if (trailEffectPrefab) { GameObject trail = (GameObject)Instantiate(trailEffectPrefab); trail.transform.parent = transform; trail.transform.localPosition = Vector3.zero; trailEffect = trail.GetComponent <ParticleSystem>(); if (trailEffect) { trailEffect.startColor = FuncBox.SetColorAlpha(color, 0.75f); } trail.AddComponent <ParticleEndWithDestroy>(); } //ボーナス効果設定 SetBonusEffect(); }
/// <summary> /// クイックブースト /// </summary> public void QuickBoost() { if (BreakCheck()) { return; } //現在の速度の方向を確認 float nowAngle = FuncBox.TwoPointAngleD(Vector3.zero, transform.right); float velocityAngle = FuncBox.TwoPointAngleD(Vector3.zero, rBody.velocity); float diff = Mathf.Abs(Mathf.DeltaAngle(nowAngle, velocityAngle)); //差が一定以上なら速度をほぼにする if (diff >= 45f) { rBody.velocity *= 0.2f; } Vector3 v = transform.right * quickBoostOutput; //移動量 float e = quickBoostEnergy; //使用エネルギー if (!AddVelocity(v, e)) { return; } //エフェクト IndicateQuickBoostEffect(true); }
/// <summary> /// パスを指定してウェーブエネミー情報を読み込み /// </summary> public void ReadWaveInfo(string filePath) { waveInfoList = new List <List <WaveEnemyInfo> >(); if (!File.Exists(filePath)) { return; } //読み込み using (TextReader r = FuncBox.GetTextReader(filePath)) { string line = ""; string[] split; List <WaveEnemyInfo> enemyInfoList = new List <WaveEnemyInfo>(); //ファイル走査 while ((line = r.ReadLine()) != null) { split = line.Split(','); if (split[0] == "<Wave>") { enemyInfoList = new List <WaveEnemyInfo>(); waveInfoList.Add(enemyInfoList); } else { Debug.Log(split[0]); enemyInfoList.Add(WaveEnemyInfo.ReadString(split)); } } } }
protected void Update() { if (flagRandom) { rotateVector = FuncBox.Vector3Lerp(rotateVector, targetAngle, t * Time.deltaTime); } transform.Rotate(rotateVector * rotatevelocity * Time.deltaTime); }
/// <summary> /// ランキングレコードを書き込む /// </summary> public void WriteRankingRecords(string filePath) { using (TextWriter w = FuncBox.GetTextWriter(filePath)) { for (int i = 0; i < _rankingRecords.Count; i++) { w.WriteLine(_rankingRecords[i].GetWriteString()); } } }
//始点からの角度を求める(スワイプ中のみ) public float GetAngle() { if (flagSwipe) { return(FuncBox.TwoPointAngleD(currentPosition, startPosition)); } else { return(-1f); } }
/// <summary> /// 頂点を動かす(マウス) /// </summary> public void MoveVertex(int index) { if (0 <= index || index < posList.Count) { var p = FuncBox.GetMousePoint(targetCamera); if (grid.WorldToGridCrossPosition(out p, p)) { posList[index] = p; } } }
/// <summary> /// 機体の有効化 /// </summary> protected void Activate_Ship(ToolBox.ShipData shipData) { //機体パーツを結合したMeshを取得 Mesh m = shipData.GetConnectedMesh(); FuncBox.SetMesh(gameObject, m, gm.shipMaterial); //半径を求める Vector3 size = m.bounds.size / 2f; Vector3 center = FuncBox.Vector3Abs(m.bounds.center); collisionRadius = Vector3.Distance(Vector3.zero, center + size); }
/// <summary> /// 方向表示の更新 /// </summary> protected void UpdateDirectionIndicator() { //自身の playerDirection.transform.eulerAngles = player.transform.eulerAngles; //ロック対象の if (player.lockObject) { Vector3 angles = Vector3.zero; angles.z = FuncBox.TwoPointAngleD(player.transform.position, player.lockObject.transform.position); lockObjectDirection.transform.eulerAngles = angles; } }
private void Test_Click(object sender, RoutedEventArgs e) { if (FuncBox.IsPlaceholderNow()) { MessageBox.Show("Сначала введите функцию в поле ввода.", "Невозможно провести тест!"); return; } if (Compiler.CompileMathFunc(FuncBox.Text) is var f && f != null) { MessageBox.Show("Функция работоспособна.", "Успешный тест!"); } }
/// <summary> /// 新しいターゲットの設定 /// </summary> protected void SetNewTarget(GameObject newTarget) { //ターゲットにイベント送信 FuncBox.Notify(nowTarget, "OnHover", false); //ターゲット切り替え if (newTarget) { nowTarget = newTarget; } //ターゲットにイベント送信 FuncBox.Notify(nowTarget, "OnHover", true); }
/// <summary> /// 入力確認 /// </summary> private void CheckInput() { if (cam == null) { return; } Vector3 mousePos = FuncBox.GetMousePosition(cam); //スナップ判定 bool snaped = false; if (additionalLine != null) { Vector2 snapPos; if (additionalLine.Snap(mousePos, out snapPos)) { mousePos = snapPos; snaped = true; draw = true; } } //頂点追加 if (Input.GetMouseButtonDown(addButton)) { draw |= AddVertex(mousePos); if (additionalLine != null && snaped) { additionalLine.SnapCallback(); } } //頂点削除 if (Input.GetMouseButtonDown(removeButton)) { draw |= RemoveAtLastVertex(); } //マウスの移動量 Vector2 md = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); if (md.magnitude > MDEPSILON) { draw |= UpdateNoticeLine(mousePos); } //全消し if (Input.GetKeyDown(clearButton)) { FlushVertices(); } }
/// <summary> /// マウス移動処理 /// </summary> protected void OnMouseMove() { var p = FuncBox.GetMousePoint(targetCamera); if (grid.WorldToGridCrossPosition(out p, p)) { Push(p); //ラインレンダラに座標を設定 line.CreateLine(posList); //FuncBox.SetLineRenderer(lineRenderer, posList, true); Pop(); } }
/// <summary> /// アイテムをランダムに複数生成する /// </summary> public void InstantiateRandomItem(Vector3 pos, int num) { float angle = 360f / (float)num; for (int i = 0; i < num; i++) { int randNum = Random.Range(0, dropItemList.Length); GameObject g = Instantiate(dropItemList[randNum]); g.transform.parent = transform; g.transform.position = pos; Rigidbody r = g.GetComponent <Rigidbody>(); r.AddForce(FuncBox.DegreeToVector3(angle * i) * 1000f); } }
protected void Update() { if (measureTime > 0) { measureTime -= Time.deltaTime; //徐々に透明に sprite.color = FuncBox.SetColorAlpha(sprite.color, measureTime / time); if (measureTime <= 0) { Destroy(gameObject); return; } } }
protected override void SubUpdate() { base.SubUpdate(); subUpdateCount++; //数回に一度行う if (Random.Range(2, 5) == subUpdateCount) { //ランダムな方向を向いてクイックブースト Vector3 randDir = FuncBox.GetRandomVector2(-1, 1); ship.MoveAngle(randDir); ship.QuickBoost(); //カウントを0に subUpdateCount = 0; } }
/// <summary> /// 図形の総面積を求める /// </summary> public float GetTotalSize() { float total = 0; float size = 0; for (int i = 0; i < triangles.Length; i += 3) { size = FuncBox.TriangleSize(vertices[triangles[i + 0]].vertex, vertices[triangles[i + 1]].vertex, vertices[triangles[i + 2]].vertex); total += size; } //裏表貼っているので半分にする return(totalSize = total * 0.5f); }
public MainWindow() { InitializeComponent(); FuncBox.SetPlaceholder("Введите вашу функцию здесь..."); A_Box.SetPlaceholder("0"); A_Box.AllowOnlyDouble(); B_Box.SetPlaceholder("10"); B_Box.AllowOnlyDouble(); PointerBox.SetPlaceholder("0.25"); PointerBox.AllowOnlyDouble(); }
/// <summary> /// 機体マーカーの更新 /// </summary> protected void UpdateShipMarker() { if (flagLongRange) { Vector3 pos = FuncBox.ViewPointTransform(playerCamera.camera, player.transform.position, uiCamera); shipMarker.transform.position = pos; shipMarker.transform.eulerAngles = player.transform.eulerAngles; if (player.lockObject) { pos = FuncBox.ViewPointTransform(playerCamera.camera, player.lockObject.transform.position, uiCamera); lockObjectMarker.transform.position = pos; lockObjectMarker.transform.eulerAngles = player.lockObject.transform.eulerAngles; } } }
/// <summary> /// 設定ファイル書き込み /// </summary> protected void WriteSettingFile() { string path = Application.streamingAssetsPath + "/" + settingFile; using (TextWriter w = FuncBox.GetTextWriter(path)) { //書き込み文字列の生成 StringBuilder sb = new StringBuilder(); sb.AppendLine("<BGMVolume>"); sb.AppendLine(bgmVolume.ToString()); sb.AppendLine("<SEVolume>"); sb.AppendLine(seVolume.ToString()); sb.AppendLine("<End>"); //書き込み w.Write(sb.ToString()); } }
/// <summary> /// マウス座標の取得。指定したEventStstemに被る場合はfalseを返す /// </summary> public bool GetMousePoint(out Vector2 point) { point = FuncBox.GetMousePosition(cam); if (!uiEventSystem) { return(true); } else if (uiEventSystem.IsPointerOverGameObject()) { return(false); } else { return(true); } }
public UISprite background; //テキストバックグラウンド #region 関数 /// <summary> /// ポップアップのテキスト、位置を設定する /// </summary> public void SetPopup(Camera sourceCam, Vector3 worldPos, string text) { //ポップアップの位置 Vector3 pos = FuncBox.ViewPointTransform(sourceCam, worldPos, targetCamera); popup.transform.position = pos; //テキスト label.text = text; //背景 Vector2 size = label.relativeSize; Vector2 scale = label.transform.localScale; size.x *= scale.x; size.y *= scale.y; background.transform.localScale = size; }
//サークルUIの生成 public void InstantiateCircle() { //割合計算と生成 contentsList = new List<CircleUIContents>();; float t = 0f; GameObject s; foreach (CircleValue p in circleValue) { //生成 s = (GameObject)Instantiate(prefab.gameObject); s.transform.parent = transform; s.transform.localPosition = Vector3.zero; s.transform.localScale = Vector3.one; contentsList.Add(s.GetComponent<CircleUIContents>()); //割合の母数を計算 t += p.per; } //正規化 float per = 0f; float addPer = 0f; float angle; float direction; Vector3 vec; normalizedPer = new List<float>(); for(int i = 0; i < circleValue.Count; i++) { //正規 per = circleValue[i].per / t; //角度 angle = 360 * addPer; addPer += per; normalizedPer.Add(addPer); //正規化リストに追加 //ずらす角度 direction = angle + (per * 360 / 2) + 90f; //座標をずらす vec = FuncBox.DegreeToVector3(direction); contentsList[i].transform.localPosition = vec * vecScale; //角度と割合 contentsList[i].transform.eulerAngles = new Vector3(0f, 0f, angle); contentsList[i].SetContents(per, circleValue[i].text); //名前 contentsList[i].name = "[" + i + "]"; } }