Source code:
CollisionTest.cs
using UnityEngine;
using System.Collections;
public class CollisionTest : MonoBehaviour {
public float speed;
public float projectileSize;
public Vector3 targetScale;
public int shots = 10000;
public CollisionDetectionMode detectMethod;
public Transform projectile;
private Transform target;
private Transform spawn;
private int hitCounter = 0;
private int shotCounter = 0;
private bool finished = false;
private bool displayed = false;
private float finishTime = 0f;
private string ratio = "";
// Use this for initialization
void Start () {
target = transform.FindChild("Target");
target.localScale = targetScale;
target.localPosition = Vector3.forward * (projectileSize + targetScale.z +speed +1);
spawn = transform.FindChild("BulletSpawn");
}
// Update is called once per frame
void Update () {
if(shotCounter < shots){
SpawnBullet();
shotCounter++;
} else if (!finished){
finishTime = Time.time;
finished = true;
} else if(finishTime + 2f < Time.time !displayed){
float f_ratio = (hitCounter + 0.0f)/shots;
ratio = f_ratio.ToString();
Debug.Log("HitRatio: " + ratio +"\nSpeed: " + speed + "\nDetection method: " + detectMethod.ToString() + "\nProjectile size: " + projectileSize + "\nTarget scale: " + targetScale);
displayed = true;
}
}
void SpawnBullet(){
Transform bull = (Transform) Transform.Instantiate(projectile, spawn.position +Vector3.forward * Random.value * speed * 0.1f, Quaternion.identity);
bull.rigidbody.velocity = Vector3.forward * speed;
bull.rigidbody.collisionDetectionMode = detectMethod;
bull.localScale = Vector3.one * projectileSize;
Destroy(bull.gameObject, 2f);
}
public void Detected(){
hitCounter++;
}
public bool Displayed{
get{return displayed;}
}
public string Ratio{
get{return ratio;}
}
}
Target.cs:
using UnityEngine;
using System.Collections;
public class Target : MonoBehaviour {
private CollisionTest test;
void Start(){
test = transform.parent.GetComponent<CollisionTest>();
}
void OnCollisionEnter(Collision other){
test.Detected();
Destroy(other.gameObject);
}
}
Multitest.cs
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
public enum testMethod{speed, projectileSize, TargetSize, doubleSize, scale, deformed}
public class Multitest : MonoBehaviour {
public int sampleLength;
public testMethod method;
public int shots;
public float startSpeed;
public float startProjectileSize;
public Vector3 startTargetSize;
public string filename = "filename.txt";
public Transform testPrefab;
private List<CollisionTest> discreteList;
private List<CollisionTest> contList;
private List<CollisionTest> contDynList;
private bool hasWritten = false;
// Use this for initialization
void Start () {
discreteList = new List<CollisionTest>();
contList = new List<CollisionTest>();
contDynList = new List<CollisionTest>();
switch(method){
case testMethod.speed:
MultiCreateSpeed();
break;
case testMethod.projectileSize:
MultiCreatePSize();
break;
case testMethod.TargetSize:
MultiCreateTSize();
break;
case testMethod.doubleSize:
MultiCreateAllSize();
break;
case testMethod.scale:
MultiCreateScale();
break;
case testMethod.deformed:
MultiCreateDeform();
break;
}
}
void Update(){
if(!hasWritten CheckReady()){
switch(method){
case testMethod.speed:
CreateFileSpeed();
break;
case testMethod.projectileSize:
CreateFileProjectileSize();
break;
case testMethod.TargetSize:
CreateFileTargetSize();
break;
case testMethod.doubleSize:
CreateFileSizeRatio();
break;
case testMethod.scale:
CreateFileSizeScale();
break;
case testMethod.deformed:
CreateFileDeform();
break;
}
hasWritten = true;
}
}
bool CheckReady(){
foreach(CollisionTest t in discreteList){
if(t.Displayed == false)
return false;
}
foreach(CollisionTest t in contList)
if(t.Displayed == false)
return false;
foreach(CollisionTest t in contDynList)
if(t.Displayed == false)
return false;
return true;
}
void CreateTest(float s, float psize, Vector3 tscale, CollisionDetectionMode metho, Vector3 pos){
Transform testTransform = (Transform) Transform.Instantiate(testPrefab, pos , Quaternion.identity);
CollisionTest testScript = testTransform.GetComponent<CollisionTest>();
testScript.speed = s;
testScript.projectileSize = psize;
testScript.targetScale = tscale;
testScript.shots = shots;
testScript.detectMethod = metho;
switch (metho){
case CollisionDetectionMode.Discrete:
discreteList.Add(testScript);
break;
case CollisionDetectionMode.Continuous:
contList.Add(testScript);
break;
case CollisionDetectionMode.ContinuousDynamic:
contDynList.Add(testScript);
break;
}
}
void MultiCreateSpeed(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed * (i+1), startProjectileSize, startTargetSize, CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize) * i * 1.2f, 0,0));
CreateTest(startSpeed * (i+1), startProjectileSize, startTargetSize, CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize) * i * 1.2f, Mathf.Max(startTargetSize.x , startProjectileSize) * 1.2f,0));
CreateTest(startSpeed * (i+1), startProjectileSize, startTargetSize, CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize) * i * 1.2f, Mathf.Max(startTargetSize.x , startProjectileSize) * 2 * 1.2f,0));
}
}
void MultiCreatePSize(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed , startProjectileSize* (i+1), startTargetSize, CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize* i) * i * 1.2f+1, 0,0));
CreateTest(startSpeed , startProjectileSize* (i+1), startTargetSize, CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize* i) * i * 1.2f, Mathf.Max(startTargetSize.x , startProjectileSize*sampleLength) * 1.2f,0));
CreateTest(startSpeed , startProjectileSize* (i+1), startTargetSize, CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x , startProjectileSize* i) * i * 1.2f, Mathf.Max(startTargetSize.x , startProjectileSize*sampleLength) * 2 * 1.2f,0));
}
}
void MultiCreateTSize(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed , startProjectileSize, startTargetSize* (i+1), CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x * i , startProjectileSize) * i * 2.2f, 0,0));
CreateTest(startSpeed , startProjectileSize, startTargetSize* (i+1), CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize) * i * 2.2f, Mathf.Max(startTargetSize.x *sampleLength, startProjectileSize) * 1.2f,0));
CreateTest(startSpeed , startProjectileSize, startTargetSize* (i+1), CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize) * i * 2.2f, Mathf.Max(startTargetSize.x *sampleLength, startProjectileSize) * 2 * 1.2f,0));
}
}
void MultiCreateAllSize(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed , startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x * i , startProjectileSize*i) * i * 2.2f+2, 0,0));
CreateTest(startSpeed , startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize*i) * i * 2.2f+2, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 1.2f,0));
CreateTest(startSpeed , startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize*i) * i * 2.2f+2, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 2 * 1.2f,0));
}
}
void MultiCreateScale(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed * (i+1), startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x * i , startProjectileSize*i) * i * 1.2f, 0,0));
CreateTest(startSpeed * (i+1), startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize*i) * i * 1.2f, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 1.2f,0));
CreateTest(startSpeed * (i+1), startProjectileSize*(i+1), startTargetSize* (i+1), CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x *i, startProjectileSize*i) * i * 1.2f, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 2 * 1.2f,0));
}
}
void MultiCreateDeform(){
for(int i = 0; i < sampleLength; i++){
CreateTest(startSpeed , startProjectileSize, startTargetSize +(Vector3.up *startTargetSize.y + Vector3.right * startTargetSize.x) * i, CollisionDetectionMode.Discrete, new Vector3(Mathf.Max(startTargetSize.x + i , startProjectileSize) * i * 1.2f, 0,0));
CreateTest(startSpeed , startProjectileSize, startTargetSize+(Vector3.up *startTargetSize.y + Vector3.right * startTargetSize.x) * i, CollisionDetectionMode.Continuous, new Vector3(Mathf.Max(startTargetSize.x +i, startProjectileSize) * i * 1.2f, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 1.2f,0));
CreateTest(startSpeed , startProjectileSize, startTargetSize+(Vector3.up *startTargetSize.y + Vector3.right * startTargetSize.x) * i, CollisionDetectionMode.ContinuousDynamic, new Vector3(Mathf.Max(startTargetSize.x +i, startProjectileSize) * i * 1.2f, Mathf.Max(startTargetSize.x*sampleLength , startProjectileSize*sampleLength) * 2 * 1.2f,0));
}
}
void CreateFileSpeed(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over speed");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#Projectile size: " + startProjectileSize);
sw.WriteLine("#Target size: " + startTargetSize);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((startSpeed * (i+1))+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
void CreateFileProjectileSize(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over projectile size");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#speed: " + startSpeed);
sw.WriteLine("#Target size: " + startTargetSize);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((startProjectileSize * (i+1))+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
void CreateFileTargetSize(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over target size");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#speed: " + startSpeed);
sw.WriteLine("#Projectile size: " + startProjectileSize);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((startTargetSize.z * (i+1))+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
void CreateFileSizeRatio(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over size ratio");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#speed: " + startSpeed);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((startProjectileSize / startTargetSize.z * i)+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
void CreateFileSizeScale(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over scale");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#speed: " + startSpeed);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((i)+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
void CreateFileDeform(){
if(File.Exists(filename))
{
Debug.Log(filename+ " already exists");
return;
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("#CollisionTest Data");
sw.WriteLine("#####################");
sw.WriteLine("#Ratio over xy length");
sw.WriteLine("#Testlengt: " +shots);
sw.WriteLine("#speed: " + startSpeed);
sw.WriteLine("#z size: " +startTargetSize.z);
for(int i = 0; i < sampleLength; i++){
sw.WriteLine((i *startTargetSize.x)+"\t"+discreteList[i].Ratio+"\t"+contList[i].Ratio+"\t"+contDynList[i].Ratio);
}
sw.Close();
}
}