var stringTarget1:Transform;
var stringTarget2:Transform;
var stringWidth:float = 0.008;

var receiveShadows:boolean = false;
var castShadows:boolean = false;
var stringMaterials:Material[];
var stringColor:Color = Color.white;

var pullTarget:Transform;
var pulledPosition:Vector3;

private var isPull:boolean = false;
private var lineRanderer:LineRenderer;
private var myTransform:Transform;
function Awake() {
    myTransform = transform;
}

function Start() {
    lineRanderer = GetComponent(LineRenderer);
    if (!lineRanderer) {
        lineRanderer = gameObject.AddComponent(LineRenderer);
        lineRanderer.hideFlags = HideFlags.DontSave;
    }
    lineRanderer.materials = stringMaterials;
    lineRanderer.receiveShadows = receiveShadows;
    lineRanderer.castShadows = castShadows;
    lineRanderer.useWorldSpace = false;
    lineRanderer.SetColors(stringColor, stringColor);
    lineRanderer.SetWidth(stringWidth, stringWidth);
    lineRanderer.SetVertexCount(3);
    lineRanderer.SetPosition(0, stringTarget1.localPosition);
    lineRanderer.SetPosition(1, stringRelease());
    lineRanderer.SetPosition(2, stringTarget2.localPosition);
}

function Update() {
    lineRanderer.SetPosition(1, updatePull());
}

private function updatePull():Vector3 {
    if (pullTarget) {
        pulledPosition = myTransform.InverseTransformPoint(pullTarget.position);
        isPull = true;
    } else {
        if (isPull) {
            stringRelease();
        }
    }
    return pulledPosition;
}


function stringRelease():Vector3 {
    pullTarget = null;
    cancelPullQue = true;
    isPull = false;
    pulledPosition = (stringTarget1.localPosition -stringTarget2.localPosition) /2 +stringTarget2.localPosition;
    return pulledPosition;
}

private var cancelPullQue:boolean = false;
function stringPullQueued(target_:Transform, time_:float) {
    cancelPullQue = false;
    yield WaitForSeconds(time_);
    if (!cancelPullQue) {
        pullTarget = target_;
    }
}