void Start() { leftDragDetector = new DragDetector(dragStartDistance); OrbitPoint = new GameObject("Stage Orbit").transform; RootTransform.SetParent(OrbitPoint, true); OrbitPoint.Rotate(Vector3.up, -40, Space.World); OrbitPoint.Rotate(Vector3.left, 10, Space.World); currentRotation = new Vector2(40, -10); StartOrbit(); }
public void InventoryItemRotation() { SlotShape ss = new SlotShape(new int[, ] { { 1 }, // (0,0) { 1 }, // (0,1) { 1 } // (0,2) }); var ii = new GameObject().AddComponent <InventoryItemUI>(); ii.GetComponent <InventoryItemUI>().Init(ss); // Rotate Pivot Origin (0,0) -> (0,0)(1,0)(2,0) ii.Rotate(new Vector2(0, 0), 1); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 0)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(1, 0)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(2, 0)), ii.ToString()); // Rotate Pivot (0,1) -> (-1,1)(0,1)(1,1) ii = new GameObject().AddComponent <InventoryItemUI>(); ii.GetComponent <InventoryItemUI>().Init(ss); ii.Rotate(new Vector2(0, 1), -1); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-1, 1)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 1)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(1, 1)), ii.ToString()); // Rotate Pivot (0,2) -> (-2, 2)(-1, 2)(0,2) ii = new GameObject().AddComponent <InventoryItemUI>(); ii.GetComponent <InventoryItemUI>().Init(ss); ii.Rotate(new Vector2(0, 2), 1); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-2, 2)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-1, 2)), ii.ToString()); Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 2)), ii.ToString()); }
void Arc(GameObject ShotStyle, int nbBullets, int espacement) { var newTrans1 = new GameObject().transform; var newTrans2 = new GameObject().transform; for (int i = 0; i <= nbBullets; i++) { var bullet1 = Instantiate(ShotStyle, BulletSpawn.position, newTrans1.rotation); var bullet2 = Instantiate(ShotStyle, BulletSpawn.position, newTrans2.rotation); newTrans1.Rotate(new Vector3(0, 0, espacement)); newTrans2.Rotate(new Vector3(0, 0, -espacement)); } }
private void autoHover() { { Vector3 heading = (Vector3d)this.vessel.transform.up; Vector3d up = (this.vessel.GetComponent <Rigidbody>().position - this.vessel.mainBody.position).normalized; Transform modifiedUp = new GameObject().transform; modifiedUp.rotation = Quaternion.LookRotation(up, heading); modifiedUp.Rotate(new Vector3(-90, 0, 180)); partTransform.localRotation = Quaternion.Euler(currentRotation + new Vector3(defaultRotationX, defaultRotationY, defaultRotationZ)); partTransform.rotation = Quaternion.RotateTowards(partTransform.rotation, modifiedUp.rotation, steerAmount * 4); } }
private void OnGUI() { if (GUILayout.Button("Add 10230")) { Transform t = new GameObject().transform; t.parent = transform; for (int j = 0; j < 10; j++) { Matrix4x4[] arr = new Matrix4x4[1023]; for (int i = 0; i < 1023; i++) { t.localPosition = new Vector3(Random.Range(-rd, rd), Random.Range(-rd, rd), Random.Range(-rd, rd)); t.localScale = Vector3.one * Random.Range(0, rd * scale); t.Rotate(Vector3.up, Random.Range(0f, 360f)); t.Rotate(Vector3.right, Random.Range(0f, 360f)); arr[i] = t.localToWorldMatrix; } _matrixArray.Add(arr); } DestroyImmediate(t.gameObject); } GUILayout.Label($"Count: {_matrixArray.Count * 1023}"); }
/// <summary> /// 创建圆环 /// </summary> /// <param name="deg">圆环角度</param> /// <param name="radius">圆环半径</param> /// <param name="dot">圆环初始位置角度</param> private void CreateArch(int deg, int radius, int dot) { ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex, deg, radius, 1, 1, 20, true, true, true, true, true); pbMesh.gameObject.tag = "Archs"; pbMesh.gameObject.AddComponent <MeshCollider>(); pbMesh.transform.Rotate(-90, 0, 0); pbMesh.GetComponent <MeshRenderer>().material = data.mat; Transform yPos = new GameObject("yPos").transform; yPos.Rotate(0, dot, 0); pbMesh.transform.SetParent(yPos, false); yPos.SetParent(this.transform, false); archs.Add(pbMesh); }
static void RandomizePos() { Transform tempHolder = new GameObject().transform; var items = Selection.transforms; Undo.RecordObjects(items, "Store positions before distribute"); for (int i = 0; i < items.Length; i++) { var obj = items[i]; tempHolder.rotation = obj.rotation; obj.SetParent(tempHolder); obj.localPosition = Vector3.forward * R * Random.Range(0.3f, 1f); tempHolder.Rotate(Random.Range(-180, 180), Random.Range(-180, 180), 0); obj.SetParent(null); } GameObject.DestroyImmediate(tempHolder.gameObject); }
public static Matrix4x4 fromUnityMatrix(GameObject sceneRoot, JSONNode metadata = null) { if (metadata == null) { metadata = sceneRoot.GetComponent <ForgeProperties> ().Properties; } Vector3 center = GetSceneBoundingBox(sceneRoot, metadata).center; Vector3 pivot = GetSceneOrigin(sceneRoot, metadata); if (IsMarkerDefined(sceneRoot, metadata)) { pivot += /*center +*/ GetMarkerPoint(sceneRoot, metadata); } Vector3 upvector = GetSceneUpVector(sceneRoot, metadata); string units = GetSceneUnit(sceneRoot, metadata); Transform tr = new GameObject().transform; if (upvector [2] != 0f) // Z axis { tr.Rotate(Vector3.right, -90); tr.localScale = new Vector3(-1f, 1f, 1f); } float unitsConvert = ForgeLoaderEngine.convertToMeter(units); if (unitsConvert != 1.0f) { tr.localScale = new Vector3(tr.localScale.x * unitsConvert, tr.localScale.y * unitsConvert, tr.localScale.z * unitsConvert); } //tr.localPosition =-pivot ; Matrix4x4 mat = Matrix4x4.identity; mat = tr.worldToLocalMatrix; Matrix4x4 mTR = Matrix4x4.identity; mTR.m03 = pivot.x; mTR.m13 = pivot.y; mTR.m23 = pivot.z; mat = mTR * mat; GameObject.DestroyImmediate(tr.gameObject); return(mat); }
void Cercle(float angle, float nbBullets, GameObject ShotStyle) { var newTrans = new GameObject().transform; float angleStep = 360f / nbBullets; float radius = 5f; for (int i = 0; i <= nbBullets; i++) { float bulletDirXposition = BulletSpawn.position.x + Mathf.Sin((angle * Mathf.PI) / 180) * radius; float bulletDirYposition = BulletSpawn.position.y + Mathf.Cos((angle * Mathf.PI) / 180) * radius; Vector3 projectileVector = new Vector3(bulletDirXposition, bulletDirYposition, 0); Vector3 projectileMoveDirection = (projectileVector - BulletSpawn.position).normalized * 5; var bullet = Instantiate(ShotStyle, BulletSpawn.position, newTrans.rotation); bullet.GetComponent <Rigidbody2D> ().velocity = new Vector2(projectileMoveDirection.x, projectileMoveDirection.y); angle += angleStep; newTrans.Rotate(new Vector3(0, 0, angle)); } }
private void Control(out Vector3 position, out Quaternion rotation) { Transform _transform = new GameObject().transform; _transform.position = transform.position; _transform.rotation = transform.rotation; if (target != null) { _transform.rotation = Quaternion.RotateTowards(_transform.rotation, Quaternion.LookRotation(target.transform.position - _transform.position), rotSpeed * Time.fixedDeltaTime); float _rotSpeed = (moveSpeed * 360.0f) / (2 * Mathf.PI * Vector3.Distance(_transform.position, target.transform.position)); _transform.RotateAround(target.transform.position, target.transform.TransformDirection(Vector3.up), -1 * inputDir.x * _rotSpeed * Time.fixedDeltaTime); _transform.position = Vector3.MoveTowards(_transform.position, target.transform.position, inputDir.y * moveSpeed * Time.fixedDeltaTime); } else { _transform.Rotate(_transform.TransformDirection(Vector3.up), inputDir.x * rotSpeed * Time.fixedDeltaTime); _transform.position += _transform.TransformDirection(Vector3.forward) * inputDir.y * moveSpeed * Time.fixedDeltaTime; } position = _transform.position; rotation = _transform.rotation; Destroy(_transform.gameObject); }
public void CreateTrack() { ParseTrack(); CreateRotations(); var holder = new GameObject("LevelHolder"); var levelHolder = holder.AddComponent <LevelHolder>(); levelHolder._startPercent = (_playerStartIndex + _prefabs.startPointOffset) / (double)(_track.Length); var go = new GameObject("Track", typeof(SplineComputer)); go.transform.parent = holder.transform; var spline = go.GetComponent <SplineComputer>(); levelHolder.Init(spline); var points = new List <SplinePoint>(_track.Length); var point = new GameObject().transform; for (var i = 0; i < _track.Length; i++) { var t = _track[i]; var p = new SplinePoint(point.position); var angle = 0f; foreach (var dir in t.dir) { switch (dir) { case TrackDir.None: case TrackDir.Fence: break; case TrackDir.Left: case TrackDir.Right: case TrackDir.Up: case TrackDir.Down: point.Rotate(_directions2[(int)dir]); break; case TrackDir.ShiftLeft: point.position += point.right * (-1f * _stepHorizontalShift); break; case TrackDir.ShiftRight: point.position += point.right * _stepHorizontalShift; break; case TrackDir.ShiftUp: point.position += point.up * _stepVerticalShift; break; case TrackDir.ShiftDown: point.position += point.up * (-1f * _stepVerticalShift); break; case TrackDir.DeathloopStart: { var rot = Quaternion.LookRotation(p.position - points[points.Count - 1].position, p.normal); var dl = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.DeathLoopStart); var dlt = dl.transform; dlt.position = p.position; dlt.rotation = rot; dlt.parent = spline.transform.parent; dlt.localScale = new Vector3(_lines * _linesInterval, dlt.localScale.y, dlt.localScale.z); break; } case TrackDir.DeathloopEnd: { var rot = Quaternion.LookRotation(p.position - points[points.Count - 1].position, p.normal); var dl = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.DeathLoopEnd); var dlt = dl.transform; dlt.position = p.position; dlt.rotation = rot; dlt.parent = spline.transform.parent; dlt.localScale = new Vector3(_lines * _linesInterval, dlt.localScale.y, dlt.localScale.z); break; } case TrackDir.RotateLeft: angle += _stepRotate; break; case TrackDir.RotateRight: angle -= _stepRotate; break; default: throw new ArgumentOutOfRangeException(); } } var r = point.rotation; point.Rotate(0f, 0f, angle * _stepRotate); p.normal = point.up; PatchRotation(point); point.position += point.forward * _stepLength; points.Add(p); } spline.SetPoints(points.ToArray()); spline.type = Spline.Type.BSpline; DestroyImmediate(point.gameObject); { var start = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.StartLine.prefab); var pos = spline.Evaluate(spline.Project(points[_prefabs.startPointIndex + _prefabs.startPointOffset].position)); start.transform.rotation = pos.rotation; start.transform.position = pos.position + pos.rotation * _prefabs.StartLine.offset; start.transform.parent = spline.transform.parent; } { var finish = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.FinishLine.prefab); var pos = spline.Evaluate(spline.Project(points[points.Count - 1 - _prefabs.finishAdd].position)); finish.transform.rotation = pos.rotation; finish.transform.position = pos.position + pos.rotation * _prefabs.FinishLine.offset; finish.transform.parent = spline.transform.parent; } if (_prefabs.TrackHeader.prefab != null) { var trackHeader = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.TrackHeader.prefab); var pos = spline.Evaluate(spline.Project(points[0].position)); trackHeader.transform.rotation = pos.rotation; trackHeader.transform.position = pos.position + pos.rotation * _prefabs.TrackHeader.offset; trackHeader.transform.parent = spline.transform.parent; } if (_prefabs.TrackFooter.prefab != null) { var trackFooter = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.TrackFooter.prefab); var pos = spline.Evaluate(spline.Project(points[points.Count - 1].position)); trackFooter.transform.rotation = pos.rotation; trackFooter.transform.position = pos.position + pos.rotation * _prefabs.TrackFooter.offset; trackFooter.transform.parent = spline.transform.parent; } var dataHolder = FindObjectOfType <DataHolder>(); dataHolder.SetInternals(spline, levelHolder); eGUI.SetDirty(dataHolder); CreateLines(levelHolder); }
public override void GenerateObjectsInWorld() { //Seleziono il pavimento Transform floor = SpatialProcessing.Instance.floors.ElementAt(0).transform; SurfacePlane plane = floor.GetComponent <SurfacePlane>(); Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal); floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal); Vector3 gazePosition = new Vector3(0f, 0f, 0f); RaycastHit hitInfo; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers)) { gazePosition = hitInfo.point; } Vector3 boxesPosition = gazePosition; boxesPosition.y = floorPosition.y + 0.1f; Vector3 relativePos = gazePosition - Camera.main.transform.position; Quaternion rotation = Quaternion.LookRotation(relativePos); rotation.x = 0f; rotation.z = 0f; List <Transform> objs = transform.GetComponentInChildren <PlayModeManager>().GenerateObjects(ObjectsPrefabs, numberOfBoxes); Transform sceneRoot = GameObject.Find("Broadcasted Content").transform; System.Random rnd = new System.Random(); Transform elems = new GameObject("Elements").transform; elems.parent = sceneRoot; for (int i = 1; i <= numberOfBoxes / 2; i++) { Transform elem = new GameObject("Element").transform; elem.parent = elems; elem.position = elems.TransformPoint(new Vector3((float)Math.Pow(-1, i) * 0.3f * (i / 2), 0f, 0f)); GameObject box = Instantiate(BoxPrefab, elem.position, BoxPrefab.transform.rotation, elem); int j = rnd.Next(0, objs.Count); Transform obj = Instantiate(objs.ElementAt(j), box.transform.position, box.transform.rotation, elem); obj.gameObject.SetActive(false); objs.RemoveAt(j); Transform elem2 = new GameObject("Element").transform; elem2.parent = elems; elem2.position = elems.TransformPoint(new Vector3((float)Math.Pow(-1, i) * 0.3f * (i / 2), 0f, 0.3f)); GameObject box2 = Instantiate(BoxPrefab, elem2.position, BoxPrefab.transform.rotation, elem2); int k = rnd.Next(0, objs.Count); Transform obj2 = Instantiate(objs.ElementAt(k), elem2.position, box2.transform.rotation, elem2); obj2.gameObject.SetActive(false); objs.RemoveAt(k); } elems.Translate(boxesPosition); elems.Rotate(rotation.eulerAngles); Vector3 assistantPosition = elems.GetChild(elems.childCount - 2).TransformPoint(0.3f * (float)Math.Pow(-1, elems.childCount / 2 % 2), 0f, 0f); assistantPosition.y = floor.position.y; if (assistantPresence != 0) { Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot); VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z); } transform.GetComponentInChildren <PlayModeManager>().StartGame(waitingTime); }
private void DeleteVisualObstacles() { Transform visualObstacle; for (int i = 0; i < visualObstacles.Count; i++) { visualObstacle = visualObstacles[i].transform; if (visualObstacle.position.z + 150.0f < playerZPosition) { visualObstacle.Rotate (Vector3.zero); visualObstacle.gameObject.SetActive(false); visualObstacles.Remove(visualObstacle.gameObject); loadedVisualObstacles.Add(visualObstacle.gameObject); } } }
public override void GenerateObjectsInWorld() { Transform floor = SpatialProcessing.Instance.floors.ElementAt(0).transform; SurfacePlane plane = floor.GetComponent <SurfacePlane>(); Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal); floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal); Vector3 gazePosition = new Vector3(0f, 0f, 0f); RaycastHit hitInfo; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers)) { gazePosition = hitInfo.point; } Vector3 objsPosition = gazePosition; objsPosition.y = floorPosition.y; Vector3 relativePos = Camera.main.transform.position - gazePosition; Quaternion rotation = Quaternion.LookRotation(relativePos); rotation.x = 0f; rotation.z = 0f; Transform sceneRoot = GameObject.Find("Broadcasted Content").transform; Transform targets = new GameObject("Targets").transform; targets.parent = sceneRoot; targets.tag = "Targets"; Instantiate(Targets.transform.GetChild(0), Targets.transform.GetChild(0).position + new Vector3(0f, 0.2f, 0f), Targets.transform.GetChild(0).rotation, targets); targets.Translate(objsPosition); targets.Rotate(rotation.eulerAngles); Transform objs = new GameObject("ObjectsToBePlaced").transform; objs.parent = sceneRoot; objs.tag = "ObjectsToBePlaced"; Instantiate(ObjectsToBePlaced.transform.GetChild(0), ObjectsToBePlaced.transform.GetChild(0).position, ObjectsToBePlaced.transform.GetChild(0).rotation, objs); objs.Translate(Vector3.Lerp(objsPosition, Camera.main.transform.position, 0.5f)); Counter.Instance.InitializeCounter(ObjectsToBePlaced.GetComponentsInChildren <Rigidbody>().Length); Vector3 assistantPosition = gazePosition + new Vector3(-0.5f, 0f, 0f); assistantPosition.y = floor.position.y; if (assistantPresence != 0) { Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot); VirtualAssistantManager.Instance.patience = assistantPatience; VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z); } }
public void BuildCasings() { float half = size / 2.0f; GameObject bomb = GameObject.Instantiate(Empty_Bomb); bomb.name = size + "x" + size + " Casing (" + (size * size * 2 - 1) + " modules)"; Casing casing = bomb.GetComponent <Casing>(); Transform visual_transform = casing.Visual; KMBombFace front_face = casing.Front.GetComponent <KMBombFace>(); KMBombFace rear_face = casing.Back.GetComponent <KMBombFace>(); front_face.Anchors = new System.Collections.Generic.List <Transform>(); front_face.Backings = new System.Collections.Generic.List <KMModuleBacking>(); front_face.GetComponent <KMSelectable>().ChildRowLength = size; rear_face.Anchors = new System.Collections.Generic.List <Transform>(); rear_face.Backings = new System.Collections.Generic.List <KMModuleBacking>(); rear_face.GetComponent <KMSelectable>().ChildRowLength = size; casing.Distance_Collider.size = new Vector3(size * 0.23f, 0.20f, size * 0.23f); casing.Selectable_Area.size = new Vector3(size * 0.24f, size * 0.24f, 0.22f); casing.Selectable_Area.transform.Translate(0, -0.25f, 0); casing.Highlight.localScale = new Vector3(size * 0.24f, size * 0.24f, 0.22f); // casing.Body.localScale = new Vector3(size * 0.23f, 0.18f, size * 0.23f); float crossbar_width = 0.025f; float widget_offset = 0.22f; float widget_constant_offset = crossbar_width + 0.00275f; //Make the widget anchors for (int w = 0; w < size; w++) { Transform Bface = new GameObject().GetComponent <Transform>(); Bface.Translate(new Vector3(offset * (w - half + 0.5f), 0.0f, 0.0f)); Bface.Rotate(-90, 0, 0); Bface.SetParent(casing.W_Bottom); Bface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Bface.name = "Bottom Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Bface.gameObject); Transform Tface = new GameObject().GetComponent <Transform>(); Tface.Translate(new Vector3(offset * (w - half + 0.5f), 0.0f, 0.0f)); Tface.Rotate(-90, 180, 0); Tface.SetParent(casing.W_Top); Tface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Tface.name = "Top Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Tface.gameObject); Transform Lface = new GameObject().GetComponent <Transform>(); Lface.Translate(new Vector3(0.0f, 0.0f, offset * (w - half + 0.5f))); Lface.Rotate(-90, 90, 0); Lface.SetParent(casing.W_Left); Lface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Lface.name = "Left Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Lface.gameObject); Transform Rface = new GameObject().GetComponent <Transform>(); Rface.Translate(new Vector3(0.0f, 0.0f, offset * (w - half + 0.5f))); Rface.Rotate(-90, -90, 0); Rface.SetParent(casing.W_Right); Rface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Rface.name = "Right Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Rface.gameObject); } casing.W_Bottom.Translate(new Vector3(0, 0, size * -widget_offset / 2 - widget_constant_offset), Space.World); casing.W_Top.Translate(new Vector3(0, 0, size * widget_offset / 2 + widget_constant_offset), Space.World); casing.W_Left.Translate(new Vector3(size * -widget_offset / 2 - widget_constant_offset, 0, 0), Space.World); casing.W_Right.Translate(new Vector3(size * widget_offset / 2 + widget_constant_offset, 0, 0), Space.World); //Generate the crossbars. for (int i = 0; i <= size; i++) { Transform CrossBar1 = (GameObject.Instantiate(Cross_Bar) as GameObject).GetComponent <Transform>(); CrossBar1.SetParent(visual_transform); CrossBar1.localScale = new Vector3(crossbar_width, 0.21f, size * 0.22f); CrossBar1.Translate(new Vector3(offset * (i - half), 0, -0)); Transform CrossBar2 = (GameObject.Instantiate(Cross_Bar) as GameObject).GetComponent <Transform>(); CrossBar2.SetParent(visual_transform); CrossBar2.localScale = new Vector3(size * 0.22f, 0.22f, crossbar_width); CrossBar2.Translate(new Vector3(0, 0, offset * (i - half))); } // Generate The module backings and anchors for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { GameObject front_backing = GameObject.Instantiate(Bomb_Backing); // Grab the prefab Transform f = front_backing.GetComponent <Transform>(); f.SetParent(casing.Faces_F); f.Translate(new Vector3(offset * (x - half), offset * (y - half), -0.01f)); f.Translate(new Vector3(-0.687f, 0.359f, 0.0f)); f.name = "Bomb_Foam_" + x + "_" + y + "_F"; Transform f_anchor = new GameObject().GetComponent <Transform>(); // We need to rotate the anchor relative to the backing, so we need a new transform f_anchor.position = f.position; f_anchor.parent = f; f_anchor.Translate(0, 0.08f, 0); // Move the modules out of the backing f_anchor.Rotate(new Vector3(0, 0, 0)); f_anchor.name = "Anchor"; front_face.Anchors.Add(f_anchor); front_face.Backings.Add(front_backing.GetComponent <KMModuleBacking>()); // And do it all again for the back face GameObject rear_backing = GameObject.Instantiate(Bomb_Backing); Transform r = rear_backing.GetComponent <Transform>(); r.SetParent(casing.Faces_R); r.Translate(new Vector3(offset * (x - half), offset * (y - half), 0.01f)); r.Translate(new Vector3(-0.687f, 0.359f, 0.0f)); r.Rotate(new Vector3(0, 180, 0)); r.name = "Bomb_Foam_" + x + "_" + y + "_R"; Transform r_anchor = new GameObject().GetComponent <Transform>(); r_anchor.position = r.position; r_anchor.parent = r; r_anchor.Translate(0, -0.08f, 0); r_anchor.Rotate(new Vector3(0, 0, 180)); r_anchor.name = "Anchor"; rear_face.Anchors.Add(r_anchor); rear_face.Backings.Add(rear_backing.GetComponent <KMModuleBacking>()); } } bomb.GetComponent <KMBomb>().Scale = 2.2f / size; }
public override void GenerateObjectsInWorld() { //Seleziono il pavimento Transform floor = SpatialProcessing.Instance.floors.ElementAt(0).transform; SurfacePlane plane = floor.GetComponent <SurfacePlane>(); System.Random rnd = new System.Random(); Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal); floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal); Vector3 gazePosition = new Vector3(0f, 0f, 0f); RaycastHit hitInfo; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers)) { gazePosition = hitInfo.point; } Vector3 binsPosition = gazePosition; binsPosition.y = floorPosition.y; Vector3 relativePos = Camera.main.transform.position - gazePosition; Quaternion rotation = Quaternion.LookRotation(relativePos); rotation.x = 0f; rotation.z = 0f; Transform sceneRoot = GameObject.Find("Broadcasted Content").transform; Transform bins = new GameObject("Bins").transform; bins.parent = sceneRoot; bins.tag = "Targets"; activeBins = new List <string>(); for (int i = 1; i <= numberOfBins;) { Transform bin = BinsPrefabs.transform.GetChild(rnd.Next(0, BinsPrefabs.transform.childCount)); string currentBinTag = bin.gameObject.tag; if (!activeBins.Contains(currentBinTag)) { Instantiate(bin, new Vector3((float)Math.Pow(-1, i) * 0.4f * (i / 2), 0f, 0f), bin.rotation, bins); activeBins.Add(bin.gameObject.tag); i++; } } bins.Translate(binsPosition); bins.Rotate(rotation.eulerAngles); Transform waste = new GameObject("Waste").transform; waste.parent = sceneRoot; waste.tag = "ObjectsToBePlaced"; Vector3 wastePosition = Vector3.Lerp(Camera.main.transform.position, bins.position, 0.5f); wastePosition.y = floorPosition.y + 0.1f; for (int i = 0; i < numberOfWaste;) { Transform wasteGroup = WastePrefabs.transform.GetChild(rnd.Next(0, WastePrefabs.transform.childCount)); int groupSize = wasteGroup.GetComponentsInChildren <Rigidbody>().Length; Transform currentWaste = wasteGroup.GetChild(rnd.Next(0, groupSize)); string currentWasteTag = currentWaste.gameObject.tag; if (activeBins.Contains(currentWasteTag)) { Instantiate(currentWaste.gameObject, currentWaste.position, currentWaste.rotation, waste); i++; } } waste.Translate(wastePosition); waste.Rotate(rotation.eulerAngles); Counter.Instance.InitializeCounter(waste.GetComponentsInChildren <Rigidbody>().Length); Vector3 assistantPosition = bins.TransformPoint(-0.3f, 0f, 0.3f); assistantPosition.y = floor.position.y; if (assistantPresence != 0) { Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot); VirtualAssistantManager.Instance.patience = assistantPatience; VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z); if (explainTaskGoal == 1) { VirtualAssistantManager.Instance.ExplainTaskGoal(); } } }
protected override void InitializeScene() { creator = BufferCreator.CreateWithBuiltInTypes(); iset = FLInstructionSet.CreateWithBuiltInTypes(CLAPI.MainThread, "assets/kernel/"); checkPipeline = FLProgramCheckBuilder.CreateDefaultCheckBuilder(iset, creator); parser = new FLParser(iset, creator); checkPipeline.Attach(parser, true); Mesh plane = MeshLoader.FileToMesh("assets/models/plane.obj"); Texture texQuad = TextureLoader.ParameterToTexture(1024, 1024, "FLDisplayTextureQuad"); Texture texSphere = TextureLoader.ParameterToTexture(1024, 1024, "FLDisplayTextureSphere"); GameObject objSphere = new GameObject(new Vector3(1, 1, 0), "SphereDisplay"); LitMeshRendererComponent sphereLmr = new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, Prefabs.Sphere, texSphere, 1); objSphere.AddComponent(sphereLmr); sphereLmr.Textures = new[] { sphereLmr.Textures[0], DefaultFilepaths.DefaultTexture }; objSphere.AddComponent(new RotatingComponent()); GameObject objQuad = new GameObject(new Vector3(-1, 1, 0), "QuadDisplay"); LitMeshRendererComponent quadLmr = new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, plane, texQuad, 1); objQuad.AddComponent(quadLmr); quadLmr.Textures = new[] { quadLmr.Textures[0], DefaultFilepaths.DefaultTexture }; objQuad.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(45)); GameObject sourceCube = new GameObject(new Vector3(0, 10, 10), "Light Source"); sourceCube.AddComponent(new LightComponent()); sourceCube.AddComponent(new RotateAroundComponent { Slow = 0.15f }); sourceCube.AddComponent(new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, Prefabs.Cube, TextureLoader.ColorToTexture(Color.White), 1)); GameObject uiText = new GameObject(new Vector3(0), "UIText"); uiText.AddComponent(new FlGeneratorComponent(new List <LitMeshRendererComponent> { sphereLmr, quadLmr }, 512, 512, true)); Add(sourceCube); Add(uiText); Add(DebugConsoleComponent.CreateConsole()); Add(objSphere); Add(objQuad); GameObject bgObj = new GameObject(Vector3.UnitY * -3, "BG") { Scale = new Vector3(25, 1, 25) }; bgObj.AddComponent(new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, Prefabs.Cube, GenerateGroundTexture(), 1)); Add(bgObj); BasicCamera mainCamera = new BasicCamera( Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f), GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero); object mc = mainCamera; EngineConfig.LoadConfig("assets/configs/camera_fldemo.xml", ref mc); Add(mainCamera); SetCamera(mainCamera); GameObject camContainer = new GameObject("CamContainer"); BasicCamera inPicCam = new BasicCamera( Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f), GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero); inPicCam.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(0)); inPicCam.Translate(new Vector3(0, 2, 4)); inPicCam.AddComponent(new RotateAroundComponent()); GameObject zeroPoint = new GameObject("Zero"); Add(zeroPoint); LookAtComponent comp = new LookAtComponent(); comp.SetTarget(zeroPoint); inPicCam.AddComponent(comp); Add(inPicCam); splitCam = new RenderTarget(inPicCam, 1, Color.FromArgb(0, 0, 0, 0)) { MergeType = RenderTargetMergeType.Additive, ViewPort = new Rectangle(0, 0, (int)(GameEngine.Instance.Width * 0.3f), (int)(GameEngine.Instance.Height * 0.3f)) }; Add(camContainer); GameEngine.Instance.AddRenderTarget(splitCam); }
private void DeleteVisualObstacles() { Transform visualObstacle; for (int i = 0; i < visualObstacles.Count; i++) { visualObstacle = visualObstacles[i].transform; if (visualObstacle.position.z + 150.0f < playerZPosition) { if (visualObstacle.gameObject.layer == 10) { loadedVisualObstacles.Insert(0, visualObstacle.gameObject); } else if (visualObstacle.gameObject.layer == 11) { loadedVisualObstacles.Insert(numberOfCopiesOfEachObstacle * numberOfObstaclesInEachDifficultyLevel, visualObstacle.gameObject); } else if (visualObstacle.gameObject.layer == 12) { loadedVisualObstacles.Add(visualObstacle.gameObject); } visualObstacle.Rotate(Vector3.zero); visualObstacle.gameObject.SetActive(false); visualObstacles.Remove(visualObstacle.gameObject); limit++; } } }
protected override void InitializeScene() { Mesh sphere = MeshLoader.FileToMesh("models/sphere_smooth.obj"); Mesh plane = MeshLoader.FileToMesh("models/plane.obj"); Mesh bgBox = MeshLoader.FileToMesh("models/cube_flat.obj"); ShaderProgram.TryCreate(new Dictionary <ShaderType, string> { { ShaderType.FragmentShader, "shader/UITextRender.fs" }, { ShaderType.VertexShader, "shader/UITextRender.vs" } }, out ShaderProgram textShader); ShaderProgram.TryCreate(new Dictionary <ShaderType, string> { { ShaderType.FragmentShader, "shader/texture.fs" }, { ShaderType.VertexShader, "shader/texture.vs" } }, out ShaderProgram shader); GameObject objSphere = new GameObject(new Vector3(1, 1, 0), "SphereDisplay"); objSphere.AddComponent(new MeshRendererComponent(shader, sphere, TextureLoader.FileToTexture("textures/ground4k.png"), 1)); objSphere.AddComponent(new RotatingComponent()); GameObject objQuad = new GameObject(new Vector3(-1, 1, 0), "QuadDisplay"); objQuad.AddComponent(new MeshRendererComponent(shader, plane, TextureLoader.FileToTexture("textures/ground4k.png"), 1)); objQuad.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(90)); GameObject uiText = new GameObject(new Vector3(0), "UIText"); uiText.AddComponent(new FLGeneratorComponent(new List <MeshRendererComponent> { objSphere.GetComponent <MeshRendererComponent>(), objQuad.GetComponent <MeshRendererComponent>() }, 512, 512)); GameEngine.Instance.CurrentScene.Add(uiText); DebugConsoleComponent dbg = DebugConsoleComponent.CreateConsole().GetComponent <DebugConsoleComponent>(); dbg.AddCommand("mov", cmd_ChangeCameraPos); dbg.AddCommand("rot", cmd_ChangeCameraRot); dbg.AddCommand("reload", cmd_ReLoadScene); dbg.AddCommand("next", cmd_NextScene); GameEngine.Instance.CurrentScene.Add(dbg.Owner); GameEngine.Instance.CurrentScene.Add(objSphere); GameEngine.Instance.CurrentScene.Add(objQuad); GameObject bgObj = new GameObject(Vector3.UnitY * -3, "BG"); bgObj.Scale = new Vector3(25, 1, 25); Texture bgTex = TextureLoader.FileToTexture("textures/ground4k.png"); //BufferOperations.GetRegion<byte>(buf, new int3(), ) bgObj.AddComponent(new MeshRendererComponent(shader, bgBox, bgTex, 1)); GameEngine.Instance.CurrentScene.Add(bgObj); BasicCamera mainCamera = new BasicCamera( Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f), GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero); object mc = mainCamera; EngineConfig.LoadConfig("configs/camera_fldemo.xml", ref mc); GameEngine.Instance.CurrentScene.Add(mainCamera); GameEngine.Instance.CurrentScene.SetCamera(mainCamera); GameObject camContainer = new GameObject("CamContainer"); BasicCamera inPicCam = new BasicCamera( Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f), GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero); inPicCam.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(0)); inPicCam.Translate(new Vector3(0, 2, 4)); inPicCam.AddComponent(new RotateAroundComponent()); GameObject zeroPoint = new GameObject("Zero"); GameEngine.Instance.CurrentScene.Add(zeroPoint); LookAtComponent comp = new LookAtComponent(); comp.SetTarget(zeroPoint); inPicCam.AddComponent(comp); GameEngine.Instance.CurrentScene.Add(inPicCam); splitCam = new RenderTarget(inPicCam, 1, new Color(0, 0, 0, 0)) { MergeType = RenderTargetMergeType.Additive, ViewPort = new Rectangle(0, 0, (int)(GameEngine.Instance.Width * 0.3f), (int)(GameEngine.Instance.Height * 0.3f)) }; GameEngine.Instance.CurrentScene.Add(camContainer); GameEngine.Instance.AddRenderTarget(splitCam); }
private void autoHover() { { Vector3 heading = (Vector3d)this.vessel.transform.up; Vector3d up = (this.vessel.rigidbody.position - this.vessel.mainBody.position).normalized; Transform partTransform = part.FindModelTransform(targetPartObject); Transform modifiedUp = new GameObject().transform; modifiedUp.rotation = Quaternion.LookRotation(up, heading); modifiedUp.Rotate(new Vector3(-90,0,180)); partTransform.localRotation = Quaternion.Euler(currentRotation + new Vector3(defaultRotationX, defaultRotationY, defaultRotationZ)); partTransform.rotation = Quaternion.RotateTowards(partTransform.rotation, modifiedUp.rotation, steerAmount*4); } }
public GameObject GenerateCase(Vector2 size) { float halfX = size.x / 2; float halfY = size.y / 2; GameObject bomb = Instantiate(Empty_Bomb); bomb.name = size.x + "x" + size.y + " Casing (" + (size.x * size.y * 2 - 1) + " modules)"; Casing casing = bomb.GetComponent <Casing>(); Transform visual_transform = casing.Visual; KMBombFace front_face = casing.Front.GetComponent <KMBombFace>(); KMBombFace rear_face = casing.Back.GetComponent <KMBombFace>(); front_face.Anchors = new List <Transform>(); front_face.Backings = new List <KMModuleBacking>(); front_face.GetComponent <KMSelectable>().ChildRowLength = (int)size.x; rear_face.Anchors = new List <Transform>(); rear_face.Backings = new List <KMModuleBacking>(); rear_face.GetComponent <KMSelectable>().ChildRowLength = (int)size.x; casing.Distance_Collider.size = new Vector3(size.x * 0.23f, 0.20f, size.y * 0.23f); casing.Selectable_Area.size = new Vector3(size.x * 0.24f, size.y * 0.24f, 0.22f); casing.Selectable_Area.transform.Translate(0, -0.25f, 0); casing.Highlight.localScale = new Vector3(size.x * 0.24f, size.y * 0.24f, 0.22f); // casing.Body.localScale = new Vector3(size * 0.23f, 0.18f, size * 0.23f); const float crossbar_width = 0.025f; const float widget_offset = 0.22f; const float widget_constant_offset = crossbar_width + 0.00275f; //Make the widget anchors for (int w = 0; w < size.x; w++) { Transform Bface = new GameObject().GetComponent <Transform>(); Bface.Translate(new Vector3(offset * (w - halfX + 0.5f), 0.0f, 0.0f)); Bface.Rotate(-90, 0, 0); Bface.SetParent(casing.W_Bottom); Bface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Bface.name = "Bottom Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Bface.gameObject); Transform Tface = new GameObject().GetComponent <Transform>(); Tface.Translate(new Vector3(offset * (w - halfX + 0.5f), 0.0f, 0.0f)); Tface.Rotate(-90, 180, 0); Tface.SetParent(casing.W_Top); Tface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Tface.name = "Top Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Tface.gameObject); } for (int w = 0; w < size.y; w++) { Transform Lface = new GameObject().GetComponent <Transform>(); Lface.Translate(new Vector3(0.0f, 0.0f, offset * (w - halfY + 0.5f))); Lface.Rotate(-90, 90, 0); Lface.SetParent(casing.W_Left); Lface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Lface.name = "Left Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Lface.gameObject); Transform Rface = new GameObject().GetComponent <Transform>(); Rface.Translate(new Vector3(0.0f, 0.0f, offset * (w - halfY + 0.5f))); Rface.Rotate(-90, -90, 0); Rface.SetParent(casing.W_Right); Rface.localScale = new Vector3(0.12f, 0.03f, 0.17f); Rface.name = "Right Face"; bomb.GetComponent <KMBomb>().WidgetAreas.Add(Rface.gameObject); } casing.W_Bottom.Translate(new Vector3(0, 0, size.y * -widget_offset / 2 - widget_constant_offset), Space.World); casing.W_Top.Translate(new Vector3(0, 0, size.y * widget_offset / 2 + widget_constant_offset), Space.World); casing.W_Left.Translate(new Vector3(size.x * -widget_offset / 2 - widget_constant_offset, 0, 0), Space.World); casing.W_Right.Translate(new Vector3(size.x * widget_offset / 2 + widget_constant_offset, 0, 0), Space.World); //Generate the crossbars. if (Cross_Bar.GetComponent <ExcludeFromTexturePack>() == null) { Cross_Bar.AddComponent <ExcludeFromTexturePack>(); } Cross_Bar.GetComponent <Renderer>().sharedMaterial.color = MakeCaseColor(Tweaks.settings.CaseColors); for (int i = 0; i <= size.x; i++) { Transform CrossBar1 = Instantiate(Cross_Bar).GetComponent <Transform>(); CrossBar1.SetParent(visual_transform); CrossBar1.localScale = new Vector3(crossbar_width, 0.22f, size.y * 0.22f + crossbar_width * ((i == 0 || i == size.x) ? 1 : -1)); CrossBar1.Translate(new Vector3(offset * (i - halfX), 0, -0)); } for (int i = 0; i <= size.y; i++) { Transform CrossBar2 = Instantiate(Cross_Bar).GetComponent <Transform>(); CrossBar2.SetParent(visual_transform); CrossBar2.localScale = new Vector3(size.x * 0.22f + crossbar_width * ((i == 0 || i == size.y) ? 1 : -1), 0.22f, crossbar_width) - new Vector3(0.0001f, 0.0001f, 0.0001f); // Subtracted 0.0001 to prevent Z-fighting. CrossBar2.Translate(new Vector3(0, 0, offset * (i - halfY))); } // Generate The module backings and anchors for (int x = 0; x < size.x; x++) { for (int y = 0; y < size.y; y++) { GameObject front_backing = Instantiate(Bomb_Backing); // Grab the prefab Transform f = front_backing.GetComponent <Transform>(); f.SetParent(casing.Faces_F); f.Translate(new Vector3(offset * (x - halfX + 0.5f), offset * (y - halfY + 0.5f), -0.06f)); f.name = "Bomb_Foam_" + x + "_" + y + "_F"; Transform f_anchor = new GameObject().GetComponent <Transform>(); // We need to rotate the anchor relative to the backing, so we need a new transform f_anchor.position = f.position; f_anchor.parent = f; f_anchor.Translate(0, 0.03f, 0); // Move the modules out of the backing f_anchor.Rotate(new Vector3(0, 0, 0)); f_anchor.name = "Anchor"; front_face.Anchors.Add(f_anchor); front_face.Backings.Add(front_backing.GetComponent <KMModuleBacking>()); // And do it all again for the back face GameObject rear_backing = Instantiate(Bomb_Backing); Transform r = rear_backing.GetComponent <Transform>(); r.SetParent(casing.Faces_R); r.Translate(new Vector3(offset * (x - halfX + 0.5f), offset * (y - halfY + 0.5f), 0.06f)); r.Rotate(new Vector3(0, 180, 0)); r.name = "Bomb_Foam_" + x + "_" + y + "_R"; Transform r_anchor = new GameObject().GetComponent <Transform>(); r_anchor.position = r.position; r_anchor.parent = r; r_anchor.Translate(0, -0.03f, 0); r_anchor.Rotate(new Vector3(0, 0, 180)); r_anchor.name = "Anchor"; rear_face.Anchors.Add(r_anchor); rear_face.Backings.Add(rear_backing.GetComponent <KMModuleBacking>()); } } bomb.GetComponent <KMBomb>().Scale = Mathf.Min(2.2f / Mathf.Max(size.x, size.y), 1); foreach (KMSelectable selectable in bomb.GetComponentsInChildren <KMSelectable>()) { selectable.gameObject.AddComponent <ModSelectable>(); } bomb.AddComponent <ModBomb>(); return(bomb); }
public override void GenerateObjectsInWorld() { //Seleziono il pavimento Transform floor = SpatialProcessing.Instance.floors.ElementAt(0).transform; SurfacePlane plane = floor.GetComponent <SurfacePlane>(); System.Random rnd = new System.Random(); Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal); floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal); Vector3 gazePosition = new Vector3(0f, 0f, 0f); RaycastHit hitInfo; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers)) { gazePosition = hitInfo.point; } Vector3 weatherPosition = gazePosition; weatherPosition.y = floorPosition.y + 1f; Debug.DrawLine(Camera.main.transform.position, weatherPosition, Color.black, 30f); Vector3 relativePos = Camera.main.transform.position - gazePosition; Quaternion rotation = Quaternion.LookRotation(relativePos); rotation.x = 0f; rotation.z = 0f; Transform sceneRoot = GameObject.Find("Broadcasted Content").transform; Transform weather = new GameObject("Weather").transform; weather.parent = sceneRoot; weather.position = weatherPosition; Transform selectedLevel = WeatherPrefabs.transform.GetChild(numberOfLevel); Transform selectedWeather = selectedLevel.GetChild(rnd.Next(0, selectedLevel.childCount)); Instantiate(selectedWeather, weather.TransformPoint(-0.2f, 0f, 0f), rotation, weather); selectedWeather.GetChild(1).GetComponent <TemperatureGenerator>().GenerateTemperature(); weathertag = GameObject.Find("Weather").transform.GetChild(0).GetChild(0).tag; temperaturetag = GameObject.Find("Weather").transform.GetChild(0).GetChild(1).tag; Transform clothes = new GameObject("Clothes").transform; clothes.parent = sceneRoot; clothes.tag = "ObjectsToBePlaced"; Vector3 clothesPosition = weatherPosition; clothesPosition.y = floorPosition.y + 0.1f; Debug.DrawLine(weatherPosition, clothesPosition, Color.red, 30f); int counter = 0; for (int i = 0; i < numberOfClothes; i++) { Transform currentClothe = ClothesPrefabs.transform.GetChild(rnd.Next(0, ClothesPrefabs.transform.childCount)); List <string> tags = currentClothe.GetComponent <TagsContainer>().tags; if (counter <= Math.Floor((double)numberOfClothes / 3)) { if (!tags.Contains(weathertag) && !tags.Contains(temperaturetag)) { i--; continue; } } Instantiate(currentClothe.gameObject, currentClothe.position, currentClothe.rotation, clothes); if (tags.Contains(weathertag) || tags.Contains(temperaturetag)) { counter++; } } Debug.Log("Number of clothes: " + numberOfClothes + ", correct clothes: " + counter); clothes.Translate(clothesPosition); clothes.Rotate(rotation.eulerAngles); Transform bag = new GameObject("Bag").transform; bag.parent = sceneRoot; bag.tag = "Targets"; Vector3 bagPosition = weatherPosition; bagPosition.y = floorPosition.y + 0.1f; Instantiate(BagsPrefabs.transform.GetChild(rnd.Next(0, BagsPrefabs.transform.childCount)).gameObject, bagPosition, rotation, bag); Debug.DrawLine(clothesPosition, bagPosition, Color.blue, 30f); Counter.Instance.InitializeCounter(counter); Vector3 assistantPosition = clothes.TransformPoint(-0.3f, 0f, 0.3f); assistantPosition.y = floor.position.y; Debug.DrawLine(bagPosition, assistantPosition, Color.green, 30f); if (assistantPresence != 0) { Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot); VirtualAssistantManager.Instance.patience = assistantPatience; VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z); } }
private void SnapIn(Transform snapTransform, bool doSnap = true) { Vector3 initialPosition = snapTransform.position; Quaternion initialRotation = snapTransform.rotation; Transform tempObject = new GameObject().transform; Transform snapParent = snapTransform.parent; tempObject.rotation = m_attachPt.transform.rotation; Quaternion tempR = tempObject.rotation; snapTransform.parent = tempObject; tempObject.rotation = Quaternion.LookRotation(-attachPoint.transform.forward); Quaternion[] angs = new Quaternion[4]; // rotate by 90 degree increments to see which is closest to correct angle for (int i = 0; i < 4; i++) { angs[i] = tempObject.rotation; tempObject.Rotate(attachPoint.transform.forward * 90, Space.World); } float angClose = Mathf.Infinity; int closest = 0; for (int i = 0; i < 4; i++) { float a = Vector3.Angle(angs[i] * Vector3.right, tempR * Vector3.right); if (a < angClose) { closest = i; angClose = a; } } tempObject.rotation = angs[closest]; snapTransform.parent = snapParent; Destroy(tempObject.gameObject); snapTransform.position = initialPosition; Vector3 pDiff = attachPoint.transform.position - m_attachPt.transform.position; snapTransform.position += pDiff; if (doSnap) { DestroyImmediate(interactable.GetComponent <Throwable>()); DestroyImmediate(interactable.GetComponent <VelocityEstimator>()); DestroyImmediate(interactable.GetComponent <Rigidbody>()); Rigidbody parentRigidbody = snapParent.GetComponentInParent <Rigidbody>(); var joints = snapTransform.GetComponentsInChildren <Joint>(); foreach (var joint in joints) { joint.GetComponent <Rigidbody>().rotation = snapTransform.rotation; joint.connectedBody = parentRigidbody; joint.autoConfigureConnectedAnchor = false; joint.anchor = Vector3.zero; joint.connectedAnchor = parentRigidbody.transform.InverseTransformPoint(joint.transform.position); StartCoroutine(DoSetBreakForce(joint)); } Destroy(interactable); //Interactable item = t.GetComponentInParent<Interactable>(); //item.UpdateColliders(); //give the parent this item's colliders } }
// Use this for initialization void Start() { VideoCanvas.gameObject.SetActive(false); VirtualPhone.gameObject.SetActive(false); StatusText.gameObject.SetActive(true); VideoFrame.texture = new Texture2D(1080, 1920, TextureFormat.BGRA32, false); NetworkManager.Connected += () => { UnityEngine.WSA.Application.InvokeOnAppThread(() => { StatusText.gameObject.SetActive(false); //VirtualPhone.SetActive(true); VideoCanvas.gameObject.SetActive(true); }, false); }; // TODO: handle lost connection / reconnection NetworkManager.TextReceived += (string message) => { UnityEngine.WSA.Application.InvokeOnAppThread(() => { try { // TODO: use a better JSON parser var match = Regex.Match(message, "\\{\"?([a-zA-Z0-9-_.]+)\"?\\: ?\"?(.+)\"?\\}"); if (match != null && match.Success) { string command = match.Groups.Count > 1 ? match.Groups[1].Value : null; string argument = match.Groups.Count > 2 ? match.Groups[2].Value : null; if (argument != null) { argument = argument.TrimEnd('"'); } //LoggingManager.Log("Command recognized: " + command + ", " + argument); if (command == "transform") { var values = Regex.Match(argument, "\\[([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+);([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+);([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+)\\]"); float m00 = 0, m01 = 0, m02 = 0, m03 = 0, m10 = 0, m11 = 0, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0; bool success = false; if (values != null && values.Success) { string m00Str = values.Groups.Count > 1 ? values.Groups[1].Value : null; string m01Str = values.Groups.Count > 2 ? values.Groups[2].Value : null; string m02Str = values.Groups.Count > 3 ? values.Groups[3].Value : null; string m03Str = values.Groups.Count > 4 ? values.Groups[4].Value : null; string m10Str = values.Groups.Count > 5 ? values.Groups[5].Value : null; string m11Str = values.Groups.Count > 6 ? values.Groups[6].Value : null; string m12Str = values.Groups.Count > 7 ? values.Groups[7].Value : null; string m13Str = values.Groups.Count > 8 ? values.Groups[8].Value : null; string m20Str = values.Groups.Count > 9 ? values.Groups[9].Value : null; string m21Str = values.Groups.Count > 10 ? values.Groups[10].Value : null; string m22Str = values.Groups.Count > 11 ? values.Groups[11].Value : null; string m23Str = values.Groups.Count > 12 ? values.Groups[12].Value : null; try { m00 = m00Str == null ? 0 : float.Parse(m00Str); m01 = m01Str == null ? 0 : float.Parse(m01Str); m02 = m02Str == null ? 0 : float.Parse(m02Str); m03 = m03Str == null ? 0 : float.Parse(m03Str); m10 = m10Str == null ? 0 : float.Parse(m10Str); m11 = m11Str == null ? 0 : float.Parse(m11Str); m12 = m12Str == null ? 0 : float.Parse(m12Str); m13 = m13Str == null ? 0 : float.Parse(m13Str); m20 = m20Str == null ? 0 : float.Parse(m20Str); m21 = m21Str == null ? 0 : float.Parse(m21Str); m22 = m22Str == null ? 0 : float.Parse(m22Str); m23 = m23Str == null ? 0 : float.Parse(m23Str); success = true; } catch { LoggingManager.LogError("Bad argument: " + m00Str + ", " + m01Str + ", " + m02Str + ", " + m03Str + ", " + m10Str + ", " + m11Str + ", " + m12Str + ", " + m13Str + ", " + m20Str + ", " + m21Str + ", " + m22Str + ", " + m23Str); } } else { LoggingManager.LogError("Couldn't parse coordinates: " + argument); } if (success) { //Matrix4x4 m = new Matrix4x4(new Vector4(m00, m10, m20, m30), new Vector4(m01, m11, m21, m31), new Vector4(m02, m12, m22, m32), new Vector4(m03, m13, m23, m33)); // extract rotation Vector3 forward = new Vector3(m02, m12, m22); Vector3 upward = new Vector3(m01, m11, m21); Quaternion rotation = Quaternion.LookRotation(forward, upward); // correct rotation (iOS convention: +x = long axis toward home button, +y = short axis toward right, +z upward from screen) rotation = Quaternion.Euler(-rotation.eulerAngles.x, -rotation.eulerAngles.y, rotation.eulerAngles.z); // extract position Vector3 position = new Vector3(m03, m13, -m23); Transform phoneTransform = new GameObject().transform; phoneTransform.rotation = rotation; phoneTransform.Rotate(Vector3.forward, -90); phoneTransform.Rotate(Vector3.up, 180); phoneTransform.position = position; phoneTransform.RotateAround(Vector3.zero, Vector3.up, worldRotation.eulerAngles.y); //phoneTransform.rotation *= worldRotation; phoneTransform.position += worldTranslation; lastCorrectedPosition = phoneTransform.position; lastCorrectedRotation = phoneTransform.rotation; if ((uiMode == UIMode.FineCalibration && positioningMode == Positioning.Fixed) || (uiMode == UIMode.Default && attachmentMode == Attachment.Phone && positioningMode == Positioning.Fixed) || (uiMode == UIMode.Default && attachmentMode == Attachment.World && positioningMode == Positioning.Active) || (uiMode == UIMode.Default && attachmentMode == Attachment.Self && positioningMode == Positioning.Active)) { VideoCanvas.transform.rotation = phoneTransform.rotation; VideoCanvas.transform.position = phoneTransform.position; // store the current offsets from the default self position and rotation if (attachmentMode == Attachment.Self) { Vector3 displayPosition = Camera.main.transform.position + Camera.main.transform.forward * 0.5f; Vector3 directionToCamera = Camera.main.transform.position - displayPosition; Transform tempTransform = new GameObject().transform; tempTransform.position = displayPosition; tempTransform.rotation = Quaternion.LookRotation(-directionToCamera); tempTransform.Rotate(Vector3.right, 180); selfOffset = Camera.main.transform.InverseTransformVector(VideoCanvas.transform.position - tempTransform.position); selfRotation = Quaternion.Inverse(tempTransform.localRotation) * VideoCanvas.transform.localRotation; } // apply offsets if (attachmentMode == Attachment.Phone && uiMode == UIMode.Default) { VideoCanvas.transform.position += Camera.main.transform.TransformVector(phoneOffset); VideoCanvas.transform.localRotation *= phoneRotation; } } else if (uiMode == UIMode.FineCalibration && positioningMode == Positioning.Active) { phoneTransform.position -= worldTranslation; //phoneTransform.rotation *= Quaternion.Inverse(worldRotation); phoneTransform.RotateAround(Vector3.zero, Vector3.up, -worldRotation.eulerAngles.y); worldRotation = Quaternion.Euler(0, VideoCanvas.transform.localRotation.eulerAngles.y - phoneTransform.localRotation.eulerAngles.y, 0); //worldRotation = Quaternion.Inverse(VideoCanvas.transform.rotation) * phoneTransform.rotation; worldTranslation = VideoCanvas.transform.position - worldRotation * phoneTransform.position; } else if (uiMode == UIMode.Default && attachmentMode == Attachment.Phone && positioningMode == Positioning.Active) { phoneOffset = Camera.main.transform.InverseTransformVector(VideoCanvas.transform.position - phoneTransform.position); phoneRotation = Quaternion.Inverse(phoneTransform.localRotation) * VideoCanvas.transform.localRotation; } else if (uiMode == UIMode.Calibration) { // TODO: highlight phone if close enough } lastRotation = rotation; lastPosition = position; } } else if (command == "calibration") { if (argument == "start") { uiMode = UIMode.Calibration; LoggingManager.Log("Calibration Started"); StatusText.text = "Calibrating"; VirtualPhone.SetActive(true); VideoCanvas.gameObject.SetActive(false); StatusText.gameObject.SetActive(true); correspondences.Clear(); worldTranslation = Vector3.zero; worldRotation = Quaternion.identity; VirtualPhone.transform.rotation = Quaternion.identity; VirtualPhone.transform.Rotate(Vector3.right, -60); VirtualPhone.transform.position = Camera.main.transform.position + new Vector3(0, -0.1f, 0.5f); calibrationInitRotation = Camera.main.transform.rotation.eulerAngles.y; VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.up, calibrationInitRotation); calibrationPosition = VirtualPhone.transform.position; calibrationRotation = VirtualPhone.transform.rotation; } else if (argument == "stop") { // reset alignment since calibration has likely changed how the display will appear phoneOffset = Vector3.zero; phoneRotation = Quaternion.identity; selfOffset = Vector3.zero; selfRotation = Quaternion.identity; VirtualPhone.SetActive(false); VideoCanvas.gameObject.SetActive(true); StatusText.gameObject.SetActive(false); uiMode = UIMode.Default; LoggingManager.Log("Calibration Ended"); } else if (argument == "fine") { uiMode = UIMode.FineCalibration; LoggingManager.Log("Fine Calibration Started"); StatusText.text = "Calibrating (Fine)"; StatusText.gameObject.SetActive(true); VirtualPhone.SetActive(false); VideoCanvas.gameObject.SetActive(true); } else if (argument == "store") { Transform a = new GameObject().transform; a.position = calibrationPosition; a.rotation = calibrationRotation; Transform b = new GameObject().transform; b.position = lastPosition; b.rotation = lastRotation; correspondences.Add(new Tuple <Transform, Transform>(a, b)); double averageRotationX = 0, averageRotationY = 0; foreach (var corr in correspondences) { var target = corr.Item1; var actual = corr.Item2; float diff = target.eulerAngles.y - actual.eulerAngles.y; averageRotationX += Math.Cos(diff * Math.PI / 180); averageRotationY += Math.Sin(diff * Math.PI / 180); } float averageRotation = (float)(Math.Atan2(averageRotationY, averageRotationX) * 180.0 / Math.PI); worldRotation = Quaternion.Euler(0, averageRotation, 0); Vector3 averageTranslation = Vector3.zero; foreach (var corr in correspondences) { var target = corr.Item1.position; var actual = corr.Item2.position; actual = worldRotation * actual; averageTranslation += target - actual; } averageTranslation /= correspondences.Count; worldTranslation = averageTranslation; LoggingManager.Log("World rotation: " + averageRotation + ", translation: " + worldTranslation); //// compute the centroids of the correspondence points and use them to set the translation //Vector3 centroid = new Vector3(0, 0, 0), targetCentroid = new Vector3(0, 0, 0); //foreach (var corr in correspondences) //{ // targetCentroid += corr.Item1; // centroid += corr.Item2; //} //centroid /= correspondences.Count; //targetCentroid /= correspondences.Count; //worldTranslation = targetCentroid - centroid; //worldOrigin = targetCentroid; //// compute the rotation of the correspondences relative to the centroids and use them to set the rotation //float averageRotation = 0; //foreach (var corr in correspondences) //{ // Vector2 target = new Vector2(corr.Item1.x - targetCentroid.x, corr.Item1.z - targetCentroid.z); // Vector2 actual = new Vector2(corr.Item2.x - centroid.x, corr.Item2.z - centroid.z); // double angle = (float)Math.Acos((target.x * actual.x + target.y * actual.y) / (target.magnitude * actual.magnitude)); // angle *= 180.0 / Math.PI; // if (angle > 180) angle -= 360; // averageRotation += (float)angle; //} //averageRotation /= correspondences.Count; //worldRotation = Quaternion.Euler(0, averageRotation2, 0); // move the virtual phone target VirtualPhone.transform.rotation = Quaternion.identity; VirtualPhone.transform.Rotate(Vector3.right, -60); VirtualPhone.transform.position = Camera.main.transform.position + new Vector3(0, -0.1f, 0.5f); float rotation = calibrationInitRotation + correspondences.Count * 45; while (rotation >= 360) { rotation -= 360; } VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.up, rotation); //VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.right, rand.Next(20) - 10); calibrationPosition = VirtualPhone.transform.position; calibrationRotation = VirtualPhone.transform.rotation; } } else if (command == "scale") { float value = float.Parse(argument); // Locate pivot point for scaling by raycasting from the camera to the canvas RaycastHit hit; Vector3 pivot = VideoCanvas.transform.position; if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit)) { Transform objectHit = hit.transform; Vector3 hitPoint3D = hit.point; //Vector3 hitPoint2D = VideoCanvas.transform.TransformPoint(hit.point); pivot = hitPoint3D; } // Apply scale factor double scaleX = VideoCanvas.transform.localScale.x * value; double scaleY = VideoCanvas.transform.localScale.y * value; if (scaleX < videoDefaultScaleX) { scaleX = videoDefaultScaleX; } if (scaleY < videoDefaultScaleY) { scaleY = videoDefaultScaleY; } VideoCanvas.transform.localScale = new Vector3((float)scaleX, (float)scaleY, 1); // update position / offset depending on current mode Vector3 offset = (float)(value - 1) * (pivot - VideoCanvas.transform.position); switch (attachmentMode) { case Attachment.Phone: phoneOffset -= offset; break; case Attachment.Self: selfOffset -= offset; break; case Attachment.World: VideoCanvas.transform.position -= offset; break; } //LoggingManager.Log("Updated offset by (" + offset.x + ", " + offset.y + ", " + offset.z + ")"); //LoggingManager.Log("Scaled by " + value); } else if (command == "pan") { var values = Regex.Match(argument, "\\{\"?x\"?\\: ?([0-9-.e]+), ?\"?y\"?\\: ?([0-9-.e]+), ?\"?touches\"?\\: ?([0-9]+)\\}"); bool success = false; float x = 0, y = 0; int touches = 0; if (values != null && values.Success) { string xStr = values.Groups.Count > 1 ? values.Groups[1].Value : null; string yStr = values.Groups.Count > 2 ? values.Groups[2].Value : null; string tStr = values.Groups.Count > 3 ? values.Groups[3].Value : null; try { x = xStr == null ? 0 : float.Parse(xStr); y = yStr == null ? 0 : float.Parse(yStr); touches = tStr == null ? 0 : int.Parse(tStr); success = true; } catch { LoggingManager.LogError("Bad argument: " + xStr + ", " + yStr + ", " + tStr); } } if (uiMode == UIMode.FineCalibration) { if (success) { if (touches == 1) { Vector3 translation = new Vector3(x * 5, y * 5, 0); worldTranslation += VideoCanvas.transform.TransformVector(translation); //LoggingManager.Log("Set translation: " + worldTranslation.x + ", " + worldTranslation.y); } else if (touches == 2) { Vector3 translation = new Vector3(0, 0, y / 2000); worldTranslation += VideoCanvas.transform.TransformVector(translation); worldRotation = Quaternion.Euler(0, worldRotation.eulerAngles.y + x / 10, 0); //LoggingManager.Log("Set rotation: " + worldRotation.eulerAngles.y); } } } else if (imageFrozen) { if (success && touches == 1) { Vector3 translation = new Vector3(x * 5, y * 5, 0); switch (attachmentMode) { case Attachment.Phone: phoneOffset += VideoCanvas.transform.TransformVector(translation); break; case Attachment.Self: selfOffset += VideoCanvas.transform.TransformVector(translation); break; case Attachment.World: VideoCanvas.transform.position += VideoCanvas.transform.TransformVector(translation); break; } } } } else if (command == "attach") { if (argument == "self") { attachmentMode = Attachment.Self; positioningMode = Positioning.Fixed; selfOffset = Vector3.zero; selfRotation = Quaternion.identity; } else if (argument == "world") { attachmentMode = Attachment.World; } else if (argument == "phone") { attachmentMode = Attachment.Phone; positioningMode = Positioning.Fixed; phoneOffset = Vector3.zero; phoneRotation = Quaternion.identity; VideoCanvas.transform.rotation = lastCorrectedRotation; VideoCanvas.transform.position = lastCorrectedPosition; } } else if (command == "positioning") { if (argument == "start") { //if (attachmentMode == Attachment.Phone) //{ // VideoCanvas.transform.rotation = lastCorrectedRotation; // VideoCanvas.transform.position = lastCorrectedPosition; // phoneOffset = Vector3.zero; // phoneRotation = Quaternion.identity; //} positioningMode = Positioning.Active; } else if (argument == "stop") { positioningMode = Positioning.Fixed; } } else if (command == "frozen") { if (argument == "true") { imageFrozen = true; } else { imageFrozen = false; } } } } catch { LoggingManager.LogError("Couldn't parse command: " + message); } }, false); }; NetworkManager.ImageDecoded += (byte[] image, int width, int height) => { UnityEngine.WSA.Application.InvokeOnAppThread(() => { // TODO: check if resolution is changing, adjust zoom level to maintain same size //if(VideoFrame.texture != null && (VideoFrame.texture.width != width || VideoFrame.texture.height != height)) //{ // float scaleChange = (float)width / VideoFrame.texture.width; // VideoCanvas.transform.localScale = new Vector3(VideoFrame.transform.localScale.x * scaleChange, VideoFrame.transform.localScale.y * scaleChange, 1); //} ShowImage(VideoFrame, image, width, height); }, false); }; }
static void Main(string[] args) { while (MainLoop.ActiveLoop) { MainLoop.InitDefaultGraphicContext(1440, 900, "Asteroids"); MainGraphic.CreateShaderProgram("SpriteProgram", ShaderSort.SPRITE); MainGraphic.CreateShaderProgram("PolyProgram", ShaderSort.POLY); #region Modules //Player GraphicModule playerModule = new GraphicModule("PolyProgram", 1, Color.Red); playerModule.CreateCustomShader(new Vector3[] { new Vector3(0, -25, 0), new Vector3(0, 25, 0), new Vector3(50, 0, 0) }, new Vector3[] { new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0) }); TexturedGraphicModule playerModule2 = new TexturedGraphicModule("SpriteProgram"); playerModule2.CreateCustomShader(new Vector3[] { new Vector3(-50, -50, 0), new Vector3(-50, 50, 0), new Vector3(50, 50, 0), new Vector3(50, -50, 0) }, "Textures\\Player.png"); //Bullet GraphicModule bulletModule = new GraphicModule("PolyProgram", 10, Color.White); bulletModule.CreateRandomShader(13); TexturedGraphicModule bulletModule2 = new TexturedGraphicModule("SpriteProgram"); bulletModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 10, 0), new Vector3(20, 10, 0), new Vector3(20, 0, 0) }, "Textures\\bullet.png"); Prototype.CreatePrototypeOfGraphicModule("bulletModule", bulletModule2); //UFO GraphicModule ufoModule = new GraphicModule("PolyProgram", 25, Color.Green); ufoModule.CreateRandomShader(5); TexturedGraphicModule ufoModule2 = new TexturedGraphicModule("SpriteProgram"); ufoModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 30, 0), new Vector3(30, 30, 0), new Vector3(30, -30, 0) }, "Textures\\Ufo.png"); Prototype.CreatePrototypeOfGraphicModule("ufoModule", ufoModule2); //Asteroid_BIG GraphicModule asteroidModule = new GraphicModule("PolyProgram", 50, Color.Red); asteroidModule.CreateRandomShader(10); TexturedGraphicModule asteroidModule2 = new TexturedGraphicModule("SpriteProgram"); asteroidModule2.CreateCustomShader(new Vector3[] { new Vector3(-50, -50, 0), new Vector3(-50, 50, 0), new Vector3(50, 50, 0), new Vector3(50, -50, 0) }, "Textures\\Asteroid_big.png"); Prototype.CreatePrototypeOfGraphicModule("asteroidBig", asteroidModule2); //Asteroid_small GraphicModule miniAsteroidModule = new GraphicModule("PolyProgram", 30, Color.Blue); miniAsteroidModule.CreateRandomShader(10); TexturedGraphicModule miniAsteroidModule2 = new TexturedGraphicModule("SpriteProgram"); miniAsteroidModule2.CreateCustomShader(new Vector3[] { new Vector3(-15, -15, 0), new Vector3(-15, 15, 0), new Vector3(15, 15, 0), new Vector3(15, -15, 0) }, "Textures\\Asteroid_small.png"); Prototype.CreatePrototypeOfGraphicModule("asteroidSmall", miniAsteroidModule2); //LASER GraphicModule laserModule = new GraphicModule("PolyProgram", 30, Color.Red); laserModule.CreateCustomShader(new Vector3[] { new Vector3(-3, -3, 0), new Vector3(-3, 3, 0), new Vector3(27, 3, 0), new Vector3(27, -3, 0) }, new Vector3[] { new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0) }); TexturedGraphicModule laserModule2 = new TexturedGraphicModule("SpriteProgram"); laserModule2.CreateCustomShader(new Vector3[] { new Vector3(-10, -10, 0), new Vector3(-10, 10, 0), new Vector3(30, 10, 0), new Vector3(30, -10, 0) }, "Textures\\laser.png"); Prototype.CreatePrototypeOfGraphicModule("laserModule", laserModule2); //Background TexturedGraphicModule backgroundModule = new TexturedGraphicModule("SpriteProgram"); backgroundModule.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(MainLoop.MonitorWidth, 0, 0), new Vector3(MainLoop.MonitorWidth, MainLoop.MonitorHeight, 0), new Vector3(0, MainLoop.MonitorHeight, 0) }, "Textures\\back_simpled.png"); TexturedGraphicModule backgroundModule2 = new TexturedGraphicModule("SpriteProgram"); backgroundModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(MainLoop.MonitorWidth, 0, 0), new Vector3(MainLoop.MonitorWidth, MainLoop.MonitorHeight, 0), new Vector3(0, MainLoop.MonitorHeight, 0) }, "Textures\\background.png"); #endregion #region GameObject creation ////Background BaseEntity backEntity = new BaseEntity(); backEntity.AddInnerModel(new ExtraGraphicModul(backgroundModule2)); GameObject background = Factory.Build <GameObject>(backgroundModule, backEntity); background.SetPosition(MainLoop.MonitorWidth / 2, MainLoop.MonitorHeight / 2); //Player Object BaseEntity player = new PlayerEntity(2); player.AddInnerModel(new InertMoveModel()); player.AddInnerModel(new OutOfWindowSizeModel()); player.AddInnerModel(new ExtraGraphicModul(playerModule2)); player.DeathEvent += player.OnDeath; player.DeathEvent += () => { MainLoop.StopMainLoop(); if (MessageBox.Show("You are dead. Are you want to play again?", $"You have {MainLoop.Score} scores!", MessageBoxButtons.YesNo) == DialogResult.No) { MainLoop.ActiveLoop = false; } else { MainLoop.Close = false; } }; GameObject playerObject = Factory.Build <GameObject>(playerModule, player); playerObject.Entity.OutOfWindowEvent += playerObject.GoToReverseCoordinates; playerObject.SetPosition(MainLoop.MonitorWidth / 2, MainLoop.MonitorHeight / 2); //Bullet Object BaseEntity bullet = new BulletEntity(5); GameObject bulletObject = Factory.Build <GameObject>(bulletModule, bullet, false); Prototype.CreatePrototypeOfGameObject("bullet", bulletObject); //Ufo Object BaseEntity ufo = new EnemyEntity(2); GameObject ufoObject = Factory.Build <GameObject>(ufoModule, ufo, false); Prototype.CreatePrototypeOfGameObject("ufo", ufoObject); //Asteroid_BIG Object BaseEntity asteroid = new EnemyEntity(2); GameObject asteroidObject = Factory.Build <GameObject>(asteroidModule, asteroid, false); Prototype.CreatePrototypeOfGameObject("asteroid", asteroidObject); //Asteroid_small Object BaseEntity miniAsteroid = new EnemyEntity(4); GameObject miniAsteroidObject = Factory.Build <GameObject>(miniAsteroidModule, miniAsteroid, false); Prototype.CreatePrototypeOfGameObject("miniAsteroid", miniAsteroidObject); //Laser Object BaseEntity laserEntity = new BulletEntity(4); GameObject laserObject = Factory.Build <GameObject>(laserModule, laserEntity, false); Prototype.CreatePrototypeOfGameObject("laser", laserObject); #endregion #region Commands ////Player Move Command up = new Command(() => playerObject.MoveByAngle(0.1)); Command left = new Command(() => playerObject.Rotate(DirectionEnum.LEFT, 0.1)); Command right = new Command(() => playerObject.Rotate(DirectionEnum.RIGHT, 0.1)); //Player Fire bullet Command fire = new Command(() => { var bul = Prototype.CreateCopyOf <GameObject>("bullet"); bul.Entity.DeathEvent += bul.Entity.OnDeath; bul.AddInnerModel(new OutOfWindowSizeModel()); bul.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("bulletModule"))); bul.AddInnerModel(new MoveByAngleModel(playerObject.Entity.XCoordinate, playerObject.Entity.YCoordinate, playerObject.Entity.RenderAngle)); bul.AddInnerModel(new DeadByConditionModel(typeof(EnemyEntity), DeadByConditionType.DEAD_BY_COLLISION)); bul.AddInnerModel(new LifeTimeModel(5)); bul.Entity.OutOfWindowEvent += bul.GoToReverseCoordinates; }); //Create Asteroid Command createAsteroid = new Command(() => { var asr = Prototype.CreateCopyOf <GameObject>("asteroid"); asr.Entity.DeathEvent += asr.Entity.OnDeath; asr.Entity.DeathEvent += () => MainLoop.AddScore(100); asr.Entity.DeathEvent += () => { Random rand = new Random(); Random randMini = new Random(); var count = rand.Next(1, 4); for (int i = 0; i < count; i++) { var mini = Prototype.CreateCopyOf <GameObject>("miniAsteroid"); var value = randMini.NextDouble() * Math.PI * 2; mini.AddInnerModel(new OutOfWindowSizeModel()); mini.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("asteroidSmall"))); mini.AddInnerModel(new MoveByAngleModel(asr.Entity.XCoordinate + 1, asr.Entity.YCoordinate + 1, value)); mini.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION)); mini.Entity.DeathEvent += mini.Entity.OnDeath; mini.Entity.DeathEvent += () => MainLoop.AddScore(50); mini.Entity.OutOfWindowEvent += mini.GoToReverseCoordinates; } }; asr.AddInnerModel(new OutOfWindowSizeModel()); asr.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("asteroidBig"))); asr.AddInnerModel(new MoveByAngleModel(GetRandomAccessiblePositionAndAngle(playerObject).Item1, GetRandomAccessiblePositionAndAngle(playerObject).Item2, GetRandomAccessiblePositionAndAngle(playerObject).Item3)); asr.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION)); asr.Entity.OutOfWindowEvent += asr.GoToReverseCoordinates; }); //Create Ufo Command createUfo = new Command(() => { var ufoCopy = Prototype.CreateCopyOf <GameObject>("ufo"); ufoCopy.Entity.DeathEvent += ufoCopy.Entity.OnDeath; ufoCopy.Entity.DeathEvent += () => MainLoop.AddScore(250); ufoCopy.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("ufoModule"))); ufoCopy.AddInnerModel(new MoveToTargetModel(playerObject)); ufoCopy.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION)); ufoCopy.AddInnerModel(new MoveByAngleModel(GetRandomAccessiblePositionAndAngle(playerObject).Item1, GetRandomAccessiblePositionAndAngle(playerObject).Item2, GetRandomAccessiblePositionAndAngle(playerObject).Item3)); }); //Laser int laserCount = 3; Command fireLaser = new Command(() => { if (laserCount > 0) { var laser = Prototype.CreateCopyOf <GameObject>("laser"); laser.Entity.DeathEvent += laser.Entity.OnDeath; laser.AddInnerModel(new OutOfWindowSizeModel()); laser.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("laserModule"))); laser.AddInnerModel(new MoveByAngleModel(playerObject.Entity.XCoordinate, playerObject.Entity.YCoordinate, playerObject.Entity.RenderAngle)); laser.AddInnerModel(new DeadByConditionModel(typeof(EnemyEntity), DeadByConditionType.IMMORTAL_DEAD_BY_COLLISION)); laser.AddInnerModel(new LifeTimeModel(10)); laser.Entity.OutOfWindowEvent += laser.GoToReverseCoordinates; laserCount--; } }); //Laser respawn Command respawnLaser = new Command(() => { if (laserCount < 3) { laserCount++; } }); //Swap Graphic Command activateExtraModule = new Command(() => { ExtraGraphicModul.SwapGraphicModule(); }); //Bindings CommandHandler.BindKeyToCommand("w", up, false); CommandHandler.BindKeyToCommand("a", left, false); CommandHandler.BindKeyToCommand("d", right, false); CommandHandler.BindKeyToCommand("x", fire); CommandHandler.BindKeyToCommand("z", activateExtraModule); CommandHandler.BindKeyToCommand("q", createAsteroid); CommandHandler.BindKeyToCommand("f", fireLaser); CommandHandler.BindTimerToCommand(0, createAsteroid, 5000); CommandHandler.BindTimerToCommand(1, createUfo, 10000); CommandHandler.BindTimerToCommand(2, respawnLaser, 10000); #endregion //Main loop starts MainLoop.StartMainLoop(); //DIspose stuff playerModule2.Dispose(); asteroidModule2.Dispose(); miniAsteroidModule2.Dispose(); bulletModule2.Dispose(); laserModule2.Dispose(); ufoModule2.Dispose(); backgroundModule.Dispose(); backgroundModule2.Dispose(); CommandHandler.UnbindAll(); MainLogic.FullCleanup(); } }