Search Unity

PlayerColor

Discussion in 'Scripting' started by Custardcs, Aug 30, 2015.

  1. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    Hey I Have been searching all Night, for something to help me and have tired about a million combinations and i cannot seem to get what i am looking for..

    Please mind that i am also new to C#, but any help will be appreciated.

    ugh alright I have a Script Player.cs.
    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. public class Player : MonoBehaviour
    5. {
    6.  
    7.     public string username;
    8.     public bool human;
    9.     public Color userColor = new Color(1,1,1,1);
    10.  
    11.  
    12.  
    13.     // Use this for initialization
    14.     void Start ()
    15.     {
    16.         PlayerColor();
    17.     }
    18.  
    19.     //PlayerColor
    20.     void PlayerColor()
    21.     {
    22.      
    23.     }
    24.                
    25. }
    alright its using color picker to choose a color which ill get the player to choose. but i have created a Material called. "PlayerColor" I created A simple shader Called "S_PlayerColor" and assigned the Material "PlayerColor" to use "S_PlayerColor"

    Just Incase you wanted to see the shader Code.
    Code (CSharp):
    1. Shader "Custom/S_PlayerColor" {
    2.     Properties {
    3.         _Color ("Color", Color) = (1,1,1,1)
    4.         _MainTex ("Albedo (RGB)", 2D) = "white" {}
    5.         _Glossiness ("Smoothness", Range(0,1)) = 0.5
    6.         _Metallic ("Metallic", Range(0,1)) = 0.0
    7.     }
    8.     SubShader {
    9.         Tags { "RenderType"="Opaque" }
    10.         LOD 200
    11.      
    12.         CGPROGRAM
    13.         // Physically based Standard lighting model, and enable shadows on all light types
    14.         #pragma surface surf Standard fullforwardshadows
    15.  
    16.         // Use shader model 3.0 target, to get nicer looking lighting
    17.         #pragma target 3.0
    18.  
    19.         sampler2D _MainTex;
    20.  
    21.         struct Input {
    22.             float2 uv_MainTex;
    23.         };
    24.  
    25.         half _Glossiness;
    26.         half _Metallic;
    27.         fixed4 _Color;
    28.  
    29.         void surf (Input IN, inout SurfaceOutputStandard o) {
    30.             // Albedo comes from a texture tinted by color
    31.             fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    32.             o.Albedo = c.rgb;
    33.             // Metallic and smoothness come from slider variables
    34.             o.Metallic = _Metallic;
    35.             o.Smoothness = _Glossiness;
    36.             o.Alpha = c.a;
    37.         }
    38.         ENDCG
    39.     }
    40.     FallBack "Diffuse"
    41. }
    42.  
    basically I want the Color Value only nothing else so a simple diffuse to be controlled by the player and placed on this material.

    then i can use this material for all 3d models where i have player Color places.
     
  2. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    Please anyone Help me?
     
  3. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    Hey, I have been searching and funneling out but seems i got one thats close.. the only issue is the shader Disconnects on Runtime..

    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. public class Player : MonoBehaviour
    5. {
    6.    
    7.     public string username;
    8.     public bool human;
    9.     public Color userColor = new Color(1,1,1,1);
    10.  
    11.  
    12.  
    13.     // Use this for initialization
    14.     void Start ()
    15.     {
    16.         PlayerColor();
    17.     }
    18.  
    19.     //PlayerColor
    20.     void PlayerColor()
    21.     {
    22.         Renderer rend = GetComponent<Renderer>();
    23.         rend.material.shader = Shader.Find("PlayerColor");
    24.         rend.material.SetColor("_Color", userColor);
    25.         }
    26.        
    27.     }
    28.                  
    This is before i run... you can see everything is assigned..
    beforeruntime.JPG
    At Runtime the S_player Color Disappears..
    runtime.JPG
    But if i drag it back on it is picking up the color that the player selected..
    Capture.JPG
     
  4. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    Oh sorry I must Correct myself. Its Only Changing the Color that the material is assigned to if that material is on another Object it does not change it at all.

    so back tooo square one o_O
     
  5. pixpusher2

    pixpusher2

    Joined:
    Oct 30, 2013
    Posts:
    121
    You can use renderer.sharedMaterial to change the colors for all objects using the same material. However this also permanently changes the default material color in your project, so you need to add extra code to reset the colors to default at beginning of scene.

    Code (CSharp):
    1. //PlayerColor
    2. void PlayerColor()
    3. {
    4.         Renderer rend = GetComponent<Renderer>();
    5.         rend.sharedMaterial.shader = Shader.Find("PlayerColor");
    6.         rend.sharedMaterial.SetColor("_Color", userColor);
    7.         }
    8.      
    9. }
     
  6. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    hey bud, thanks for the reply

    so sharedMaterial is used for everything using that material while material is just the game object applied to it?
    thank you i can see it starts

    Wow thanks Bud i found the problem with the shader...

    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. public class Player : MonoBehaviour
    5. {
    6.    
    7.     public string username;
    8.     public bool human;
    9.     public Color userColor = new Color(1,1,1,1);
    10.  
    11.  
    12.  
    13.     // Use this for initialization
    14.     void Start ()
    15.     {
    16.         PlayerColor();
    17.     }
    18.  
    19.     //PlayerColor
    20.     void PlayerColor()
    21.     {
    22.         Renderer rend = GetComponent<Renderer>();
    23.         rend.sharedMaterial.shader = Shader.Find("Custom/S_PlayerColor"); // this is where the issue was had to add custom.
    24.         rend.sharedMaterial.SetColor("_Color", userColor);
    25.         }
    26.        
    27.     }
    28.                  
     
  7. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    If this object already has the S_PlayerColor material applied to it, why are you doing a shader find at all?
     
  8. Custardcs

    Custardcs

    Joined:
    Aug 26, 2015
    Posts:
    57
    well im new to coding so i assumed it needed it. from what i read on unity help site..

    basic idea is just ill have 10 players max.. each will have a username and pick a team and then finally a color..

    the models i have created... i have 2 materials set one is the texture and the other is the player color which i want to place this one material controlled by the Player and all units will be the same color.