Here are the examples of the csharp api System.Collections.Generic.List.Add(GameObject) taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
992 Examples
19
Source : G_FpsManager.cs
with MIT License
from 1ZouLTReX1
with MIT License
from 1ZouLTReX1
private void Init()
{
m_graphyManager = transform.root.GetComponentInChildren<GraphyManager>();
m_rectTransform = GetComponent<RectTransform>();
m_fpsGraph = GetComponent<G_FpsGraph>();
m_fpsMonitor = GetComponent<G_FpsMonitor>();
m_fpsText = GetComponent<G_FpsText>();
foreach (Transform child in transform)
{
if (child.parent == transform)
{
m_childrenGameObjects.Add(child.gameObject);
}
}
}
19
Source : G_RttManager.cs
with MIT License
from 1ZouLTReX1
with MIT License
from 1ZouLTReX1
private void Init()
{
m_graphyManager = transform.root.GetComponentInChildren<GraphyManager>();
m_rectTransform = GetComponent<RectTransform>();
m_rttGraph = GetComponent<G_RttGraph>();
m_rttMonitor = GetComponent<G_RttMonitor>();
m_rttText = GetComponent<G_RttText>();
foreach (Transform child in transform)
{
if (child.parent == transform)
{
m_childrenGameObjects.Add(child.gameObject);
}
}
}
19
Source : ProximityDetector.cs
with MIT License
from 39M
with MIT License
from 39M
void Awake() {
proximityWatcherCoroutine = proximityWatcher();
if (TagName != "") {
GameObject[] taggedObjects = GameObject.FindGameObjectsWithTag(TagName);
List<GameObject> targets = new List<GameObject>(taggedObjects.Length + TargetObjects.Length);
for (int t = 0; t < TargetObjects.Length; t++) {
targets.Add(TargetObjects[t]);
}
for (int t = 0; t < taggedObjects.Length; t++) {
targets.Add(taggedObjects[t]);
}
TargetObjects = targets.ToArray();
}
}
19
Source : UnityPointCloudExample.cs
with MIT License
from 734843327
with MIT License
from 734843327
public void Start()
{
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
if (PointCloudPrefab != null)
{
pointCloudObjects = new List<GameObject> ();
for (int i =0; i < numPointsToShow; i++)
{
pointCloudObjects.Add (Instantiate (PointCloudPrefab));
}
}
}
19
Source : GridAcademy.cs
with Apache License 2.0
from A7ocin
with Apache License 2.0
from A7ocin
public override void AcademyReset()
{
foreach (GameObject actor in actorObjs)
{
DestroyImmediate(actor);
}
SetEnvironment();
actorObjs = new List<GameObject>();
HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < players.Length)
{
numbers.Add(Random.Range(0, (int)resetParameters["gridSize"] * (int)resetParameters["gridSize"]));
}
int[] numbersA = Enumerable.ToArray(numbers);
for (int i = 0; i < players.Length; i++)
{
int x = (numbersA[i]) / (int)resetParameters["gridSize"];
int y = (numbersA[i]) % (int)resetParameters["gridSize"];
GameObject actorObj = (GameObject)GameObject.Instantiate(Resources.Load(players[i]));
actorObj.transform.position = new Vector3(x, -0.25f, y);
actorObj.name = players[i];
actorObjs.Add(actorObj);
if (players[i] == "agent")
{
trueAgent.transform.position = actorObj.transform.position;
trueAgent.transform.rotation = actorObj.transform.rotation;
visualAgent = actorObj;
}
}
}
19
Source : DNAPanel.cs
with Apache License 2.0
from A7ocin
with Apache License 2.0
from A7ocin
public void Initialize (DynamicCharacterAvatar Avatar)
{
foreach(GameObject go in CreatedObjects) UMAUtils.DestroySceneObject(go);
CreatedObjects.Clear();
UMADnaBase[] DNA = Avatar.GetAllDNA();
List<DNAHolder> ValidDNA = new List<DNAHolder>();
foreach (UMADnaBase d in DNA)
{
string[] names = d.Names;
float[] values = d.Values;
for (int i=0;i<names.Length;i++)
{
string name = names[i];
if (IsThisCategory(name.ToLower()))
{
ValidDNA.Add(new DNAHolder(name,values[i],i,d));
}
}
}
ValidDNA.Sort( );
foreach(DNAHolder dna in ValidDNA)
{
GameObject go = GameObject.Instantiate(DnaEditor);
go.transform.SetParent(ContentArea.transform);
go.transform.localScale = new Vector3(1f, 1f, 1f);//Set the scale back to 1
DNAEditor de = go.GetComponentInChildren<DNAEditor>();
de.Initialize(dna.name.BreakupCamelCase(),dna.index,dna.dnaBase,Avatar,dna.value);
go.SetActive(true);
CreatedObjects.Add(go);
}
}
19
Source : RandomWeaponGeneratorWindow.cs
with MIT License
from Abdelfattah-Radwan
with MIT License
from Abdelfattah-Radwan
private void LoadreplacedetReferences()
{
templates?.Clear();
weaponBases?.Clear();
stocks?.Clear();
grips?.Clear();
magazines?.Clear();
scopes?.Clear();
barrels?.Clear();
string filePath = Path.Combine("Temp", replacedET_REFERENCES_INSTANCE_IDS_FILE_NAME);
if (File.Exists(filePath))
{
List<int>[] lists = new List<int>[0];
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
lists = new BinaryFormatter().Deserialize(fileStream) as List<int>[];
}
lists[0].ForEach(id => templates?.Add(replacedetDatabase.LoadreplacedetAtPath<WeaponPropertiesTemplate>(replacedetDatabase.GetreplacedetPath(id))));
lists[1].ForEach(id => weaponBases?.Add(replacedetDatabase.LoadreplacedetAtPath<WeaponBase>(replacedetDatabase.GetreplacedetPath(id))));
lists[2].ForEach(id => stocks?.Add(replacedetDatabase.LoadreplacedetAtPath<GameObject>(replacedetDatabase.GetreplacedetPath(id))));
lists[3].ForEach(id => grips?.Add(replacedetDatabase.LoadreplacedetAtPath<GameObject>(replacedetDatabase.GetreplacedetPath(id))));
lists[4].ForEach(id => magazines?.Add(replacedetDatabase.LoadreplacedetAtPath<GameObject>(replacedetDatabase.GetreplacedetPath(id))));
lists[5].ForEach(id => scopes?.Add(replacedetDatabase.LoadreplacedetAtPath<GameObject>(replacedetDatabase.GetreplacedetPath(id))));
lists[6].ForEach(id => barrels?.Add(replacedetDatabase.LoadreplacedetAtPath<GameObject>(replacedetDatabase.GetreplacedetPath(id))));
}
}
19
Source : BaseEventSystem.cs
with Apache License 2.0
from abist-co-ltd
with Apache License 2.0
from abist-co-ltd
public virtual void Register(GameObject listener)
{
// Because components on an object can change during its lifetime, we can't enumerate all handlers on an object
// at this point in time and register them via the new API.
// This forces us to store an object and use ExecuteEvents traversal at time of handling events.
if (eventExecutionDepth == 0)
{
if (!EventListeners.Contains(listener))
{
// Due to how events are sent to game objects, if any of registered handlers sits on a
// registered object it will receive any event preplaceded to this object.
// We need to mark such handlers, so they don't receive their events twice.
// It can be checked in HandleEvent with less code, but this becomes a
// performance bottleneck with many handlers in the system
bool report = false;
foreach (var typeEntry in EventHandlersByType)
{
for (int index = 0; index < typeEntry.Value.Count; index++)
{
var handlerEntry = typeEntry.Value[index];
var comp = handlerEntry.handler as Component;
if (comp != null && comp.gameObject == listener)
{
handlerEntry.parentObjectIsInObjectCollection = true;
typeEntry.Value[index] = handlerEntry;
report = true;
}
}
}
if (report)
{
WarnAboutConflictingApis(listener.name);
}
EventListeners.Add(listener);
}
}
else
{
postponedObjectActions.Add(Tuple.Create(Action.Add, listener));
}
}
19
Source : DebugUIBuilder.cs
with MIT License
from absurd-joy
with MIT License
from absurd-joy
public void Awake()
{
Debug.replacedert(instance == null);
instance = this;
menuOffset = transform.position; // TODO: this is unpredictable/busted
gameObject.SetActive(false);
rig = FindObjectOfType<OVRCameraRig>();
for (int i = 0; i < toEnable.Count; ++i)
{
toEnable[i].SetActive(false);
}
insertPositions = new Vector2[targetContentPanels.Length];
for (int i = 0; i < insertPositions.Length; ++i)
{
insertPositions[i].x = marginH;
insertPositions[i].y = -marginV;
}
insertedElements = new List<RectTransform>[targetContentPanels.Length];
for (int i = 0; i < insertedElements.Length; ++i)
{
insertedElements[i] = new List<RectTransform>();
}
if (uiHelpersToInstantiate)
{
GameObject.Instantiate(uiHelpersToInstantiate);
}
lp = FindObjectOfType<LaserPointer>();
if (!lp)
{
Debug.LogError("Debug UI requires use of a LaserPointer and will not function without it. Add one to your scene, or replacedign the UIHelpers prefab to the DebugUIBuilder in the inspector.");
return;
}
lp.laserBeamBehavior = laserBeamBehavior;
if (!toEnable.Contains(lp.gameObject))
{
toEnable.Add(lp.gameObject);
}
GetComponent<OVRRaycaster>().pointer = lp.gameObject;
lp.gameObject.SetActive(false);
#if UNITY_EDITOR
string scene = SceneManager.GetActiveScene().name;
OVRPlugin.SendEvent("debug_ui_builder",
((scene == "DebugUI") ||
(scene == "DistanceGrab") ||
(scene == "OVROverlay") ||
(scene == "Locomotion")).ToString(),
"sample_framework");
#endif
}
19
Source : OVROverlaySample.cs
with MIT License
from absurd-joy
with MIT License
from absurd-joy
void SimulateLevelLoad()
{
int numToPrint = 0;
for (int p = 0; p < numLoopsTrigger; p++)
{
numToPrint++;
}
Debug.Log("Finished " + numToPrint + " Loops");
Vector3 playerPos = mainCamera.transform.position;
playerPos.y = 0.5f;
// Generate a bunch of blocks, "blocking" the mainthread ;)
for (int j = 0; j < numLevels; j++)
{
for (var i = 0; i < numObjectsPerLevel; i++)
{
var angle = i * Mathf.PI * 2 / numObjectsPerLevel;
float stagger = (i % 2 == 0) ? 1.5f : 1.0f;
var pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * cubeSpawnRadius * stagger;
pos.y = j * heightBetweenItems;
var newInst = Instantiate(prefabForLevelLoadSim, pos + playerPos, Quaternion.idenreplacedy);
var newObjTransform = newInst.transform;
newObjTransform.LookAt(playerPos);
Vector3 newAngle = newObjTransform.rotation.eulerAngles;
newAngle.x = 0.0f;
newObjTransform.rotation = Quaternion.Euler(newAngle);
spawnedCubes.Add(newInst);
}
}
}
19
Source : PathManager.cs
with MIT License
from Adsito
with MIT License
from Adsito
public static void SpawnPath(PathData pathData)
{
Vector3 averageLocation = Vector3.zero;
for (int j = 0; j < pathData.nodes.Length; j++)
averageLocation += pathData.nodes[j];
averageLocation /= pathData.nodes.Length;
GameObject newObject = GameObject.Instantiate(DefaultPath, averageLocation + PathParent.position, Quaternion.idenreplacedy, PathParent);
newObject.name = pathData.name;
var pathNodes = new List<GameObject>();
for (int j = 0; j < pathData.nodes.Length; j++)
{
GameObject newNode = GameObject.Instantiate(DefaultNode, newObject.transform);
newNode.transform.position = pathData.nodes[j] + PathParent.position;
pathNodes.Add(newNode);
}
newObject.GetComponent<PathDataHolder>().pathData = pathData;
}
19
Source : PathDataHolder.cs
with MIT License
from Adsito
with MIT License
from Adsito
public void IncreaseNodesRes()
{
GameObject pathNodeObj = Resources.Load<GameObject>("Paths/PathNode");
int amount = (int)(resolutionFactor * transform.childCount);
if (amount == 0)
return;
int step = transform.childCount / amount;
List<GameObject> newNodes = new List<GameObject>();
for (int i = 0; i < transform.childCount; i += step)
{
if (i + 1 >= transform.childCount)
continue;
Transform current = transform.GetChild(i);
Transform next = transform.GetChild(i+1);
Vector3 pos = (current.position + next.position) / 2;
GameObject newNode = Instantiate(pathNodeObj, pos, Quaternion.idenreplacedy);
newNodes.Add(newNode);
}
int count = 0;
for (int i = 0; i < newNodes.Count; i ++)
{
newNodes[i].transform.parent = transform;
newNodes[i].transform.SetSiblingIndex((i*step)+count+1);
count++;
}
}
19
Source : DebugShowPlanes.cs
with The Unlicense
from aeroson
with The Unlicense
from aeroson
public override void Start()
{
for (int i = 0; i < 6; i++)
{
var go = new GameObject();
gos.Add(go);
var r = go.AddComponent<MeshRenderer>();
r.mesh = Factory.GetMesh("internal/cube.obj");
go.transform.scale = new Vector3(10, 10, 1);
}
}
19
Source : CalendarController.cs
with MIT License
from ahmetozlu
with MIT License
from ahmetozlu
void Start()
{
_calendarInstance = this;
Vector3 startPos = _item.transform.localPosition;
_dateItems.Clear();
_dateItems.Add(_item);
for (int i = 1; i < _totalDateNum; i++)
{
GameObject item = GameObject.Instantiate(_item) as GameObject;
item.name = "Item" + (i + 1).ToString();
item.transform.SetParent(_item.transform.parent);
item.transform.localScale = Vector3.one;
item.transform.localRotation = Quaternion.idenreplacedy;
item.transform.localPosition = new Vector3((i % 7) * 31 + startPos.x, startPos.y - (i / 7) * 25, startPos.z);
_dateItems.Add(item);
}
_dateTime = DateTime.Now;
CreateCalendar();
_calendarPanel.SetActive(false);
}
19
Source : RollerCoaster.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
void Start () {
//just for now, since we must start with one
transform.Find("TrackPiece0").gameObject.GetComponent<TrackPiece>().rollerCoaster = this;
trackPieces.Add(transform.Find("TrackPiece0").gameObject);
//TODO: set tracksize dynamically based on calling the TrackPiece clreplaced
//set track bone size based on scale
trackBoneSize = defaultTrackBoneSize * GameController.instance.scale;
trackWidth = defaultTrackWidth * GameController.instance.scale;
currentTrack = trackPieces[0];
}
19
Source : RollerCoaster.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
public GameObject AddTrackPiece (Vector3 totalAngle, Vector3 modifiedPosition, Vector3 eulerAngles, Vector3 startAngle, Vector3 offset, float percentageOfTrack, int secondCurveStart) {
GameObject newTrackPiece;
if(unusedTrackPieces.Count > 0) {
newTrackPiece = unusedTrackPieces[0];
unusedTrackPieces.RemoveAt(0);
newTrackPiece.SetActive(true);
} else {
newTrackPiece = Instantiate(trackPrefab, transform);
TrackPiece trackPieceClreplaced = newTrackPiece.GetComponent<TrackPiece>();
trackPieceClreplaced.Start();
trackPieceClreplaced.rollerCoaster = this;
}
//reset position and angle before adjusting the track
newTrackPiece.transform.position = Vector3.zero;
newTrackPiece.transform.localEulerAngles = Vector3.zero;
TrackPiece newTrackPieceClreplaced = newTrackPiece.GetComponent<TrackPiece>();
newTrackPieceClreplaced.totalAngle = totalAngle;
trackPieces.Add(newTrackPiece);
//adjust the track
newTrackPieceClreplaced.AdjustTrack(totalAngle, startAngle, percentageOfTrack, secondCurveStart);
//set track rotation (after adjustment to make sure the adjustment process goes well)
newTrackPiece.transform.eulerAngles = eulerAngles;
//subtract offset
newTrackPiece.transform.position = modifiedPosition - offset;
return newTrackPiece;
}
19
Source : RollerCoaster.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
public void RemoveTrackPiece(GameObject trackPiece) {
unusedTrackPieces.Add(trackPiece);
trackPieces.Remove(trackPiece);
trackPiece.SetActive(false);
}
19
Source : CoasterSpawning.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
void Update () {
//print(rightController.GetComponent<TriggerData>().colliding);
GameController gameController = GameController.instance;
RaycastHit groundHit;
bool groundBoxCastCollided = Physics.BoxCast(rightController.transform.position, (options[currentCoaster].GetComponent<BoxCollider>()).size * options[currentCoaster].transform.localScale.x / 2, Vector3.down, out groundHit, Quaternion.Euler(new Vector3(180, 0, 0)));
if (groundBoxCastCollided) {
currentThumbnail.transform.position = new Vector3(rightController.transform.position.x, groundHit.point.y, rightController.transform.position.z);
}
currentThumbnail.transform.eulerAngles = new Vector3(0, rightController.transform.eulerAngles.y, 0);
if (currentMode == 0) {
if (Input.GetAxis("RightTrigger") == 1 && !lastspawned) {
if (groundBoxCastCollided) {
Vector3 spawnPosition = currentThumbnail.transform.position;
float spawnRotation = currentThumbnail.transform.eulerAngles.y;
if (groundHit.collider.gameObject.tag == "Track") {
Vector3 spawnPositionForward = groundHit.collider.gameObject.transform.position + (groundHit.collider.gameObject.transform.forward * ((BoxCollider)groundHit.collider).size.z) * groundHit.collider.gameObject.transform.localScale.x;
Vector3 spawnPositionBackward = groundHit.collider.gameObject.transform.position + ((-groundHit.collider.gameObject.transform.forward) * ((BoxCollider)groundHit.collider).size.z) * groundHit.collider.gameObject.transform.localScale.x;
float distForward = Vector3.Distance(currentThumbnail.transform.position, spawnPositionForward);
float distBackward = Vector3.Distance(currentThumbnail.transform.position, spawnPositionBackward);
if(distForward < distBackward) {
spawnPosition = spawnPositionForward;
} else {
spawnPosition = spawnPositionBackward;
}
spawnRotation = groundHit.collider.gameObject.transform.eulerAngles.y;
}
lastspawned = true;
GameObject newCoaster = Instantiate(options[currentCoaster]);
newCoaster.transform.parent = newCoaster.transform.root;
newCoaster.transform.position = spawnPosition;
newCoaster.transform.eulerAngles = new Vector3(0, spawnRotation, 0);
}
} else if (Input.GetAxis("RightTrigger") != 1) {
lastspawned = false;
}
if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().y > 0.5) {
//change mode
currentMode = 1;
modeText.GetComponent<TextMesh>().text = "Move Mode";
modeText.GetComponent<Animator>().SetTrigger("fade");
currentThumbnail.SetActive(false);
} else if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().y < -0.5) {
//change mode
currentMode = 1;
modeText.GetComponent<TextMesh>().text = "Move Mode";
modeText.GetComponent<Animator>().SetTrigger("fade");
currentThumbnail.SetActive(false);
} else if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().x > 0) {
currentCoaster++;
if (currentCoaster >= options.Length) {
currentCoaster = 0;
}
Destroy(currentThumbnail);
currentThumbnail = Instantiate(thumbnails[currentCoaster]);
//currentThumbnail.transform.parent = thumbnailPlacement.transform;
currentThumbnail.transform.localPosition = Vector3.zero;
currentThumbnail.transform.localEulerAngles = Vector3.zero;
} else if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().x < 0) {
currentCoaster--;
if (currentCoaster < 0) {
currentCoaster = options.Length - 1;
}
Destroy(currentThumbnail);
currentThumbnail = Instantiate(thumbnails[currentCoaster]);
//currentThumbnail.transform.parent = thumbnailPlacement.transform;
currentThumbnail.transform.localPosition = Vector3.zero;
currentThumbnail.transform.localEulerAngles = Vector3.zero;
}
} else if(currentMode == 1) {
TriggerData triggerData = rightController.GetComponent<TriggerData>();
if (triggerData.collidingObjects.Count > 0 && Input.GetAxis("RightTrigger") >= 0.96 && !attachedObjects.Contains(triggerData.collidingObjects[0])) {
triggerData.collidingObjects[0].transform.parent = thumbnailPlacement.transform;
triggerData.collidingObjects[0].GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
attachedObjects.Add(triggerData.collidingObjects[0]);
}
if (attachedObjects.Count > 0 && Input.GetAxis("RightTrigger") == 0) {
attachedObjects[0].transform.parent = transform.root;
print(rightDevice.velocity);
attachedObjects[0].GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
attachedObjects[0].GetComponent<Rigidbody>().AddForce(rightDevice.velocity * 100);
attachedObjects.RemoveAt(0);
}
if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().y > 0.5) {
//change mode
currentMode = 0;
modeText.GetComponent<TextMesh>().text = "Place Mode";
modeText.GetComponent<Animator>().SetTrigger("fade");
currentThumbnail.SetActive(true);
} else if (Input.GetButtonDown("RightTrackpadClick") && gameController.rightController.GetAxis().y < -0.5) {
//change mode
currentMode = 0;
modeText.GetComponent<TextMesh>().text = "Place Mode";
modeText.GetComponent<Animator>().SetTrigger("fade");
currentThumbnail.SetActive(true);
}
}
}
19
Source : TriggerData.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
void OnTriggerEnter(Collider other) {
collidingObjects.Add(other.gameObject);
}
19
Source : ArrowHand.cs
with MIT License
from ajayyy
with MIT License
from ajayyy
private GameObject InstantiateArrow()
{
GameObject arrow = Instantiate( arrowPrefab, arrowNockTransform.position, arrowNockTransform.rotation ) as GameObject;
arrow.name = "Bow Arrow";
arrow.transform.parent = arrowNockTransform;
Util.ResetTransform( arrow.transform );
arrowList.Add( arrow );
while ( arrowList.Count > maxArrowCount )
{
GameObject oldArrow = arrowList[0];
arrowList.RemoveAt( 0 );
if ( oldArrow )
{
Destroy( oldArrow );
}
}
return arrow;
}
19
Source : GroupManager.cs
with MIT License
from AleksandrHovhannisyan
with MIT License
from AleksandrHovhannisyan
void SpawnBoid(float x, float z)
{
Vector3 spawnPoint = new Vector3(x, boidRadius, z);
GameObject newBoid = Instantiate(boidPrefab, spawnPoint, Quaternion.idenreplacedy);
boids.Add(newBoid);
}
19
Source : SpawnOnMap.cs
with MIT License
from alen-smajic
with MIT License
from alen-smajic
void Start()
{
_locations = new Vector2d[_locationStrings.Length];
_spawnedObjects = new List<GameObject>();
for (int i = 0; i < _locationStrings.Length; i++)
{
var locationString = _locationStrings[i];
_locations[i] = Conversions.StringToLatLon(locationString);
var instance = Instantiate(_markerPrefab);
instance.transform.localPosition = _map.GeoToWorldPosition(_locations[i], true);
instance.transform.localScale = new Vector3(_spawnScale, _spawnScale, _spawnScale);
_spawnedObjects.Add(instance);
}
}
19
Source : VoxelTile.cs
with MIT License
from alen-smajic
with MIT License
from alen-smajic
IEnumerator BuildRoutine()
{
var distanceOrderedVoxels = _voxels.OrderBy(x => (_camera.transform.position - x.Position).magnitude).ToList();
for (int i = 0; i < distanceOrderedVoxels.Count; i += _voxelBatchCount)
{
for (int j = 0; j < _voxelBatchCount; j++)
{
var index = i + j;
if (index < distanceOrderedVoxels.Count)
{
var voxel = distanceOrderedVoxels[index];
_instantiatedVoxels.Add(Instantiate(voxel.Prefab, voxel.Position, Quaternion.idenreplacedy, transform) as GameObject);
}
}
yield return null;
}
}
19
Source : PrefabModifier.cs
with MIT License
from alen-smajic
with MIT License
from alen-smajic
public override void Run(VectorEnreplacedy ve, UnityTile tile)
{
if (_options.prefab == null)
{
return;
}
GameObject go = null;
if (_objects.ContainsKey(ve.GameObject))
{
go = _objects[ve.GameObject];
}
else
{
go = Instantiate(_options.prefab);
_prefabList.Add(go);
_objects.Add(ve.GameObject, go);
go.transform.SetParent(ve.GameObject.transform, false);
}
PositionScaleRectTransform(ve, tile, go);
if (_options.AllPrefabsInstatiated != null)
{
_options.AllPrefabsInstatiated(_prefabList);
}
}
19
Source : ReplaceFeatureModifier.cs
with MIT License
from alen-smajic
with MIT License
from alen-smajic
private void SpawnPrefab(VectorEnreplacedy ve, UnityTile tile, Vector2d latLong)
{
GameObject go;
var featureId = ve.Feature.Data.Id;
if (_objects.ContainsKey(featureId))
{
go = _objects[featureId];
go.SetActive(true);
go.transform.SetParent(ve.GameObject.transform, false);
}
else
{
go = Instantiate(_options.prefab);
_prefabList.Add(go);
_objects.Add(featureId, go);
_objectPosition.Add(featureId, latLong);
go.transform.SetParent(ve.GameObject.transform, false);
}
PositionScaleRectTransform(ve, tile, go, latLong);
if (_options.AllPrefabsInstatiated != null)
{
_options.AllPrefabsInstatiated(_prefabList);
}
}
19
Source : SpawnInsideModifier.cs
with MIT License
from alen-smajic
with MIT License
from alen-smajic
private GameObject GetObject(int index, GameObject go)
{
GameObject ob;
if (_pool.Count > 0)
{
ob = _pool.Dequeue();
ob.SetActive(true);
ob.transform.SetParent(go.transform);
}
else
{
ob = ((GameObject)Instantiate(_prefabs[index], go.transform, false));
}
if (_objects.ContainsKey(go))
{
_objects[go].Add(ob);
}
else
{
_objects.Add(go, new List<GameObject>() { ob });
}
return ob;
}
19
Source : NPCspawner.cs
with GNU General Public License v3.0
from AlexandreDoucet
with GNU General Public License v3.0
from AlexandreDoucet
[ContextMenu("GenerateList")]
public void GenerateList()
{
while (npcList.Count > maxNpcOnTrack)
{
if(Application.isEditor)
DestroyImmediate(npcList[npcList.Count - 1]);
else
Destroy(npcList[npcList.Count - 1]);
npcList.RemoveAt(npcList.Count - 1);
}
List<GameObject> holder = new List<GameObject>();
for (int i = 0; i < npcList.Count; i++)
{
if (npcList[i] == null)
{
holder.Add(npcList[i]);
}
}
foreach (GameObject item in holder)
{npcList.Remove(item);}
{
int i = npcList.Count;
for (; i < maxNpcOnTrack; i++)
{ npcList.Add(GenerateNewNPC("NPC_" + npcList.Count)); }
}
}
19
Source : StlFileImporter.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static GameObject[] Instantiate( string stlFile,
float normalSmoothAngleThreshold,
Action<Object> onCreate )
{
var createdParents = new List<GameObject>();
var meshes = Read( stlFile, normalSmoothAngleThreshold );
if ( meshes.Length == 0 ) {
Debug.LogWarning( $"{stlFile} contained 0 meshes." );
return createdParents.ToArray();
}
var filename = new FileInfo( stlFile).Name;
filename = filename.Substring( 0, filename.LastIndexOf( '.' ) );
var parent = meshes.Length > 1 ?
new GameObject( Factory.CreateName( filename ) ) :
null;
if ( parent != null ) {
createdParents.Add( parent );
onCreate?.Invoke( parent );
}
foreach ( var mesh in meshes ) {
var go = new GameObject( Factory.CreateName( filename ) );
var filter = go.AddComponent<MeshFilter>();
var renderer = go.AddComponent<MeshRenderer>();
filter.sharedMesh = mesh;
renderer.sharedMaterial = Rendering.ShapeVisual.DefaultMaterial;
if ( parent != null )
go.transform.parent = parent.transform;
else
createdParents.Add( go );
onCreate?.Invoke( go );
onCreate?.Invoke( filter );
onCreate?.Invoke( renderer );
}
return createdParents.ToArray();
}
19
Source : ConveyorBelt.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public bool Add( GameObject roller )
{
if ( roller == null || m_rollers.Contains( roller ) )
return false;
var rb = roller.GetComponentInParent<RigidBody>();
if ( rb == null )
return false;
// If any previously added TrackWheel component belongs to another
// track/belt we cannot (right now) add this roller to this belt.
var alreadyPresentTrackWheels = roller.GetComponents<TrackWheel>();
if ( alreadyPresentTrackWheels.Length > 0 ) {
// Don't think disabled tracks will appear here.
var tracks = FindObjectsOfType<Track>();
if ( tracks.Any( track => alreadyPresentTrackWheels.Any( wheel => track.Contains( wheel ) ) ) ) {
Debug.LogWarning( $"Roller {roller.name} already has {roller.GetComponents<TrackWheel>().Length} TrackWheel components " +
"belonging to other belt/track instances." );
return false;
}
}
using ( BeginResourceRequests() ) {
var rotationAxisOffset = 0.5f * ( Width - TrackWidth );
for ( int i = 0; i < NumberOfTracks; ++i ) {
var trackWheel = i < alreadyPresentTrackWheels.Length ?
alreadyPresentTrackWheels[ i ] :
AddComponent<TrackWheel>( roller );
trackWheel.Configure( roller,
rotationAxisOffset,
(aName, aModel) =>
{
return ( aModel == TrackWheelModel.Sprocket && aName.StartsWith( "drivtrumma" ) ) ||
( aModel == TrackWheelModel.Idler && aName.StartsWith( "vandtrumma" ) );
} );
rotationAxisOffset -= TrackWidth;
AboutToChange( Tracks[ i ] );
Tracks[ i ].Add( trackWheel );
}
// Destroying leftover TrackWheel components.
for ( int i = NumberOfTracks; i < alreadyPresentTrackWheels.Length; ++i )
DestroyObjectImmediate( alreadyPresentTrackWheels[ i ] );
m_rollers.Add( roller );
}
return true;
}
19
Source : DebugRenderManager.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static void OnEditorDestroy()
{
if ( !HasInstance )
return;
List<GameObject> gameObjectsToDestroy = new List<GameObject>();
foreach ( var node in Instance.Children ) {
OnSelectionProxy selectionProxy = node.GetComponent<OnSelectionProxy>();
if ( selectionProxy != null )
gameObjectsToDestroy.Add( selectionProxy.gameObject );
}
while ( gameObjectsToDestroy.Count > 0 ) {
DestroyImmediate( gameObjectsToDestroy[ gameObjectsToDestroy.Count - 1 ] );
gameObjectsToDestroy.RemoveAt( gameObjectsToDestroy.Count - 1 );
}
}
19
Source : DebugRenderManager.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
protected void Update()
{
UpdateIsActiveForSynchronize();
// When the application is playing we rely on callbacks
// from the objects when they've synchronized their
// transforms.
if ( Application.isPlaying )
return;
// Shapes with inactive game objects will be updated below when we're
// traversing all children.
FindObjectsOfType<Collide.Shape>().ToList().ForEach(
shape => SynchronizeShape( shape )
);
FindObjectsOfType<Constraint>().ToList().ForEach(
constraint => constraint.AttachmentPair.Synchronize()
);
List<GameObject> gameObjectsToDestroy = new List<GameObject>();
foreach ( var node in Children ) {
OnSelectionProxy proxy = node.GetComponent<OnSelectionProxy>();
if ( proxy == null )
continue;
if ( proxy.Target == null )
gameObjectsToDestroy.Add( node );
// FindObjectsOfType will not include the Shape if its game object is inactive.
// We're handling that shape here instead.
else if ( !proxy.Target.activeInHierarchy && proxy.Component is Collide.Shape )
SynchronizeShape( proxy.Component as Collide.Shape );
}
while ( gameObjectsToDestroy.Count > 0 ) {
DestroyImmediate( gameObjectsToDestroy.Last() );
gameObjectsToDestroy.RemoveAt( gameObjectsToDestroy.Count - 1 );
}
}
19
Source : Model.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static Func<string, ResourceType, Object> CreateDefaultResourceLoader( string dataDirectory = "",
Func<string, ResourceType, Object> resourceLoad = null )
{
var isPlayerResource = resourceLoad == null;
if ( !string.IsNullOrEmpty( dataDirectory ) ) {
dataDirectory.Replace( '\\', '/' );
if ( !dataDirectory.EndsWith( "/" ) )
dataDirectory += '/';
}
var loadedInstances = new List<GameObject>();
Func<string, ResourceType, Object> resourceLoader = ( resourceFilename, type ) =>
{
if ( type == ResourceType.FinalizedLoad ) {
loadedInstances.ForEach( instance => Object.DestroyImmediate( instance ) );
loadedInstances = null;
return null;
}
if ( resourceFilename.StartsWith( "package:/" ) )
resourceFilename = dataDirectory + resourceFilename.Substring( "package://".Length );
else if ( !string.IsNullOrEmpty( dataDirectory ) )
resourceFilename = dataDirectory + resourceFilename;
// Makes resourceFilename relative to the application root directory,
// expands any ".." in the path and replaces any \ with /.
resourceFilename = resourceFilename.PrettyPath();
var hasExtension = Path.HasExtension( resourceFilename );
var isStlFile = hasExtension && Path.GetExtension( resourceFilename ).ToLowerInvariant() == ".stl";
var isCollada = hasExtension && !isStlFile && Path.GetExtension( resourceFilename ).ToLowerInvariant() == ".dae";
// STL file we instantiate it and delete them at FinalizeLoad.
if ( isStlFile ) {
var stlInstances = StlFileImporter.Instantiate( resourceFilename );
loadedInstances.AddRange( stlInstances );
return stlInstances.FirstOrDefault();
}
// Remove file extension when using Resources.Load.
else if ( isPlayerResource && hasExtension )
resourceFilename = resourceFilename.Substring( 0, resourceFilename.LastIndexOf( '.' ) );
// Search for .obj file instead of Collada if we're not loading from Resources.
if ( !isPlayerResource &&
!File.Exists( resourceFilename ) &&
isCollada )
resourceFilename = resourceFilename.Substring( 0, resourceFilename.Length - 3 ) + "obj";
var resource = resourceLoad != null ?
resourceLoad( resourceFilename, type ) :
Resources.Load<Object>( resourceFilename );
if ( !isPlayerResource && isCollada && resource != null ) {
var colladaInfo = Utils.ParseColladaInfo( resourceFilename );
var resourceGo = resource as GameObject;
// Model implementation replacedumes Z-up, anything other than that
// has to be transformed.
if ( resourceGo != null && !colladaInfo.IsDefault ) {
var colladaInstance = Object.Instantiate<GameObject>( resourceGo );
if ( colladaInfo.UpAxis == Utils.ColladaInfo.Axis.Y )
colladaInstance.transform.rotation = Quaternion.Euler( -90, 0, 0 ) * colladaInstance.transform.rotation;
else if ( colladaInfo.UpAxis == Utils.ColladaInfo.Axis.X )
colladaInstance.transform.rotation = Quaternion.Euler( -90, 0, 90 ) * colladaInstance.transform.rotation;
loadedInstances.Add( colladaInstance );
resource = colladaInstance;
}
}
return resource;
};
return resourceLoader;
}
19
Source : Find.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static GameObject[] ChildrenList( GameObject gameObject )
{
if ( gameObject == null )
return null;
GameObject root = Find.RootGameObject( gameObject );
RigidBody[] bodies = root.GetComponentsInChildren<RigidBody>();
Collide.Shape[] shapes = root.GetComponentsInChildren<Collide.Shape>();
List<GameObject> gameObjects = new List<GameObject>();
foreach ( var rb in bodies )
gameObjects.Add( rb.gameObject );
foreach ( var shape in shapes )
gameObjects.Add( shape.gameObject );
gameObjects.Add( null );
int indexOfSelected = gameObjects.IndexOf( gameObject );
if ( indexOfSelected > 0 && gameObjects.Count > 1 ) {
GameObject tmp = gameObjects[ 0 ];
gameObjects[ 0 ] = gameObject;
gameObjects[ indexOfSelected ] = tmp;
}
return gameObjects.ToArray();
}
19
Source : Find.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static GameObject[] ChildrenList( GameObject gameObject )
{
if ( gameObject == null )
return null;
GameObject root = Find.RootGameObject( gameObject );
RigidBody[] bodies = root.GetComponentsInChildren<RigidBody>();
Collide.Shape[] shapes = root.GetComponentsInChildren<Collide.Shape>();
List<GameObject> gameObjects = new List<GameObject>();
foreach ( var rb in bodies )
gameObjects.Add( rb.gameObject );
foreach ( var shape in shapes )
gameObjects.Add( shape.gameObject );
gameObjects.Add( null );
int indexOfSelected = gameObjects.IndexOf( gameObject );
if ( indexOfSelected > 0 && gameObjects.Count > 1 ) {
GameObject tmp = gameObjects[ 0 ];
gameObjects[ 0 ] = gameObject;
gameObjects[ indexOfSelected ] = tmp;
}
return gameObjects.ToArray();
}
19
Source : AGXFileImporter.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public static GameObject[] Import( Object[] objects )
{
var prefabs = new List<GameObject>();
foreach ( var obj in objects ) {
var prefab = Import( obj );
if ( prefab != null )
prefabs.Add( prefab );
}
return prefabs.ToArray();
}
19
Source : RuntimeObjects.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
private void Update()
{
gameObject.transform.position = Vector3.zero;
gameObject.transform.rotation = Quaternion.idenreplacedy;
// Change parent before scale is set - otherwise scale will be preserved.
// E.g., move "this" to a parent with scale x, scale will be set,
// parent = null will remove the parent but the scale will be preserved.
// Fix - set scale after set parent.
gameObject.transform.parent = null;
gameObject.transform.localScale = Vector3.one;
List<GameObject> rootsToRemove = new List<GameObject>();
foreach ( Transform rootTransform in transform ) {
rootTransform.position = Vector3.zero;
rootTransform.rotation = Quaternion.idenreplacedy;
rootTransform.localScale = Vector3.one;
if ( rootTransform.childCount == 0 )
continue;
var selectionProxy = rootTransform.GetChild( 0 ).GetComponent<Utils.OnSelectionProxy>();
if ( selectionProxy == null || selectionProxy.Component == null )
rootsToRemove.Add( rootTransform.gameObject );
}
foreach ( var kvp in m_potentiallyDeletedParents ) {
if ( kvp.Key != null )
continue;
var rootTransform = transform.Find( kvp.Value );
if ( rootTransform == null )
continue;
if ( !rootsToRemove.Contains( rootTransform.gameObject ) )
rootsToRemove.Add( rootTransform.gameObject );
}
m_potentiallyDeletedParents.Clear();
while ( rootsToRemove.Count > 0 ) {
DestroyImmediate( rootsToRemove.Last() );
rootsToRemove.RemoveAt( rootsToRemove.Count - 1 );
}
if ( transform.childCount == 0 )
DestroyImmediate( gameObject );
}
19
Source : AssetsMenu.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
[MenuItem( "replacedets/AGXUnity/Import/Selected URDF [prefab]...", priority = 550 )]
public static GameObject[] SelectedUrdfFilesAsPrefab()
{
var urdfFilePaths = IO.URDF.Reader.GetSelectedUrdfFiles( true );
var instances = IO.URDF.Reader.Instantiate( urdfFilePaths, null, false );
if ( instances.Length == 0 )
return instances;
var prefabs = new List<GameObject>();
foreach ( var instance in instances ) {
var directory = IO.URDF.Prefab.OpenFolderPanel( $"Prefab and replacedets directory for: {instance.name}" );
if ( string.IsNullOrEmpty( directory ) ) {
Debug.Log( $"Ignoring URDF prefab {instance.name}." );
continue;
}
var model = AGXUnity.IO.URDF.Utils.GetElement<AGXUnity.IO.URDF.Model>( instance );
var prefab = IO.URDF.Prefab.Create( model,
instance,
directory );
if ( prefab != null )
prefabs.Add( prefab );
Object.DestroyImmediate( instance );
}
return prefabs.ToArray();
}
19
Source : DisableCollisionsTool.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
private void HandleSelectedObject( GameObject selected )
{
if ( selected == null )
return;
if ( !m_selected.Contains( selected ) )
m_selected.Add( selected );
EditorUtility.SetDirty( m_mainObject );
}
19
Source : ShapeCreateTool.cs
with Apache License 2.0
from Algoryx
with Apache License 2.0
from Algoryx
public override void OnSceneViewGUI( SceneView sceneView )
{
if ( Parent == null ) {
PerformRemoveFromParent();
return;
}
if ( HandleKeyEscape( true ) )
return;
// NOTE: Waiting for mouse click!
if ( !Manager.HijackLeftMouseClick() )
return;
var hitResults = Utils.Raycast.IntersectChildren( HandleUtility.GUIPointToWorldRay( Event.current.mousePosition ),
Parent,
null,
true );
// Find target. Ignoring shapes.
GameObject selected = null;
for ( int i = 0; selected == null && i < hitResults.Length; ++i ) {
if ( hitResults[ i ].Target.GetComponent<Shape>() == null )
selected = hitResults[ i ].Target;
}
// Single selection mode.
ClearSelection();
if ( selected != null ) {
m_selection.Add( selected );
// TODO HIGHLIGHT: Add multiple.
//SetVisualizedSelection( selected );
}
else
m_buttons.Reset();
// TODO GUI: Why? Force inspector update instead?
EditorUtility.SetDirty( Parent );
}
19
Source : ConvertableEditor.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public override void OnInspectorGUI() {
Convertable c = (Convertable)target;
GUI.color = Color.grey;
if (c.CurrentState < 0) {
GUI.color = Color.red;
}
Animator a = c.GetComponent<Animator>();
if (a == null) {
a = c.gameObject.AddComponent<Animator>();
a.runtimeAnimatorController = Resources.Load("StateAnimController") as RuntimeAnimatorController;
}
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUI.color = Color.white;
EditorGUILayout.LabelField("States:", EditorStyles.miniLabel);
c.DefaultState = EditorGUILayout.IntSlider("Default State", c.DefaultState + 1, 1, 4) - 1;
c.EditorState = EditorGUILayout.IntSlider("Editor State", c.EditorState + 1, 1, 4) - 1;
EditorGUILayout.LabelField("Current state: " + (c.CurrentState + 1).ToString());
if (c.States == null || c.States.Length < 2) {
c.States = new SimObjState[2];
c.States[0] = new SimObjState();
c.States[1] = new SimObjState();
c.States[0].Type = c.GetComponent<SimObj>().Type;
}
// name all state objects for their state
foreach (SimObjState state in c.States) {
if (state.Obj != null) {
// state.Obj.name = state.Type.ToString ();
}
}
List<GameObject> availableItems = new List<GameObject>();
Transform baseTransform = c.transform.Find("Base");
if (baseTransform == null) {
GUI.color = Color.red;
EditorGUILayout.LabelField("MUST HAVE BASE OBJECT!");
} else {
foreach (Transform child in baseTransform) {
availableItems.Add(child.gameObject);
}
List<string> choicesList = new List<string>();
foreach (GameObject availableItem in availableItems) {
choicesList.Add(availableItem.name);
}
string[] choices = choicesList.ToArray();
int stateIndex = 0;
foreach (SimObjState state in c.States) {
GUI.color = Color.white;
if (stateIndex == c.CurrentState) {
GUI.color = Color.Lerp(Color.white, Color.green, 0.5f);
}
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.LabelField("State " + (stateIndex + 1).ToString());
state.Type = (SimObjType)EditorGUILayout.EnumPopup("Type", state.Type);
int stateObjIndex = 0;
if (state.Obj != null) {
for (int i = 0; i < choices.Length; i++) {
if (state.Obj.name.Equals(choices[i])) {
stateObjIndex = i;
break;
}
}
}
stateObjIndex = EditorGUILayout.Popup("Object", stateObjIndex, choices);
if (availableItems.Count > 0) {
state.Obj = availableItems[stateObjIndex];
}
EditorGUILayout.EndVertical();
stateIndex++;
}
}
EditorGUILayout.EndVertical();
GUI.color = Color.grey;
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
GUI.color = Color.white;
EditorGUILayout.LabelField("Utilities:", EditorStyles.miniLabel);
if (baseTransform.childCount == 0 && GUILayout.Button("Create sub-type objects from base")) {
GameObject newBaseObj = new GameObject("Base");
newBaseObj.transform.parent = baseTransform.parent;
newBaseObj.transform.position = baseTransform.position;
newBaseObj.transform.rotation = baseTransform.rotation;
newBaseObj.transform.localScale = baseTransform.localScale;
baseTransform.parent = newBaseObj.transform;
baseTransform.name = c.States[0].Type.ToString();
c.States[0].Obj = baseTransform.gameObject;
GameObject newStateObj = new GameObject("State");
newStateObj.transform.parent = baseTransform.parent;
newStateObj.transform.position = baseTransform.position;
newStateObj.transform.rotation = baseTransform.rotation;
newStateObj.transform.localScale = baseTransform.localScale;
c.States[1].Obj = newStateObj;
}
EditorGUILayout.EndVertical();
EditorUtility.SetDirty(c.gameObject);
EditorUtility.SetDirty(c);
}
19
Source : DroneObjectLauncher.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public GameObject GetGameObject(string objectType, bool randomize, int variation) {
List<GameObject> candidates = new List<GameObject>();
SimObjType target = (SimObjType)Enum.Parse(typeof(SimObjType), objectType);
// Debug.Log(target);
foreach (GameObject go in prefabsToLaunch) {
// Debug.Log(go.GetComponent<SimObjPhysics>().Type);
// does a prefab of objectType exist in the current array of prefabs to spawn?
if (go.GetComponent<SimObjPhysics>().Type == target) {
candidates.Add(go);
}
}
// Figure out which variation to use, if no variation use first candidate found
if (randomize) {
variation = UnityEngine.Random.Range(1, candidates.Count);
}
if (variation != 0) {
variation -= 1;
}
return candidates[variation];
}
19
Source : InstantiatePrefabTest.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public Bounds BoundsOfObject(string objectType, int variation) {
// GameObject topObject = GameObject.Find("Objects");
List<GameObject> candidates = new List<GameObject>();
foreach (GameObject go in prefabs) {
if (go.GetComponent<SimObjPhysics>().Type == (SimObjType)Enum.Parse(typeof(SimObjType), objectType)) {
candidates.Add(go);
}
}
Bounds objBounds = UtilityFunctions.CreateEmptyBounds();
foreach (Renderer r in candidates[variation - 1].GetComponentsInChildren<Renderer>()) {
if (r.enabled) {
objBounds.Encapsulate(r.bounds);
}
}
return objBounds;
}
19
Source : InstantiatePrefabTest.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public SimObjPhysics SpawnObject(string objectType, bool randomize, int variation, Vector3 position, Vector3 rotation, bool spawningInHand, bool ignoreChecks) {
GameObject topObject = GameObject.Find("Objects");
List<GameObject> candidates = new List<GameObject>();
foreach (GameObject go in prefabs) {
// does a prefab of objectType exist in the current array of prefabs to spawn?
if (go.GetComponent<SimObjPhysics>().Type == (SimObjType)Enum.Parse(typeof(SimObjType), objectType)) {
candidates.Add(go);
}
}
// ok time to spawn a sim object!
SimObjPhysics simObj = null;
// Figure out which variation to use, if no variation use first candidate found
if (randomize) {
variation = UnityEngine.Random.Range(1, candidates.Count);
}
if (variation != 0) {
variation -= 1;
}
Quaternion quat = Quaternion.Euler(rotation);
if (ignoreChecks || CheckSpawnArea(candidates[variation].GetComponent<SimObjPhysics>(), position, quat, spawningInHand)) {
GameObject prefab = Instantiate(candidates[variation], position, quat) as GameObject;
if (!ignoreChecks) {
if (UtilityFunctions.isObjectColliding(
prefab,
new List<GameObject>(from agent in GameObject.FindObjectsOfType<BaseAgentComponent>() select agent.gameObject))
) {
Debug.Log("On spawning object the area was not clear despite CheckSpawnArea saying it was.");
prefab.SetActive(false);
return null;
}
}
prefab.transform.SetParent(topObject.transform);
simObj = prefab.GetComponent<SimObjPhysics>();
spawnCount++;
} else {
return null;
}
// ok make sure we did actually spawn something now, and give it an Id number
if (simObj) {
simObj.objectID = objectType + "|" + spawnCount.ToString();
return simObj;
}
return null;
}
19
Source : ExpRoomEditor.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public static List<(SimObjPhysics, string)> AddAllPrefabsAsOnlyChildrenOfObject(
GameObject parent,
bool onlyPickupable,
bool onlyReceptacles,
string tag = ""
) {
List <(SimObjPhysics, string)> sopAndPrefabTuples = new List <(SimObjPhysics, string)>();
string[] allPrefabs = GetAllPrefabs();
int numAdded = 0;
foreach (string prefab in allPrefabs) {
GameObject go = null;
try {
Debug.Log($"Checking {prefab}");
go = (GameObject) replacedetDatabase.LoadMainreplacedetAtPath(prefab);
SimObjPhysics sop = go.GetComponent<SimObjPhysics>();
// if (sop != null && sop.Type.ToString() == "Box" && sop.GetComponent<CanOpen_Object>()) {
if (sop != null) {
bool pickupable = sop.PrimaryProperty == SimObjPrimaryProperty.CanPickup;
bool isReceptacle = Array.IndexOf(
sop.SecondaryProperties,
SimObjSecondaryProperty.Receptacle
) > -1 && sop.ReceptacleTriggerBoxes != null;
if (
(pickupable || !onlyPickupable)
&& (isReceptacle || !onlyReceptacles)
) {
sopAndPrefabTuples.Add((go.GetComponent<SimObjPhysics>(), prefab));
numAdded += 1;
}
}
} catch {
try {
if (go) {
DestroyImmediate(go);
}
} catch {}
Debug.LogWarning($"Prefab {prefab} failed to load.");
}
}
sopAndPrefabTuples = sopAndPrefabTuples.OrderBy(
sopAndPath => (
sopAndPath.Item1.Type.ToString(),
int.Parse("0" + new string(
sopAndPath.Item1.name
.Split('/')
.Last()
.Where(c => char.IsDigit(c))
.ToArray()))
)
).ToList();
Debug.Log(
$"Found {allPrefabs.Length} total prefabs of which {sopAndPrefabTuples.Count} were SimObjPhysics satisfying"
+ $"onlyPickupable=={onlyPickupable} and onlyReceptacles=={onlyReceptacles}."
);
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
// Note that you cannot (unfortunately) combine the two below loops into
// a single loop as doing something like
// foreach (Transform child in parent.transform) {
// DestroyImmediate(child.gameObject);
// }
// Will actually miss a large number of children because the way that looping through
// parent.transform works (deleting while iterating results in missing elements).
List<GameObject> toDestroy = new List<GameObject>();
foreach (Transform child in parent.transform) {
toDestroy.Add(child.gameObject);
}
foreach (GameObject child in toDestroy) {
Debug.Log($"Attempting to destroy {child.gameObject}");
DestroyImmediate(child);
}
if (tag != "") {
tag = $"_{tag}";
}
for (int i = 0; i < sopAndPrefabTuples.Count; i++) {
SimObjPhysics sop = sopAndPrefabTuples[i].Item1;
string path = sopAndPrefabTuples[i].Item2;
string hash = CreateSHA256Hash(path).Substring(0, 8);
GameObject go = (GameObject) PrefabUtility.InstantiatePrefab(sop.gameObject);
SimObjPhysics newSop = go.GetComponent<SimObjPhysics>();
if (onlyReceptacles && sop.Type.ToString() == "Box") {
OpenBoxFlapsMore(newSop);
}
FixBoundingBox(newSop);
go.name = $"{sop.Type.ToString()}{tag}_{hash}";
go.SetActive(false);
go.transform.position = new Vector3(-5f, i * 0.05f, -5f);
go.transform.parent = parent.transform;
sopAndPrefabTuples[i] = (newSop, path);
}
return sopAndPrefabTuples;
}
19
Source : PhysicsSceneManager.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public bool RandomSpawnRequiredSceneObjects(
int seed,
bool spawnOnlyOutside,
int maxPlacementAttempts,
bool staticPlacement,
HashSet<SimObjPhysics> excludedSimObjects,
ObjectTypeCount[] numDuplicatesOfType,
List<SimObjType> excludedReceptacleTypes
) {
#if UNITY_EDITOR
var Masterwatch = System.Diagnostics.Stopwatch.StartNew();
#endif
if (RequiredObjects.Count == 0) {
#if UNITY_EDITOR
Debug.Log("No objects in Required Objects array, please add them in editor");
#endif
return false;
}
// initialize Unity's random with seed
UnityEngine.Random.InitState(seed);
List<SimObjType> TypesOfObjectsPrefabIsAllowedToSpawnIn = new List<SimObjType>();
int HowManyCouldntSpawn = RequiredObjects.Count;
// if we already spawned objects, lets just move them around
if (SpawnedObjects.Count > 0) {
HowManyCouldntSpawn = SpawnedObjects.Count;
Dictionary<SimObjType, List<SimObjPhysics>> typeToObjectList = new Dictionary<SimObjType, List<SimObjPhysics>>();
Dictionary<SimObjType, int> requestedNumDuplicatesOfType = new Dictionary<SimObjType, int>();
// List<SimObjType> listOfExcludedReceptacles = new List<SimObjType>();
HashSet<GameObject> originalObjects = new HashSet<GameObject>(SpawnedObjects);
if (numDuplicatesOfType == null) {
numDuplicatesOfType = new ObjectTypeCount[0];
}
foreach (ObjectTypeCount repeatCount in numDuplicatesOfType) {
SimObjType objType = (SimObjType)System.Enum.Parse(typeof(SimObjType), repeatCount.objectType);
requestedNumDuplicatesOfType[objType] = repeatCount.count;
}
// Now lets go through all pickupable sim objects that are in the current scene
foreach (GameObject go in SpawnedObjects) {
SimObjPhysics sop = null;
sop = go.GetComponent<SimObjPhysics>();
// Add object types in the current scene to the typeToObjectList if not already on it
if (!typeToObjectList.ContainsKey(sop.ObjType)) {
typeToObjectList[sop.ObjType] = new List<SimObjPhysics>();
}
// Add this sim object to the list if the sim object's type matches the key in typeToObjectList
if (!requestedNumDuplicatesOfType.ContainsKey(sop.ObjType) ||
(typeToObjectList[sop.ObjType].Count < requestedNumDuplicatesOfType[sop.ObjType])
) {
typeToObjectList[sop.ObjType].Add(sop);
}
}
// Keep track of the sim objects we are making duplicates of
List<GameObject> gameObjsToPlaceInReceptacles = new List<GameObject>();
// Keep track of the sim objects that have not been duplicated
List<GameObject> unduplicatedSimObjects = new List<GameObject>();
// Ok now lets go through each object type in the dictionary
foreach (SimObjType sopType in typeToObjectList.Keys) {
// we found a matching SimObjType and the requested count of duplicates is bigger than how many of that
// object are currently in the scene
if (requestedNumDuplicatesOfType.ContainsKey(sopType) &&
requestedNumDuplicatesOfType[sopType] > typeToObjectList[sopType].Count
) {
foreach (SimObjPhysics sop in typeToObjectList[sopType]) {
gameObjsToPlaceInReceptacles.Add(sop.gameObject);
}
int numExtra = requestedNumDuplicatesOfType[sopType] - typeToObjectList[sopType].Count;
// let's instantiate the duplicates now
for (int j = 0; j < numExtra; j++) {
// Add a copy of the item to try and match the requested number of duplicates
SimObjPhysics sop = typeToObjectList[sopType][UnityEngine.Random.Range(0, typeToObjectList[sopType].Count - 1)];
SimObjPhysics copy = Instantiate(sop);
copy.name += "_random_copy_" + j;
copy.ObjectID = sop.ObjectID + "_copy_" + j;
copy.objectID = copy.ObjectID;
gameObjsToPlaceInReceptacles.Add(copy.gameObject);
}
} else {
// this object is not one that needs duplicates, so just add it to the unduplicatedSimObjects list
foreach (SimObjPhysics sop in typeToObjectList[sopType]) {
unduplicatedSimObjects.Add(sop.gameObject);
}
}
}
// NOTE: for backwards compatibility with InitialRandomSpawn, this does not use BaseFPSAgentController.systemRandom.
// InitialRandomSpawn is going to be deprecated soon.
System.Random rng = new System.Random(seed);
gameObjsToPlaceInReceptacles.AddRange(unduplicatedSimObjects);
gameObjsToPlaceInReceptacles.Shuffle_(rng);
Dictionary<SimObjType, List<SimObjPhysics>> objTypeToReceptacles = new Dictionary<SimObjType, List<SimObjPhysics>>();
foreach (SimObjPhysics receptacleSop in GatherAllReceptaclesInScene()) {
SimObjType receptType = receptacleSop.ObjType;
if (!excludedReceptacleTypes.Contains(receptacleSop.Type) &&
((!spawnOnlyOutside) || ReceptacleRestrictions.SpawnOnlyOutsideReceptacles.Contains(receptacleSop.ObjType))
) {
if (!objTypeToReceptacles.ContainsKey(receptacleSop.ObjType)) {
objTypeToReceptacles[receptacleSop.ObjType] = new List<SimObjPhysics>();
}
objTypeToReceptacles[receptacleSop.ObjType].Add(receptacleSop);
}
}
InstantiatePrefabTest spawner = gameObject.GetComponent<InstantiatePrefabTest>();
foreach (GameObject gameObjToPlaceInReceptacle in gameObjsToPlaceInReceptacles) {
SimObjPhysics sopToPlaceInReceptacle = gameObjToPlaceInReceptacle.GetComponent<SimObjPhysics>();
if (staticPlacement) {
sopToPlaceInReceptacle.GetComponent<Rigidbody>().isKinematic = true;
}
// if(sopToPlaceInReceptacle.IsBreakable) {
// sopToPlaceInReceptacle.GetComponent<Break>().Unbreakable = true;
// }
if (excludedSimObjects.Contains(sopToPlaceInReceptacle)) {
HowManyCouldntSpawn--;
continue;
}
bool spawned = false;
foreach (SimObjPhysics receptacleSop in IterShuffleSimObjPhysicsDictList(objTypeToReceptacles, rng)) {
List<ReceptacleSpawnPoint> targetReceptacleSpawnPoints;
if(receptacleSop.ContainedGameObjects().Count > 0 && receptacleSop.IsPickupable) {
//this pickupable object already has something in it, skip over it since we currently can't account for detecting bounds of a receptacle + any contained objects
continue;
}
// check if the target Receptacle is an ObjectSpecificReceptacle
// if so, if this game object is compatible with the ObjectSpecific restrictions, place it!
// this is specifically for things like spawning a mug inside a coffee maker
if (receptacleSop.DoesThisObjectHaveThisSecondaryProperty(SimObjSecondaryProperty.ObjectSpecificReceptacle)) {
ObjectSpecificReceptacle osr = receptacleSop.GetComponent<ObjectSpecificReceptacle>();
if (osr.HreplacedpecificType(sopToPlaceInReceptacle.ObjType)) {
// in the random spawn function, we need this additional check because there isn't a chance for
// the physics update loop to fully update osr.isFull() correctly, which can cause multiple objects
// to be placed on the same spot (ie: 2 pots on the same burner)
if (osr.attachPoint.transform.childCount > 0) {
break;
}
// perform additional checks if this is a Stove Burner!
if (receptacleSop.GetComponent<SimObjPhysics>().Type == SimObjType.StoveBurner) {
if (
StoveTopCheckSpawnArea(
sopToPlaceInReceptacle,
osr.attachPoint.transform.position,
osr.attachPoint.transform.rotation,
false) == true
) {
// print("moving object now");
gameObjToPlaceInReceptacle.transform.position = osr.attachPoint.position;
gameObjToPlaceInReceptacle.transform.SetParent(osr.attachPoint.transform);
gameObjToPlaceInReceptacle.transform.localRotation = Quaternion.idenreplacedy;
gameObjToPlaceInReceptacle.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.Discrete;
gameObjToPlaceInReceptacle.GetComponent<Rigidbody>().isKinematic = true;
HowManyCouldntSpawn--;
spawned = true;
break;
}
} else { // for everything else (coffee maker, toilet paper holder, etc) just place it if there is nothing attached
gameObjToPlaceInReceptacle.transform.position = osr.attachPoint.position;
gameObjToPlaceInReceptacle.transform.SetParent(osr.attachPoint.transform);
gameObjToPlaceInReceptacle.transform.localRotation = Quaternion.idenreplacedy;
Rigidbody rb = gameObjToPlaceInReceptacle.GetComponent<Rigidbody>();
rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
rb.isKinematic = true;
HowManyCouldntSpawn--;
spawned = true;
break;
}
}
}
targetReceptacleSpawnPoints = receptacleSop.ReturnMySpawnPoints();
// first shuffle the list so it's random
targetReceptacleSpawnPoints.Shuffle_(rng);
if (spawner.PlaceObjectReceptacle(
targetReceptacleSpawnPoints,
sopToPlaceInReceptacle,
staticPlacement,
maxPlacementAttempts,
90,
true
)) {
HowManyCouldntSpawn--;
spawned = true;
break;
}
}
if (!spawned) {
#if UNITY_EDITOR
Debug.Log(gameObjToPlaceInReceptacle.name + " could not be spawned.");
#endif
// go.GetComponent<SimpleSimObj>().IsDisabled = true;
if (!originalObjects.Contains(gameObjToPlaceInReceptacle)) {
gameObjToPlaceInReceptacle.SetActive(false);
Destroy(gameObjToPlaceInReceptacle);
}
}
}
} else {
/// XXX: add exception in at some point
throw new NotImplementedException();
}
#if UNITY_EDITOR
if (HowManyCouldntSpawn > 0) {
Debug.Log(HowManyCouldntSpawn + " object(s) could not be spawned into the scene!");
}
Masterwatch.Stop();
var elapsed = Masterwatch.ElapsedMilliseconds;
print("total time: " + elapsed);
#endif
SetupScene();
return true;
}
19
Source : UtilityFunctions.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public static Collider[] collidersObjectCollidingWith(
GameObject go,
List<GameObject> ignoreGameObjects = null,
float expandBy = 0.0f,
bool useBoundingBoxInChecks = false
) {
if (ignoreGameObjects == null) {
ignoreGameObjects = new List<GameObject>();
}
ignoreGameObjects.Add(go);
HashSet<Collider> ignoreColliders = new HashSet<Collider>();
foreach (GameObject toIgnoreGo in ignoreGameObjects) {
foreach (Collider c in toIgnoreGo.GetComponentsInChildren<Collider>()) {
ignoreColliders.Add(c);
}
}
HashSet<Collider> collidersSet = new HashSet<Collider>();
int layerMask = 1 << 8 | 1 << 10;
foreach (CapsuleCollider cc in go.GetComponentsInChildren<CapsuleCollider>()) {
foreach (Collider c in PhysicsExtensions.OverlapCapsule(cc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
collidersSet.Add(c);
}
}
}
foreach (BoxCollider bc in go.GetComponentsInChildren<BoxCollider>()) {
if ("BoundingBox" == bc.gameObject.name && (!useBoundingBoxInChecks)) {
continue;
}
foreach (Collider c in PhysicsExtensions.OverlapBox(bc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
collidersSet.Add(c);
}
}
}
foreach (SphereCollider sc in go.GetComponentsInChildren<SphereCollider>()) {
foreach (Collider c in PhysicsExtensions.OverlapSphere(sc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
collidersSet.Add(c);
}
}
}
return collidersSet.ToArray();
}
19
Source : Contains.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public List<GameObject> CurrentlyContainedGameObjects() {
List<GameObject> objs = new List<GameObject>();
BoxCollider b = this.GetComponent<BoxCollider>();
// get center of this box in world space
Vector3 worldCenter = b.transform.TransformPoint(b.center);
// size of this receptacle box, but we need to scale by transform
Vector3 worldHalfExtents = new Vector3(b.size.x * b.transform.lossyScale.x / 2, b.size.y * b.transform.lossyScale.y / 2, b.size.z * b.transform.lossyScale.z / 2);
//////////////////////////////////////////////////
// uncomment to debug "draw" where the OverlapBox goes
// GameObject surrogateGeo = GameObject.CreatePrimitive(PrimitiveType.Cube);
// Destroy(surrogateGeo.GetComponent<Collider>());
// surrogateGeo.name = transform.parent.gameObject + "_dimensions";
// surrogateGeo.transform.position = worldCenter;
// surrogateGeo.transform.rotation = b.transform.rotation;
// surrogateGeo.transform.localScale = worldHalfExtents * 2;
// surrogateGeo.transform.parent = b.transform;
////////////////////////////////////////////////////
// ok now create an overlap box using these values and return all contained objects
foreach (Collider col in Physics.OverlapBox(worldCenter, worldHalfExtents, b.transform.rotation)) {
// ignore triggers
if (col.GetComponentInParent<SimObjPhysics>() && !col.isTrigger) {
// grab reference to game object this collider is part of
SimObjPhysics sop = col.GetComponentInParent<SimObjPhysics>();
// don't add any colliders from our parent object, so things like a
// shelf or drawer nested inside another shelving unit or dresser sim object
// don't contain the object they are nested inside
if (!hasAncestor(this.transform.gameObject, sop.transform.gameObject)) {
// don't add repeat objects in case there were multiple
// colliders from the same object
if (!objs.Contains(sop.transform.gameObject)) {
objs.Add(sop.transform.gameObject);
}
}
}
}
return objs;
}
19
Source : ContinuousMovement.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public static IEnumerator rotateAroundPoint(
PhysicsRemoteFPSAgentController controller,
CollisionListener collisionListener,
Transform updateTransform,
Vector3 rotatePoint,
Quaternion targetRotation,
float fixedDeltaTime,
float degreesPerSecond,
bool returnToStartPropIfFailed = false
) {
bool teleport = (degreesPerSecond == float.PositiveInfinity) && fixedDeltaTime == 0f;
// To figure out how to translate/rotate the undateTransform
// we just create two proxy game object that represent the
// transforms of objects sitting at the updateTransform
// position (fulcrum) and the rotatePoint (wristProxy). The
// wristProxy transform is a child of the fulcrum transform.
// As we rotate the fulcrum transform we thus figure out how the
// updateTransform should be updated by looking at how the
// wristProxy transform has changed.
GameObject fulcrum = new GameObject();
fulcrum.transform.position = rotatePoint;
fulcrum.transform.rotation = updateTransform.rotation;
targetRotation = fulcrum.transform.rotation * targetRotation;
GameObject wristProxy = new GameObject();
wristProxy.transform.parent = fulcrum.transform;
wristProxy.transform.position = updateTransform.position;
wristProxy.transform.rotation = updateTransform.rotation;
List<GameObject> tmpObjects = new List<GameObject>();
tmpObjects.Add(fulcrum);
tmpObjects.Add(wristProxy);
Func<Quaternion, Quaternion, Quaternion> directionFunc = (target, current) => target;
Func<Quaternion, Quaternion, float> distanceFunc = (target, current) => Quaternion.Angle(current, target);
Func<Transform, Quaternion> getRotFunc = (t) => t.rotation;
Action<Transform, Quaternion> setRotFunc = (t, newRotation) => {
t.rotation = newRotation;
updateTransform.position = wristProxy.transform.position;
updateTransform.rotation = newRotation;
};
Func<Transform, Quaternion, Quaternion> nextRotFunc = (t, target) => {
return Quaternion.RotateTowards(t.rotation, target, fixedDeltaTime * degreesPerSecond);
};
if (teleport) {
nextRotFunc = (t, direction) => targetRotation;
}
return finallyDestroyGameObjects(
gameObjectsToDestroy: tmpObjects,
steps: updateTransformPropertyFixedUpdate(
controller: controller,
collisionListener: collisionListener,
moveTransform: fulcrum.transform,
target: targetRotation,
getProp: getRotFunc,
setProp: setRotFunc,
nextProp: nextRotFunc,
getDirection: directionFunc,
distanceMetric: distanceFunc,
fixedDeltaTime: fixedDeltaTime,
returnToStartPropIfFailed: returnToStartPropIfFailed,
epsilon: 1e-3
)
);
}
19
Source : UtilityFunctions.cs
with Apache License 2.0
from allenai
with Apache License 2.0
from allenai
public static Collider firstColliderObjectCollidingWith(
GameObject go,
List<GameObject> ignoreGameObjects = null,
float expandBy = 0.0f,
bool useBoundingBoxInChecks = false
) {
if (ignoreGameObjects == null) {
ignoreGameObjects = new List<GameObject>();
}
ignoreGameObjects.Add(go);
HashSet<Collider> ignoreColliders = new HashSet<Collider>();
foreach (GameObject toIgnoreGo in ignoreGameObjects) {
foreach (Collider c in toIgnoreGo.GetComponentsInChildren<Collider>()) {
ignoreColliders.Add(c);
}
}
int layerMask = 1 << 8 | 1 << 10;
foreach (CapsuleCollider cc in go.GetComponentsInChildren<CapsuleCollider>()) {
if (cc.isTrigger) {
continue;
}
foreach (Collider c in PhysicsExtensions.OverlapCapsule(cc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
return c;
}
}
}
foreach (BoxCollider bc in go.GetComponentsInChildren<BoxCollider>()) {
if (bc.isTrigger || ("BoundingBox" == bc.gameObject.name && (!useBoundingBoxInChecks))) {
continue;
}
foreach (Collider c in PhysicsExtensions.OverlapBox(bc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
return c;
}
}
}
foreach (SphereCollider sc in go.GetComponentsInChildren<SphereCollider>()) {
if (sc.isTrigger) {
continue;
}
foreach (Collider c in PhysicsExtensions.OverlapSphere(sc, layerMask, QueryTriggerInteraction.Ignore, expandBy)) {
if (!ignoreColliders.Contains(c)) {
return c;
}
}
}
return null;
}
19
Source : LoadCustomAssets.cs
with MIT License
from amazingalek
with MIT License
from amazingalek
private void ShootDuck()
{
var duckBody = Instantiate(_duckBody);
duckBody.gameObject.SetActive(true);
duckBody.SetPosition(_playerTransform.position + _playerTransform.forward * 2f);
duckBody.SetRotation(_playerTransform.rotation);
duckBody.SetVelocity(_playerBody.GetVelocity() + _playerTransform.forward * 10f);
_ducks.Add(duckBody.gameObject);
_shootSound.Play();
_saveFile.NumberOfDucks++;
ModHelper.Console.WriteLine($"Ducks shot: {_saveFile.NumberOfDucks}");
ModHelper.Storage.Save(_saveFile, "savefile.json");
}
See More Examples