great info.
frags, applied for the group, will most probably be on the sideline for now until I get a bit familiar with Unity3d.
Good. Not a problem.
Example of a simple game logic. You can use this if you want. I haven't uploaded the game because I think it's not great at all. Still has some bugs. But anyway this is a pretty good basic code to learn Unity3D with. No player movement but some pretty important code stuff in it(such as Raycast). Ask here if you do not understand any bit.:
Javascript
CODE
//materials for circle
var circleMat : Material;
var circlebackslashMat : Material;
var circleforwardslashMat : Material;
var circlehorizontalMat : Material;
var circleverticalMat : Material;
//materials for cross
var crossMat : Material;
var crossbackslashMat : Material;
var crossforwardslashMat : Material;
var crosshorizontalMat : Material;
var crossverticalMat : Material;
//who is playing the round
var playerText: GUIText;
//display who wins
var winStateGUI : GUIText;
static var playerTurn : boolean;
//for randomly placing cross in first round
var counter : int;
counter = 0;
//array to stack the planes
var arrayPlane = new Array();
arrayPlane.length = 9;
//variable to store a random number
var firstSelection : int;
var playerWin : boolean;
playerWin = false;
var AIWin : boolean;
AIWin = false;
function Start(){
//game starts with players turn
playerTurn = true;
turn = 0;
firstSelection = Random.Range(0.0, 8.0);
//assigns all the planes to the array
while (counter < 9){
//planes are named as plane1, plane2 etc, using the string 'plane' with a counter to assign planes
arrayPlane[counter] = GameObject.Find("Plane"+counter);
counter++;
}
}
function Update () {
var mainCamera = FindCamera();
var hitObject = gameObject;
//required to check on object that was hit, raycast hits on plane the player selects
var hitt : RaycastHit;
//state its the players turn
if (playerTurn == true){
playerText.GetComponent("GUIText").text = "Player Turn";
//checks if player selects a plane
if (Input.GetButtonUp ("Fire1")){
//raycast points from the main camera towards where the mouse is pointing. This is an important bit of code for games
if( Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), hitt, 500 ) ) {
//if player selects a plane which is empty
if (hitt.collider.renderer.material.name == "Empty (Instance)") {
hitObject = hitt.collider.gameObject;
//the plane is assigned a circle
hitObject.renderer.material.color.r = 0.1 * Time.deltaTime;
hitObject.renderer.material = circleMat;
//now its the AI turn
playerTurn = false;
}
}
//check if player won
}checkWinState();
}
//AI code goes here
else if (playerWin == false){
AICode();
}
}
//a small function which finds the main camera in a scene
function FindCamera ()
{
if (camera)
return camera;
else
return Camera.main;
}
//AI code need to be made more challenging
function AICode(){
//print its the AI turn now
playerText.GetComponent("GUIText").text = "AI Turn";
checkWinState();
counter = 0;
//AI randomly places cross on its first try
if (firstSelection != 9){
firstPlacement();
}
//its not the first turn for the AI
else{
AICheck();
}
playerTurn = true;
}
//function to check if all squares filled
function checkBoardFull(){
var counterCheck : int;
counterCheck = 0;
while (counterCheck < 9){
if (arrayPlane[counterCheck].renderer.material.name == "Empty (Instance)"){
return false;
}
counterCheck++;
}
return true;
}
function checkWinState(){
//check AI win
if (checkBoardFull()){
winStateGUI.GetComponent("GUIText").text = "Stalemate!";
}
//check horizontally
if (arrayPlane[0].renderer.material.name == arrayPlane[1].renderer.material.name && arrayPlane[0].renderer.material.name == arrayPlane[2].renderer.material.name && arrayPlane[0].renderer.material.name != "Empty (Instance)" && !checkBoardFull){
if (arrayPlane[1].renderer.material.name == "Circle (Instance)"){
arrayPlane[0].renderer.material = circlehorizontalMat;
arrayPlane[1].renderer.material = circlehorizontalMat;
arrayPlane[2].renderer.material = circlehorizontalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[0].renderer.material = crosshorizontalMat;
arrayPlane[1].renderer.material = crosshorizontalMat;
arrayPlane[2].renderer.material = crosshorizontalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
else if (arrayPlane[3].renderer.material.name == arrayPlane[4].renderer.material.name && arrayPlane[3].renderer.material.name == arrayPlane[5].renderer.material.name && arrayPlane[3].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[3].renderer.material.name == "Circle (Instance)"){
arrayPlane[3].renderer.material = circlehorizontalMat;
arrayPlane[4].renderer.material = circlehorizontalMat;
arrayPlane[5].renderer.material = circlehorizontalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[3].renderer.material = crosshorizontalMat;
arrayPlane[4].renderer.material = crosshorizontalMat;
arrayPlane[5].renderer.material = crosshorizontalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
else if (arrayPlane[6].renderer.material.name == arrayPlane[7].renderer.material.name && arrayPlane[6].renderer.material.name == arrayPlane[8].renderer.material.name && arrayPlane[6].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[6].renderer.material.name == "Circle (Instance)"){
arrayPlane[6].renderer.material = circlehorizontalMat;
arrayPlane[7].renderer.material = circlehorizontalMat;
arrayPlane[8].renderer.material = circlehorizontalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[6].renderer.material = crosshorizontalMat;
arrayPlane[7].renderer.material = crosshorizontalMat;
arrayPlane[8].renderer.material = crosshorizontalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
//check vertically
else if (arrayPlane[0].renderer.material.name == arrayPlane[3].renderer.material.name && arrayPlane[0].renderer.material.name == arrayPlane[6].renderer.material.name && arrayPlane[0].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[0].renderer.material.name == "Circle (Instance)"){
arrayPlane[0].renderer.material = circleverticalMat;
arrayPlane[3].renderer.material = circleverticalMat;
arrayPlane[6].renderer.material = circleverticalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[0].renderer.material = crossverticalMat;
arrayPlane[3].renderer.material = crossverticalMat;
arrayPlane[6].renderer.material = crossverticalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
else if (arrayPlane[1].renderer.material.name == arrayPlane[4].renderer.material.name && arrayPlane[1].renderer.material.name == arrayPlane[7].renderer.material.name && arrayPlane[1].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[1].renderer.material.name == "Circle (Instance)"){
arrayPlane[1].renderer.material = circleverticalMat;
arrayPlane[4].renderer.material = circleverticalMat;
arrayPlane[7].renderer.material = circleverticalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[1].renderer.material = crossverticalMat;
arrayPlane[4].renderer.material = crossverticalMat;
arrayPlane[7].renderer.material = crossverticalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
else if (arrayPlane[2].renderer.material.name == arrayPlane[5].renderer.material.name && arrayPlane[2].renderer.material.name == arrayPlane[8].renderer.material.name && arrayPlane[2].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[2].renderer.material.name == "Circle (Instance)"){
arrayPlane[2].renderer.material = circleverticalMat;
arrayPlane[5].renderer.material = circleverticalMat;
arrayPlane[8].renderer.material = circleverticalMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else {
arrayPlane[2].renderer.material = crossverticalMat;
arrayPlane[5].renderer.material = crossverticalMat;
arrayPlane[8].renderer.material = crossverticalMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AiWin = true;
}
}
//check diagonally
else if (arrayPlane[0].renderer.material.name == arrayPlane[4].renderer.material.name && arrayPlane[0].renderer.material.name == arrayPlane[8].renderer.material.name && arrayPlane[0].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[0].renderer.material.name == "Circle (Instance)"){
arrayPlane[0].renderer.material = circlebackslashMat;
arrayPlane[4].renderer.material = circlebackslashMat;
arrayPlane[8].renderer.material = circlebackslashMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else if (arrayPlane[4].renderer.material.name == "cross (Instance)"){
arrayPlane[0].renderer.material = crossbackslashMat;
arrayPlane[4].renderer.material = crossbackslashMat;
arrayPlane[8].renderer.material = crossbackslashMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AiWin = true;
}
}
else if (arrayPlane[2].renderer.material.name == arrayPlane[4].renderer.material.name && arrayPlane[2].renderer.material.name == arrayPlane[6].renderer.material.name && arrayPlane[2].renderer.material.name != "Empty (Instance)"){
if (arrayPlane[2].renderer.material.name == "Circle (Instance)"){
arrayPlane[2].renderer.material = circleforwardslashMat;
arrayPlane[4].renderer.material = circleforwardslashMat;
arrayPlane[6].renderer.material = circleforwardslashMat;
winStateGUI.GetComponent("GUIText").text = "You won!";
playerWin = true;
}
else if (arrayPlane[2].renderer.material.name == "cross (Instance)"){
arrayPlane[2].renderer.material = crossforwardslashMat;
arrayPlane[4].renderer.material = crossforwardslashMat;
arrayPlane[6].renderer.material = crossforwardslashMat;
winStateGUI.GetComponent("GUIText").text = "The AI won!";
AIWin = true;
}
}
}
//this function is to check the random value isn't one that the player has already selected. In essence reassigning a new value if player selected plane
function firstPlacement(){
if (firstSelection != 9){
if (arrayPlane[firstSelection].renderer.material.name == "Empty (Instance)"){
arrayPlane[firstSelection].renderer.material = crossMat;
firstSelection =9;
}
else if (firstSelection +1 == 9){
arrayPlane[firstSelection - 2].renderer.material = crossMat;
firstSelection = 9;
}
else if (firstSelection == 0){
arrayPlane[firstSelection + 1].renderer.material = crossMat;
firstSelection = 9;
}
else {
arrayPlane[firstSelection + 1].renderer.material = crossMat;
firstSelection = 9;
}
}
}
//AI checks if player has two adjacent/winning combination circles
function playerCheck(){
//checking horizontally
if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[1].renderer.material.name == "Circle (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[2].renderer.material.name == "Circle (Instance)" && arrayPlane[1].renderer.material.name == "Empty (Instance)"){
arrayPlane[1].renderer.material = crossMat;
}
else if (arrayPlane[3].renderer.material.name == "circle (Instance)" && arrayPlane[4].renderer.material.name == "circle (Instance)" && arrayPlane[5].renderer.material.name == "Empty (Instance)"){
arrayPlane[5].renderer.material = crossMat;
}
else if (arrayPlane[5].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[3].renderer.material.name == "Empty (Instance)"){
arrayPlane[3].renderer.material = crossMat;
}
else if (arrayPlane[3].renderer.material.name == "Circle (Instance)" && arrayPlane[5].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[7].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[7].renderer.material.name == "Circle (Instance)" && arrayPlane[6].renderer.material.name == "Empty (Instance)"){
arrayPlane[6].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[7].renderer.material.name == "Empty (Instance)"){
arrayPlane[7].renderer.material = crossMat;
}
//checking vertically
else if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[3].renderer.material.name == "Circle (Instance)" && arrayPlane[6].renderer.material.name == "Empty (Instance)"){
arrayPlane[6].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[3].renderer.material.name == "Circle (Instance)" && arrayPlane[0].renderer.material.name == "Empty (Instance)"){
arrayPlane[0].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[3].renderer.material.name == "Empty (Instance)"){
arrayPlane[3].renderer.material = crossMat;
}
else if (arrayPlane[1].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[7].renderer.material.name == "Empty (Instance)"){
arrayPlane[7].renderer.material = crossMat;
}
else if (arrayPlane[7].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[1].renderer.material.name == "Empty (Instance)"){
arrayPlane[1].renderer.material = crossMat;
}
else if (arrayPlane[1].renderer.material.name == "Circle (Instance)" && arrayPlane[7].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "Circle (Instance)" && arrayPlane[5].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[5].renderer.material.name == "Circle (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[5].renderer.material.name == "Empty (Instance)"){
arrayPlane[5].renderer.material = crossMat;
}
//checking diagonally
else if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[0].renderer.material.name == "Empty (Instance)"){
arrayPlane[0].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Circle (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "Circle (Instance)" && arrayPlane[6].renderer.material.name == "Circle (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (!checkBoardFull()){
AIPlaceCross();
}
}
//AI checks if it is has a winning combination
function AICheck(){
if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[1].renderer.material.name == "cross (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[2].renderer.material.name == "cross (Instance)" && arrayPlane[1].renderer.material.name == "Empty (Instance)"){
arrayPlane[1].renderer.material = crossMat;
}
else if (arrayPlane[3].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[5].renderer.material.name == "Empty (Instance)"){
arrayPlane[5].renderer.material = crossMat;
}
else if (arrayPlane[5].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[3].renderer.material.name == "Empty (Instance)"){
arrayPlane[3].renderer.material = crossMat;
}
else if (arrayPlane[3].renderer.material.name == "cross (Instance)" && arrayPlane[5].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[7].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[7].renderer.material.name == "cross (Instance)" && arrayPlane[6].renderer.material.name == "Empty (Instance)"){
arrayPlane[6].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[7].renderer.material.name == "Empty (Instance)"){
arrayPlane[7].renderer.material = crossMat;
}
//checking vertically
else if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[3].renderer.material.name == "cross (Instance)" && arrayPlane[6].renderer.material.name == "Empty (Instance)"){
arrayPlane[6].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[3].renderer.material.name == "cross (Instance)" && arrayPlane[0].renderer.material.name == "Empty (Instance)"){
arrayPlane[0].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[3].renderer.material.name == "Empty (Instance)"){
arrayPlane[3].renderer.material = crossMat;
}
else if (arrayPlane[1].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[7].renderer.material.name == "Empty (Instance)"){
arrayPlane[7].renderer.material = crossMat;
}
else if (arrayPlane[7].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[1].renderer.material.name == "Empty (Instance)"){
arrayPlane[1].renderer.material = crossMat;
}
else if (arrayPlane[1].renderer.material.name == "cross (Instance)" && arrayPlane[7].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "cross (Instance)" && arrayPlane[5].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[5].renderer.material.name == "cross (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[5].renderer.material.name == "Empty (Instance)"){
arrayPlane[5].renderer.material = crossMat;
}
//checking diagonally
else if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[0].renderer.material.name == "Empty (Instance)"){
arrayPlane[0].renderer.material = crossMat;
}
else if (arrayPlane[0].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[8].renderer.material.name == "Empty (Instance)"){
arrayPlane[8].renderer.material = crossMat;
}
else if (arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "cross (Instance)" && arrayPlane[2].renderer.material.name == "Empty (Instance)"){
arrayPlane[2].renderer.material = crossMat;
}
else if (arrayPlane[2].renderer.material.name == "cross (Instance)" && arrayPlane[6].renderer.material.name == "cross (Instance)" && arrayPlane[4].renderer.material.name == "Empty (Instance)"){
arrayPlane[4].renderer.material = crossMat;
}
else{
if (!checkBoardFull()){
playerCheck();
}
}
}
//this code just randomly places cross if AI didn't place cross despite going through the entire AI code. Go dumb and place a cross anywhere.
function AIPlaceCross(){
var randomPlacement : int;
randomPlacement = Random.Range(0.0, 8.0);
while (arrayPlane[randomPlacement].renderer.material.name != "Empty (Instance)"){
randomPlacement = Random.Range(0.0, 8.0);
}
arrayPlane[randomPlacement].renderer.material = crossMat;
}
I'd like to take some time out here to write about Raycasting. Might be helpful to those new to game development. If you ever wondered how your game characters will see or look at things in your game environment/level, or how users can select elements in your game world(like in an RTS, selecting units etc), Raycast is the main method of doing this.
Basically Raycast is a method of drawing a virtual line from one point to another point of the game world. Whatever intersects this line is registered as a hit. Think of the different applications for this. Mouse selection, AI 'seeing' the player character or the level objects, even simulating a weapon firing(such as a sniper rifle) and hitting enemies. This is a very basic game development concept.
In unity, thankfully you already have a raycast function available to you to do all these things. There are a lot of things you can do with raycasts but I'll stick to the basic. Here is the basic workflow of the logic behind using raycast:
QUOTE
DEFINE variable hitObject TYPE RaycastHit
IF left mouse button down THEN
IF Raycast is true THEN
Do whatever you want with hitObject.collider.GameObject
END IF
END IF
RaycastHit is a necessary variable that gets what the raycast hits(well like it says really). Using RaycastHit, you can access the gameobject and manipulate its details(it has to have a collider btw)
Details on Raycast:
http://unity3d.com/support/documentation/S...cs.Raycast.htmlHere is an example bit that is attached to a First Person Controller:
CODE
var hit : RaycastHit;
if (Physics.Raycast (transform.position, transform.forward, hit, 5)){
if (hit.collider.gameObject.tag == "outpostDoor" && doorIsOpen == false && BatteryCollect.charge >= 4){
currentDoor = hit.collider.gameObject;
Door(doorOpenSound, true, "dooropen", currentDoor);
GameObject.Find("BatteryGUI").GetComponent(GUITexture).enabled = false;
}
else if (hit.collider.gameObject.tag == "outpostDoor" && doorIsOpen == false && BatteryCollect.charge < 4){
GameObject.Find ("BatteryGUI").GetComponent(GUITexture).enabled = true;
TextHints.message = "The door seems to need more power..";
TextHints.textOn = true;
}
}
Okay it might be a little hard to read that but you get the idea. The transform.Position that you are passing into Physics.Raycast is the position of the player character, and transform.forward is the direction the raycast will be projected, hit is the RaycastHit variable, and 5 is the length of the raycast(you can make your AI see further etc using this).
This particular example also checks some other conditions that is relevant to that example game. Using hit.collider.gameObject.tag == "blablabla" you can check if the raycast hit a particular object. Just make sure you give that object a proper tag name.
Here is another example that creates a Raycast from the main camera towards the mouse pointer direction:
CODE
var hitt : RaycastHit;
if( Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), hitt, 500 ) ) {
if (hitt.rigidbody) {
Debug.Log(hitt.rigidbody.gameObject);
hitt.rigidbody.gameObject.transform.position.x + 1;
hitObject = hitt.rigidbody.gameObject;
hitObject.renderer.material.color.r = 0.1 * Time.deltaTime;
}
You can use this line:
mainCamera.ScreenPointToRay(Input.mousePosition)
http://unity3d.com/support/documentation/S...PointToRay.htmlTo make raycasts that function as mouse selections/mouse overs etc. camera.ScreenPointToRay basically sends position(based on the camera position) and direction(towards the mouse cursor location) to physics.raycast. Handy if you are making a strategy game or a game that requires users to select stuff. You don't need to use this for users selecting GUI stuff as for that you can use function onMouseDown
http://unity3d.com/support/documentation/S...nMouseDown.htmlAnyway below, I have included an excerpt from Will Goldstones, Unity Game Development Essentials Book on the topic of using Raycast for a shooter(and why use them):
QUOTE
The frame miss
In the example of a gun in a 3D shooter game, ray casting is used to predict the impact of a gunshot when a gun is fired. Because of the speed of an actual bullet,simulating the flight path of a bullet heading toward a target is very difficult to visually represent in a way that would satisfy and make sense to the player. This is down to the frame-based nature of the way in which games are rendered.
If you consider that when a real gun is fired, it takes a tiny amount of time to reach its target—and as far as an observer is concerned it could be said to happen instantly—we can assume that even when rendering over 25 frames of our game per second, the bullet would need to have reached its target within only a few frames.
In the example above, a bullet is fired from a gun. In order to make the bullet realistic, it will have to move at a speed of 500 feet per second. If the frame rate is 25 frames per second, then the bullet moves at 20 feet per frame. The problem with this is a person is about 2 feet in diameter, which means that the bullet will very
likely miss the enemies shown at 5 and 25 feet away that would be hit. This is where prediction comes into play.
Predictive collision detection
Instead of checking for a collision with an actual bullet object, we find out whether a fired bullet will hit its target. By casting a ray forward from the gun object (thus using its forward direction) on the same frame that the player presses the fire button,we can immediately check which objects intersect the ray.
We can do this because rays are drawn immediately. Think of them like a laser pointer—when you switch on the laser, we do not see the light moving forward because it travels at the speed of light—to us it simply appears.
Rays work in the same way, so that whenever the player in a ray-based shooting game presses fire, they draw a ray in the direction that they are aiming. With this ray,they can retrieve information on the collider that is hit. Moreover, by identifying the collider, the game object itself can be addressed and scripted to behave accordingly.
Even detailed information, such as the point of impact, can be returned and used to affect the resultant reaction, for example, causing the enemy to recoil in a particular direction.
In our shooting game example, we would likely invoke scripting to kill or physically repel the enemy whose collider the ray hits, and as a result of the immediacy of rays, we can do this on the frame after the ray collides with, or intersects the enemy collider. This gives the effect of a real gunshot because the reaction is registered immediately.
It is also worth noting that shooting games often use the otherwise invisible rays to render brief visible lines to help with aim and give the player visual feedback, but do not confuse these lines with ray casts because the rays are simply used as a path for line rendering.
Noticed in Company of Heroes how your tanks shells auto lock on the enemy once fired. Well not sure how many people here play CoH but now you know why. If you have any uncertainties, please ask away. Hope this helps someone.
Join the mailing list for more such info.