- Home /
Converting a Javascript Drag and Drop script to C#
I'm trying to figure out how to correctly convert this piece of Javascript to C#. I'm still pretty new to programming, I do have some experience though I can't figure this one out, because I get boatloads of errors I don't understand, even when trying to find these on google.
Here is the original:
var normalCollisionCount = 1;
var moveLimit = .5;
var collisionMoveFactor = .01;
var addHeightWhenClicked = 0.0;
var freezeRotationOnDrag = true;
var cam : Camera;
private var myRigidbody : Rigidbody;
private var myTransform : Transform;
private var canMove = false;
private var yPos : float;
private var gravitySetting : boolean;
private var freezeRotationSetting : boolean;
private var sqrMoveLimit : float;
private var collisionCount = 0;
private var camTransform : Transform;
function Start () {
myRigidbody = rigidbody;
myTransform = transform;
if (!cam) {
cam = Camera.main;
}
if (!cam) {
Debug.LogError("Can't find camera tagged MainCamera");
return;
}
camTransform = cam.transform;
sqrMoveLimit = moveLimit * moveLimit; // Since we're using sqrMagnitude, which is faster than magnitude
}
function OnMouseDown () {
canMove = true;
myTransform.Translate(Vector3.up*addHeightWhenClicked);
gravitySetting = myRigidbody.useGravity;
freezeRotationSetting = myRigidbody.freezeRotation;
myRigidbody.useGravity = false;
myRigidbody.freezeRotation = freezeRotationOnDrag;
yPos = myTransform.position.y;
}
function OnMouseUp () {
canMove = false;
myRigidbody.useGravity = gravitySetting;
myRigidbody.freezeRotation = freezeRotationSetting;
if (!myRigidbody.useGravity) {
myTransform.position.y = yPos-addHeightWhenClicked;
}
}
function OnCollisionEnter () {
collisionCount++;
}
function OnCollisionExit () {
collisionCount--;
}
function FixedUpdate () {
if (!canMove) return;
myRigidbody.velocity = Vector3.zero;
myRigidbody.angularVelocity = Vector3.zero;
myTransform.position.y = yPos;
var mousePos = Input.mousePosition;
var move = cam.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y, camTransform.position.y - myTransform.position.y)) - myTransform.position;
move.y = 0.0;
if (collisionCount > normalCollisionCount) {
move = move.normalized*collisionMoveFactor;
}
else if (move.sqrMagnitude > sqrMoveLimit) {
move = move.normalized*moveLimit;
}
myRigidbody.MovePosition(myRigidbody.position + move);
}
I've done some translating myself first, and then got some help but we couldnt figure it out together either
Here is the translation:
using UnityEngine;
using System.Collections;
public class Vertaling : MonoBehaviour {
public int normalCollisionCount= 1;
public float moveLimit= 0.5f;
public float collisionMoveFactor= 0.01f;
public float addHeightWhenClicked= 0.0f;
public bool freezeRotationOnDrag= true;
Camera cam;
private Rigidbody myRigidbody;
private Transform myTransform;
private bool canMove= false;
private float yPos;
private bool gravitySetting;
private bool freezeRotationSetting;
private float sqrMoveLimit;
private int collisionCount= 0;
private Transform camTransform;
void Start (){
myRigidbody = rigidbody;
myTransform = transform;
if (!cam) {
cam = Camera.main;
}
if (!cam) {
Debug.LogError("Can't find camera tagged MainCamera");
return;
}
camTransform = cam.transform;
sqrMoveLimit = moveLimit * moveLimit;
}
void OnMouseDown (){
canMove = true;
myTransform.Translate(Vector3.up*addHeightWhenClicked);
gravitySetting = myRigidbody.useGravity;
freezeRotationSetting = myRigidbody.freezeRotation;
myRigidbody.useGravity = false;
myRigidbody.freezeRotation = freezeRotationOnDrag;
yPos = myTransform.position.y;
}
void OnMouseUp (){
canMove = false;
myRigidbody.useGravity = gravitySetting;
myRigidbody.freezeRotation = freezeRotationSetting;
if (!myRigidbody.useGravity) {
myTransform.position.y = yPos-addHeightWhenClicked;
}
}
void OnCollisionEnter (){
collisionCount++;
}
void OnCollisionExit (){
collisionCount--;
}
void FixedUpdate (){
if (!canMove) return;
myRigidbody.velocity = Vector3.zero;
myRigidbody.angularVelocity = Vector3.zero;
myTransform.position.y = yPos;
var mousePos= Input.mousePosition;
var move= cam.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y, camTransform.position.y - myTransform.position.y)) - myTransform.position;
move.y = 0.0f;
if (collisionCount > normalCollisionCount) {
move = move.normalized*collisionMoveFactor;
}
else if (move.sqrMagnitude > sqrMoveLimit) {
move = move.normalized*moveLimit;
}
myRigidbody.MovePosition(myRigidbody.position + move);
}
}
I hope some of you guys have the time and patience to help me. Thanks in advance!
Answer by aldonaletto · Nov 10, 2011 at 04:47 PM
Errors found:
1- You must use a new keyword before a Vector3 constructor (constants like Vector3.up don't need it);
2- You can read position.y, but not write to it. position is a property of Transform, and C# doesn't allow writing to individual components of a property - you must copy the property to an auxiliary variable, modify the component and store the variable back in the property.
Javascript takes care of these minor details for us, but C# is more cranky (too cranky for a script language, in my opinion), and its error messages claim for a Rosetta stone to be deciphered. I fixed these errors in the code below:
... void OnMouseUp (){ canMove = false; myRigidbody.useGravity = gravitySetting; myRigidbody.freezeRotation = freezeRotationSetting; if (!myRigidbody.useGravity) { // you can't set y alone in the property position: Vector3 temp = myTransform.position; temp.y = yPos-addHeightWhenClicked; myTransform.position = temp; } }
void OnCollisionEnter (){ collisionCount++; }
void OnCollisionExit (){ collisionCount--; }
void FixedUpdate (){ if (!canMove) return;
myRigidbody.velocity = Vector3.zero;
myRigidbody.angularVelocity = Vector3.zero;
// the same problem here:
Vector3 temp = myTransform.position;
temp.y = yPos;
myTransform.position = temp;
var mousePos= Input.mousePosition;
// you must use new when constructing a Vector3:
var move= cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, camTransform.position.y - myTransform.position.y)) - myTransform.position;
move.y = 0.0f; // move is a variable, not a property, thus this is ok
if (collisionCount > normalCollisionCount) {
move = move.normalized*collisionMoveFactor;
}
else if (move.sqrMagnitude > sqrMoveLimit) {
move = move.normalized*moveLimit;
}
myRigidbody.MovePosition(myRigidbody.position + move);
} } Another common problem in C# is GetComponent: you must use GetComponent<Rigidbody>() instead of GetComponent(Rigidbody) in javascript. Javascript supports both versions, but C# only accepts the first one.
Your answer
![](https://koobas.hobune.stream/wayback/20220613040643im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
convert c# to JavaScript Problem 0 Answers
this script in Javascript?? 0 Answers
Distribute terrain in zones 3 Answers
java to C# 2 Answers
Convert c# to Js? 1 Answer